0

对于基准测试,我需要三个不同的设置(“保留所有”、“保留大小”和“保留任何内容”),所以我虽然可以使用枚举。然后我看到我需要多次运行某些案例(基准测试使用种子随机数)并且我的原始枚举变得非常不灵活。对于Caliper,我需要重复枚举项。在一些失败的尝试使其正确之后,我最终想到了这个 hacky 想法:

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 回答