2011-11-01 55 views
1

通常必須使用多個布爾選項來配置一個類。 Java中推薦的方法是指定執行配置?類配置中的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 
    } 
    

你能想出其他更好的方法來做到這一點?

回答

3

枚舉和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)); 
+0

它看起來是一個非常好的選擇,但是一個看起來比較好的位掩碼就是它們不那麼冗長。即你可以在一行寫| | B | C,但你會用EnumSet來做到這一點嗎? – Leonid

+0

使用「的」。我編輯了答案來表明這一點。 – DJClayworth

2

另一種方法是持有一組布爾值。它就像位掩碼,但可能更容易閱讀和調試。

無論如何,我建議你結合位掩碼或設置與枚舉。枚舉允許更輕鬆地管理和控制可能的值。使用valueOf(String)方法可以輕鬆實現從配置文件讀取值。

+0

可靠的建議。由於二進制文字和下劃線現在可以在數字中使用,因此在Java 7中Bitmaks也可以更清晰易讀。 –

+0

如果你打算使用枚舉,你可以使用EnumSet。 – DJClayworth

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