我在阅读本线程时遇到了一个小问题:为什么静态变量被认为是邪恶的?
在我的应用程序中,我有大量的配置变量。例如字体、颜色、缓存图像。。。由于它们中的大多数从未改变,我认为它们是静态的。尽管如此,我的应用程序是一个小程序,由于客户端已经执行了一次小程序,这些静态信息中的一些可能会更改,因为给定的配置可能已经更改。因此,让我们说这种数据很少被用来改变,但不被认为是最终的。
此外,由于我以这种方式处理的信息量很大,我将它们映射到自己的Enum上,如下所示:
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,这意味着将任何传入的数据转发到相应的对象,我认为这不容易读取。
提出我的问题:你们中的一些人会如何映射/缓存中途的最终参数(我也考虑过用枚举作为键值的哈希映射)。例如图像、字体、颜色、像素边距等。我使用这些枚举的方式合适吗?或者我可能认为它们是邪恶的,因为它们是静态的?如果是的话,什么是一种合适的方式,保持易于阅读和维护?!
我认为我的解决方案是一种可能的方式,但在阅读了上面提到的线程后,我将重新思考整个设计。
非常感谢你的建议。致以亲切的问候。
枚举可以表示静态最终数据,这就是为什么我认为使用这样的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>
(可能是用Collections.unmodifiableMap()
包装的EnumMap<Fonts, Font>
),而不是调用Fonts.COLOR_CHOOSER.getValue()
,而是调用FontService.getFont(Fonts.COLOR_CHOOSER)
。