1

我有一个小问题,我想出了阅读这个帖子: 为什么静态变量被认为是邪恶的?

在我的应用程序中,我有大量的配置变量。例如字体、颜色、缓存图像……因为它们中的大多数从未改变,所以我认为它们是静态的。尽管如此,我的应用程序是一个小程序,并且由于客户端已经执行了一次小程序,因此其中一些静态信息可能会更改,因为给定的配置可能已更改。因此可以说这种数据很少改变,但不被认为是最终的。

此外,由于我以这种方式处理的信息量很大,我将它们映射到自己的枚举上,如下所示:

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 工作,这意味着将任何传入数据转发到相应的对象,我认为这些对象不容易阅读。

提出我的问题:你们中的某个人将如何映射/缓存中途最终参数(我也考虑过使用枚举作为键值的哈希图)。例如图像、字体、颜色、像素边距等。我使用这些枚举的方式是否合适,或者我认为它们是邪恶的,因为它们是静态的?如果是 - 什么是合适的方式,它易于阅读和易于维护?!

我认为我的解决方案是一种可行的方法,但在阅读了上述线程后将重新考虑整个设计。

非常感谢您的任何建议。亲切的问候。

4

1 回答 1

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)

于 2012-12-17T13:21:47.093 回答