这个hacky enum可以改进吗?

时间:2013-08-18 16:55:57

标签: java coding-style

对于基准测试,我需要三种不同的设置(“保持所有”,“保持大小”和“保持不变”),所以我虽然可以使用枚举。然后我看到我需要多次运行一些案例(基准测试使用种子随机),而我原来的枚举非常不灵活。对于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");
    }
}

它完全符合我的要求,我可以以最小的开销添加或删除实验。有没有更好的解决方案?

2 个答案:

答案 0 :(得分:1)

您可以在枚举中添加字段,并执行以下操作。枚举的实例方法可以像通常的类一样访问字段:

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

    private final int flag;

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

这可以避免潜在的重构重命名enum的值并且不会将您绑定到名称的问题。

答案 1 :(得分:1)

  

有没有更好的解决方案?

嗯,为什么你首先需要这些重复的枚举值并不是很清楚 - 我怀疑我有一个只是包含逻辑值的枚举,然后使用枚举填充集合反而重复了价值。

另一种选择是使枚举像当前的一样,是一个更逻辑的枚举,其中“重复”枚举的构造函数引用一个“逻辑”实例代替。

如果您确实想要保留当前结构,我个人会忽略keepSizekeepAll部分的推断,而是使用参数化构造函数:

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;
    }
}