2011-12-26 66 views
1

我有一個名爲ColorConstants類僅僅是定義了一些在我的應用程序中使用public static final Color領域的一類 - 使它容易改變的配色方案等等。我想什麼做的是有兩個方案:倒不是反轉。我想設置這個類,以便相同的字段名稱可以是不同顏色的引用,具體取決於方案/主題。而不是每次檢查/獲取必要的顏色。我應該在這裏使用枚舉嗎?

我從來沒有使用之前enum,如果它適合此只是想知道? 或者我只是讓字段非最終並使用setAll(int theme)方法。

回答

2

我不會在這裏使用枚舉。

我會創建一個包含所有顏色字段(非最終),但沒有價值的類。並創建定義構造函數中所有顏色的擴展類。

public abstract class ColorScheme 
{ 
    public Color background; 
    public Color foreground; 
    public Color cursor; 

} 

現在創建到ColorScheme的實現:

public class DarkColorScheme extends ColorScheme 
{ 
    public DarkColorScheme() 
    { 
     background = new Color(0x111111); 
     foreground = new Color(0xDDDDDD); 
     cursor  = new Color(0xEEEEEE); 
    } 
} 

現在,你可以用你的配色方案是這樣的:

public ColorScheme colorScheme = new DarkColorScheme(); 

從現在開始,你可以創建額外的配色方案並且只需在新的colorscheme上方的行中使用,並且一切都應該動態工作。

+0

我真的很喜歡這種方法,但如果我有幾種配色方案呢?我最初的想法是有一個內部開關來確定方案,並讓所有其他類靜態訪問顏色。我可以創建所有顏色方案類作爲私有類,只需切換顏色引用,而不是在每次方案更改時重新定義每個顏色引用。我跟着那個。謝謝。 :) – rtheunissen 2011-12-26 23:57:16

+1

我同意。當然,可以在這裏使用枚舉(畢竟,除了枚舉之外,你可以得到任何東西),但是我認爲這裏的類更適合。特別是考慮到這種方式,你可以動態加載新的配色方案,而不是有一個硬編碼列表 - 這可能有一天會派上用場。 – Voo 2011-12-26 23:59:11

+1

@paranoid你必須指定某個地方使用哪種顏色集合,所以不是替換靜態顏色,而是用新的顏色替換當前的ColorScheme實例。 – Voo 2011-12-27 00:00:42

1

我會至少實現一個枚舉,如果不是兩個。一個用於ColorScheme,另一個用於ColorColorScheme將有(開始)兩個元素,每個元素可以「知道」其組成顏色。鬆散的例子:

enum ColorScheme { 

    NORMAL(Color.RED, Color.GREEN, Color.BLUE), 
    INVERTED(Color.CYAN, Color.MAGENTA, Color.YELLOW); 

    private final Set<Color> colors; 

    public ColorScheme(Color... cs) { 
     this.colors = EnumSet.of(cs) 
    } 
} 
+0

嗯,如果'顏色'是一個枚舉,爲什麼'ArrayList'而不是'EnumSet'? – fge 2011-12-26 23:54:30

+0

當然,爲什麼不呢?就像我說的 - 只是一個鬆散的例子。我會編輯。 – 2011-12-26 23:54:59

+0

對不起,但是沒有'EnumSet.of(E ... e)'......這個班真是太亂了。看一看JavaDoc並查看大量的重載。 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/EnumSet.html – 2011-12-27 00:01:09

0

設置對象的值與您使用枚舉或不使用枚舉無關。

通過使用原始常量或枚舉可以達到相同的結果。在我看來,您應該使用枚舉,因爲這樣更容易知道哪些常量是可用的,並且確保調用您的方法的人確實只向您發送在枚舉中定義的常量。

0

考慮有一個ColorScheme類,它保存單個配色方案中使用的顏色。 如果您的所有方案都是硬編碼的,這可能是enum。因此,例如:

public enum ColorScheme { 
    NORMAL(Color.WHITE, Color.BLACK), 
    INVERTED(Color.BLACK, Color.WHITE); 

    public final Color foreground; 
    public final Color background; 

    // Note that enum constructors *have* to be private 
    private ColorScheme (Color bg, Color fg) { 
     this.foreground = fg; 
     this.background = bg; 
    } 
} 

這將定義兩種不同的配色方案。然後可以傳遞這些對象,並且更改顏色方案只是更改引用對象的方法。添加第三種配色方案也會像添加另一個常量一樣簡單。

由於enum的實例數量有限(每個常量一個),所以它的缺點是無法在運行時延長配色方案的數量。在常見字段中使用常量字段(public static final)來代替常用字符,在某些情況下可能是更好的方法。