对于基准测试,我需要三种不同的设置(“保持所有”,“保持大小”和“保持不变”),所以我虽然可以使用枚举。然后我看到我需要多次运行一些案例(基准测试使用种子随机),而我原来的枚举非常不灵活。对于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");
}
}
它完全符合我的要求,我可以以最小的开销添加或删除实验。有没有更好的解决方案?
答案 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)
有没有更好的解决方案?
嗯,为什么你首先需要这些重复的枚举值并不是很清楚 - 我怀疑我有一个只是包含逻辑值的枚举,然后使用枚举填充集合反而重复了价值。
另一种选择是使枚举像当前的一样,和是一个更逻辑的枚举,其中“重复”枚举的构造函数引用一个“逻辑”实例代替。
如果您确实想要保留当前结构,我个人会忽略keepSize
和keepAll
部分的推断,而是使用参数化构造函数:
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;
}
}