我已使用以下代码
创建了一个界面final static char RIVER = '~';
final static char PATH = 'Y';
列表会增加(不是hundres甚至是几十,但最多可能是15个符号)
最初我只是将值直接编码到对象中,但我开始想知道为什么我不能用全局常量(对于地图上的符号和只有符号)创建单个文件以便于访问。
我知道根据OO逻辑,封装是我们应该如何编程的。同时,最终的静态变量确实存在,因此它们确实有目的。 那么我的问题是我有理由避免使用全局常量并返回将每个符号放在每个对象上吗?全局常量是否可以在OO编程中发挥作用,还是纯粹用于程序编程?
这是一个只有我会工作的项目,但是我用它作为测试平台来提高我的标准,因此我想尽可能使用最好的方法(就标准而言)。
答案 0 :(得分:2)
在接口中定义全局常量是一种反模式。使用类来定义常量,然后使用静态导入。或者只是使用枚举,这提供了更多的灵活性。
答案 1 :(得分:2)
定义全局(public static
)常量是可以的。通过为某些值提供有意义的名称,它有助于保持代码清晰和可维护。
你应该不做什么,是在接口中定义全局常量,然后为每个使用这些常量的类添加implements
- 子句。这样做的原因是,你以这种方式污染了你班级的公共签名。相反,它会以全名引用常量(例如SomeClass.SOME_CONSTANT
)或静态导入它们(import SomeClass.SOME_CONSTANT
)。
我不会在一个文件中定义所有全局常量,但是在最有意义的类或接口中定义它们中的每一个,例如因为它们定义了返回这些常量的方法或常量是典型参数的位置。
答案 2 :(得分:2)
使用常量有几个好处,其中一些是:
使用接口来保存常量被认为是一种不好的做法,而是使用类。如果常量与类相关,则可以在类中定义常量。如果它们是通用常量并在多个类中使用,则可以创建一个实用程序类来保存所有常量。
public class MyUtilityClass {
public static final int MY_INT_CONSTANT = 1234;
public static final String MY_STRING_CONSTANT = "example";
...
/* Create a private constructor to avoid creation of instances of this class */
private MyUtilityClass() {
}
}
答案 3 :(得分:0)
全局常量绝对正常。
据说, 在没有启用编译器警告的最大数量*的情况下甚至不尝试 编程。如果您启用了足够的警告,编译器会告诉您接口中的字段不需要声明final
,并且不需要声明static
。
(*警告有意义。每个编译器都有自己的一组警告,这些警告相当荒谬且最好禁用,但通常很少。)
答案 4 :(得分:0)
封装是一种保护您免受更改的机制 - 例如,更改类的实现,只要接口(公共或受保护的方法)不发生变化,就不会影响代码的其余部分。
因此,您可以将此推理应用于您的案例。这些常量的未来变化是否会影响代码的其余部分?如果没有,那么将所有这些常量作为最终静态实例放在一个类中就可以了。但想想这个。如果您想更改代表地图的方式怎么办? (从我假设您使用它们来表示地图的变量名称)也许您想要使用也有自己行为的特殊对象,而不仅仅是如何在地图上表示它们。那么也许你会想要在新类中抽象出来,而不再使用常量。这会影响你引用这些常量的所有代码 - 可能是很多类。
当然,您可以从这个简单的表示开始,如果稍后您发现它不再起作用,那么您可以切换。这就是我要做的。我认为这不对。