我正在做一点pinball-game project出于爱好,正在寻找一种封装常量变量的模式。
我有一个模型,其中有一些值在该模型的生命周期中保持不变,例如最大速度/最大重力等。在整个 GUI 和其他区域中,需要这些值才能正确验证输入。目前,它们要么作为对公共(public)静态最终的引用,要么只是简单的硬编码。我想将这些“常量变量”封装在一个对象中,该对象可以注入(inject)模型中,并由 View / Controller 检索。
澄清一下,“常量变量”的值不一定是在编译时定义的,它们可能来自文件中的读取;用户输入等。在编译时就知道需要哪些。一种可能更容易解释的方法是,无论这种封装是什么,它提供的值都是不可变的。
我正在寻找一种方法来实现这一目标:
- 具有编译时类型安全性(即不在运行时将字符串映射到变量)
- 避免任何静态内容(包括无法扩展的枚举)
我知道我可以定义一个具有以下方法的接口(interface):
public int getMaximumSpeed();
public int getMaximumGravity();
...并将其实例注入(inject)模型中,并使其以某种方式可访问。然而,这会产生大量样板代码,编写/测试等非常乏味(我这样做是为了好玩:-))。
我正在寻找一种更好的方法来做到这一点,最好是具有成为共享词汇一部分的好处的方法,就像设计模式一样。
有更好的方法吗?
附注我对此进行了更多思考,我能找到的最好的权衡是:
public class Variables {
enum Variable {
MaxSpeed(100),
MaxGravity(10)
Variable(Object variableValue) {
// assign value to field, provide getter etc.
}
}
public Object getVariable(Variable v) { // look up enum and get member }
} // end of MyVariables
然后我可以做类似的事情:
Model m = new Model(new Variables());
优点:变量的查找受到保护,必须成为枚举的成员才能进行编译,只需很少的额外代码即可添加变量
缺点:枚举无法扩展、脆弱(需要重新编译才能添加变量)、变量值必须从 Object 转换(在本例中转换为 Integer),这又不是类型安全的,尽管泛型可能是一个选择......不知何故
最佳答案
您在寻找 Singleton或者,一个变体,Monostate ?如果没有,该模式如何满足您的需求?
当然,这是强制性免责声明 Anything Global Is Evil .
更新:我做了一些查找,因为我一直有类似的辩论/问题。我偶然发现了一个list经典全局/范围解决方案的“替代方案”。我想我会分享。
关于oop - 是否有常用的 OO 模式来保存 "constant variables"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/529823/