最终静态变量及其使用[重复]

Posted

技术标签:

【中文标题】最终静态变量及其使用[重复]【英文标题】:final static variables and their use [duplicate] 【发布时间】:2015-04-20 18:26:41 【问题描述】:

我用下面的代码创建了一个界面

final static char RIVER = '~';
final static char PATH = 'Y';

列表会增加(不是数百个甚至数十个,但可能最多 15 个符号)

最初我只是将值直接编码到对象中,但我开始想知道为什么我不能只创建一个带有全局常量(用于地图上的符号,仅用于符号)的单个文件以便于访问。

我知道根据 OO 逻辑,封装是我们应该编程的方式。同时,最终的静态变量存在,所以它们肯定是有目的的。 那么我的问题是我有理由避免使用全局常量并回到将每个符号与每个对象放在一起吗?全局常量是否在面向对象编程中发挥作用,还是纯粹用于过程编程?

这是一个只有我才会参与的项目,但我将其用作测试平台来提高我的标准,因此我想使用尽可能最好的方法(就标准而言)。

【问题讨论】:

final 变量是只读变量。它们非常有用 - 例如。您可以访问内部/匿名代码块中的最终变量。如果您打算扩展该常量列表,请考虑使用枚举或静态类。 【参考方案1】:

在接口中定义全局常量是一种反模式。要么使用类来定义常量,然后使用静态导入。或者简单地使用枚举,这提供了更多的灵活性。

【讨论】:

【参考方案2】:

定义全局 (public static) 常量是可以的。通过为某些值赋予有意义的名称,它有助于使您的代码保持清晰和可维护。

您应该做的是在接口中定义全局常量,然后为每个使用这些常量的类添加implements-clause。这样做的原因是,您以这种方式污染了班级的公共签名。相反,总是通过全名(例如SomeClass.SOME_CONSTANT)引用常量或静态导入它们(import SomeClass.SOME_CONSTANT)。

但是,我不会在一个文件中定义所有全局常量,而是在最有意义的类或接口中定义它们中的每一个,例如,因为它们定义了返回这些常量的方法,或者这些常量是典型的参数。

【讨论】:

【参考方案3】:

使用常量有几个好处,以下是其中的一些:

可读性:如果您对数字进行硬编码,当您或其他程序员必须使用该代码时,他们必须知道该值的含义。如果使用常量,则提供有意义的名称。 可重用性:如果同一个常量需要在多个地方使用,当需要修改时,您只需更改一个地方的值,而不是所有使用该常量的地方。 可维护性:如果您将常量放在一个地方而不是代码中的多个地方,则更容易修改。

使用接口来保存常量被认为是一种不好的做法,而是使用类。如果常量与类相关,则可以在类中定义常量。如果它们是通用常量并在多个类中使用,您可以创建一个实用程序类来保存所有常量。

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() 
    

【讨论】:

【参考方案4】:

全局常量绝对没问题。

话虽如此,在没有启用最大数量*的编译器警告的情况下,甚至不要尝试编程。如果您启用了足够多的警告,您的编译器会告诉您接口中的字段不需要声明为final,也不需要声明为static

(*有意义的警告。每个编译器都有自己的一组警告,这些警告相当荒谬,最好禁用,但这些警告通常很少。)

【讨论】:

【参考方案5】:

封装是保护您免受更改的机制 - 例如,更改类的实现,只要接口(公共或受保护的方法)不更改,就不会影响您的其余代码。

因此,您可以将此推理应用于您的案例。这些常量的未来更改会影响其余代码吗?如果不是,那么将所有这些常量作为最终静态实例放在一个类中就可以了。但是想想这个。如果您想更改地图的表示方式怎么办? (根据变量的名称,我假设您正在使用它们来表示地图)也许您想使用也有自己的行为的特殊对象,而不仅仅是如何在地图上表示它们。然后也许你会想在新类中抽象它们,不再使用常量。这将影响您引用这些常量的所有代码 - 可能很多类。

当然,您可以从这个简单的表示开始,如果稍后您发现它不再工作,那么您可以切换。这就是我会做的。我觉得没有错。

【讨论】:

以上是关于最终静态变量及其使用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java中的静态最终变量[重复]

C语言--static变量及其作用

何时选择变量来声明为最终静态

Java中的静态变量实例变量和局部变量及其特征

非静态最终变量在 Java 中有用吗?

如何使用 JUnit、EasyMock 或 PowerMock 模拟静态最终变量