2012-12-10 32 views
0

我有一個小問題,我想出了閱讀此線程: Why are static variables considered evil?緩存是中途最終

在我的應用程序有一個真正大規模量可以說配置變量。例如。字體,顏色,緩存的圖像,...由於他們中的大多數從來沒有改變,我認爲他們是靜態的。儘管如此,我的應用程序是一個小程序,並且由於客戶端一直在執行小程序,因此某些靜態信息可能會更改,因爲給定的配置可能已更改。因此可以說這種數據很少用來改變,但不被認爲是最終的。

除了作爲信息我處理這樣龐大的數額,我映射他們到自己的枚舉這樣的:

public enum Fonts { 

    COLOR_CHOOSER, MAP_META_DATA; 
    private Font localFont; 

    public Font getValue() { 
     return localFont; 
    } 

    private void setValue(Font newFont) { 
     localFont = newFont; 
    } 
} 

protected static void initFonts() { 
    Fonts.COLOR_CHOOSER.setValue(new Font("Arial", Font.PLAIN, 15)); 
    Fonts.MAP_META_DATA.setValue(font_race.deriveFont(Font.BOLD, 11)); 
} 

通過使用枚舉這樣的,我是能夠識別我期待值非常容易,而我只能在一個地方維護所有人。

有人可能會說,因爲這是靜態的,我也可以把它們放到對象中,他們反正被使用。不過,我認爲目前的行爲更容易閱讀。

除此之外的initFonts()方法的成爲未來由映射方法,該方法從像JSON或XML外部源獲取目前硬編碼值替換。因此,如果我工作OO,這意味着將任何傳入數據轉發到相應的對象,我認爲這些對象不容易閱讀。

想出我的問題: 你們中的某人如何映射/緩存中途最終參數(我也考慮過使用枚舉作爲鍵值的hashmap)。 E.g的圖片,字體,顏色,像素邊距等是我使用這些枚舉的方式適當否則我會認爲它們是邪惡的,因爲它們是靜態的?如果是 - 那將是一個合適的方式,它易於閱讀和易於維護?!

我認爲我的是一個可能的方式去解決,而是打算看完上面提到的線索後,重新考慮整個設計。

非常感謝您的任何意見。 親切的問候。

+0

沒有任何人對此有何評論?! – user1514195

回答

0

枚舉是好的代表靜態最後的數據,這就是爲什麼我不認爲這是正確的能有這樣的initFonts()方法,修改枚舉值的內容,即使它使用的私有方法。你應該有更象:

public enum Fonts { 
    COLOR_CHOOSER(new Font("Arial", Font.PLAIN, 15)), 
    MAP_META_DATA(new Font("Arial", Font.BOLD, 11)); // No reference to font_race, of course 

    private final Font localFont; 

    private Fonts(Font font) { 
     localFont = font; 
    } 

    public Font getValue() { 
     return localFont; 
    } 
} 

我不明白你爲什麼說你樣的配置數據不是最終的:它似乎並沒有在應用程序運行時改變。但是,如果運行時初始化需要加載可能會改變的值,而不是在編譯時確定,那麼枚舉可能不再是正確的模型,如果它無法以簡單的方式初始化其自身的值(從一個枚舉的靜態初始化器調用太多東西可能不是最好的想法)。在這種情況下,我會通過中間服務代替直接使用枚舉的,例如保持一個不變Map<Fonts, Font>(這可能是一個與EnumMap<Fonts, Font>包裹Collections.unmodifiableMap())一勞永逸使用適當的方法和的,而不是調用Fonts.COLOR_CHOOSER.getValue()初始化,你會打電話給FontService.getFont(Fonts.COLOR_CHOOSER)