0

ベンチマークには、3 つの異なる設定 (「すべて保持」、「サイズを保持」、「何も保持しない」) が必要なので、列挙型を使用することもできます。その後、いくつかのケースを複数回実行する必要があることがわかり (ベンチマークはシードされた Random を使用します)、元の列挙型はかなり柔軟性がなくなりました。Caliperの場合、列挙項目を繰り返す必要があります。適切に作成しようとして何度か失敗した後、次のハックなアイデアにたどり着きました。

private enum Randomization {
    USE_EXAMPLE_1,
    USE_EXAMPLE_2,
    KEEP_EXAMPLE_SIZE_1,
    RANDOM_1,
    RANDOM_2,
    RANDOM_3,
    ;

    final boolean keepAll;
    final boolean keepSize;

    private Randomization() {
        keepAll = name().startsWith("U");
        keepSize = !name().startsWith("R");
    }
}

最小限のオーバーヘッドで実験を追加または削除できます。より良い解決策はありますか?

4

2 に答える 2

1

列挙型にフィールドを持ち、次のようなことを行うことができます。列挙型のインスタンス メソッドは、通常のクラスのようにフィールドにアクセスできます。

private enum Randomization {
    USE_EXAMPLE_1(1),
    USE_EXAMPLE_2(2),
    // ...

    private final int flag;

    Randomization(int flag) {
        this.flag = flag;
    }
}

これにより、潜在的なリファクタリングで の値の名前が変更されるという問題が回避され、ユーザーが名前にenum結び付けられることはありません。

于 2013-08-18T16:59:58.723 に答える
1

より良い解決策はありますか?

そもそもなぜこれらの列挙型の値が繰り返される必要があるのか​​ はあまり明確ではありません.論理値を含む列挙型があり、代わりに繰り返し値を使用してコレクションを作成するのではないかと思います。

別のオプションは、現在のような列挙型、より論理的な列挙型を使用することです。この場合、「反復的な」列挙型のコンストラクターは、代わりに「論理的な」列挙型のインスタンスへの参照を取ります。

本当に現在の構造を保持したい場合は、個人的にkeepSizeandkeepAll部分の推論を捨てて、代わりにパラメーター化されたコンストラクターを使用します。

private enum Randomization {
    USE_EXAMPLE_1(true, true),
    USE_EXAMPLE_2(true, true),
    KEEP_EXAMPLE_SIZE_1(false, true),
    RANDOM_1(false, false),
    RANDOM_2(false, false),
    RANDOM_3(false, false),
    ;

    final boolean keepAll;
    final boolean keepSize;

    private Randomization(boolean keepAll, boolean keepSize) {
        this.keepAll = keepAll;
        this.keepSize = keepSize;
    }
}
于 2013-08-18T17:02:08.420 に答える