类配置中的Java布尔选项

时间:2011-11-01 09:46:35

标签: java class configuration enums options

通常必须使用许多布尔选项配置类。 Java中有哪些建议的方法来指定执行配置?

我可以想出如何将选项传递给班级的4种方法。

  1. 使用位掩码。高效,易于使用,但不能组合在一起。通过自动完成其他成员更难找到。受限制。

    public static final int A_ENABLED = 1 << 1;
    public static final int B_ENABLED = 1 << 2;
    
  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);
    }
    
  3. 使用布尔字段作为类的一部分。增加类的详细程度(你必须担心的构造函数中的额外参数)。每次参数更改时都必须修改类的构造函数。在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);
    }
    
  4. 使用枚举。

    public static enum Params {
        OPTION_A, OPTION_B
    }
    
  5. 您能想到其他更好的方法吗?

3 个答案:

答案 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);
    }
}