通常必须使用许多布尔选项配置类。 Java中有哪些建议的方法来指定执行配置?
我可以想出如何将选项传递给班级的4种方法。
使用位掩码。高效,易于使用,但不能组合在一起。通过自动完成其他成员更难找到。受限制。
public static final int A_ENABLED = 1 << 1;
public static final int B_ENABLED = 1 << 2;
使用(内部)参数类。很难创造,太冗长。
public static class Params {
private final boolean enabledA;
private final boolean enabledB;
}
public class MyFunctionality {
private final SomeOtherArguments myDataArguments;
...
private final Params params;
MyFunctionality(SomeOtherArguments myDataArguments, Params params);
}
使用布尔字段作为类的一部分。增加类的详细程度(你必须担心的构造函数中的额外参数)。每次参数更改时都必须修改类的构造函数。在2选项中,只有Params类会改变。
public class MyFunctionality {
private final SomeOtherArguments myDataArguments;
...
private final boolean enabledA;
private final boolean enabledB;
private final boolean enabledC;
private final boolean enabledD;
...
public MyFunctionality(SomeOtherArguments someOtherArguments, boolean enabledA, boolean enabledB, boolean enabledC, boolean enabledD);
}
使用枚举。
public static enum Params {
OPTION_A, OPTION_B
}
您能想到其他更好的方法吗?
答案 0 :(得分:3)
Enums和EnumSet专为此而设计。
class myClass {
public static enum Options {A,B,C};
private EnumSet optionSet = EnumSet.noneOf(Option.class);
public setOption(Option o) {
optionSet.add(o);
}
public setOptions(EnumSet addset) {
optionSet.addAll(addset);
}
}
optionSet包含“set”选项。 EnumSet非常高效,在大多数实现中只使用一个位用于每个枚举元素,并允许在恒定时间内获取和设置。您当然可以将设置选项限制为施工时间。
编辑:您可以同时设置多个选项,例如A和B:
myClassInstance.setOptions(EnumSet.of(A,B));
答案 1 :(得分:2)
另一种方法是持有一套布尔值。它就像位掩码,但可能更容易阅读和调试。
无论如何,我建议你将bitmask或set与enum结合起来。枚举允许更容易地管理和控制可能的值。使用valueOf(String)
方法可以轻松实现配置文件中的读取值。
答案 2 :(得分:0)
这个实现怎么样
class MyFunctionality {
private boolean [] options;
public static final int OPTION1 = 0;
public static final int OPTION2 = 1;
public static final int OPTION3 = 2;
/*Set the default values*/
public static final boolean [] defaultValues = new boolean[3];
static {
defaultValues[OPTION1] = true;
defaultValues[OPTION2] = false;
defaultValues[OPTION3] = true;
}
MyFunctionality(String something, int somethingelse, boolean [] options) {
if(options == null) {
options = defaultValues.clone();
}
this.options = options;
for(boolean value : this.options) {
System.out.println(value);
}
}
public static boolean [] getModelOptions() {
return defaultValues.clone();
}
}
实施班
class MyFunctionImpl {
public static void main(String [] ars) {
boolean [] optionsINeedToSet = MyFunctionality.getModelOptions();
optionsINeedToSet[MyFunctionality.OPTION3] = false;
new MyFunctionality("Try this", 10101, optionsINeedToSet);
new MyFunctionality("Try this", 10101, null);
}
}