在我们的应用程序中最好使用静态最终变量或最终变量[重复]

Posted

技术标签:

【中文标题】在我们的应用程序中最好使用静态最终变量或最终变量[重复]【英文标题】:Which is best to use either static final variable or final variable in our application [duplicate] 【发布时间】:2015-10-05 10:06:50 【问题描述】:
public class FinalClassVariable 
    public static void main(String[] args) 
        ClassVariable classVariable = new ClassVariable();
        System.out.println("Value of PI accessed thorugh class itself = "+ClassVariable.PI);
        //System.out.println(ClassVariable.E);
        System.out.println("Value of PI accessed thorugh object = "+classVariable.PI);
        System.out.println("The value of constant E = " + classVariable.E);
    


class ClassVariable 
    public static final double PI = 3.14;

    public final double E = 2.7182818284590452353602874713527; 

变量 'PI' 和 'E' 之间的主要区别我们可以通过 类名和对象和'E'都只能通过对象访问

而且这两个都是常数,我们不会改变它们的值。

我已经完成了马德里卡洛斯三世大学的 Java 课程 大学,还观看了 Mehran Sahami 的斯坦福大学视频

这两个人都建议在 final 中使用关键字 static。

我的问题是,如果我们可以通过声明 final 来创建常量 那为什么我们还要声明它staticstatic 也妥协了 OOP 的概念。

这两个声明之间有什么细微差别吗?哪一种最适合我们的应用程序?

【问题讨论】:

不,static 不会自动破坏 OOP。在 OOP 中避免使用 static variables 通常有充分的理由,但它们不适用于常量。这是一个例子,说明人们如何采用有用的原则并将其过度简化,以至于它们可能成为破坏性的神话。 【参考方案1】:

如果你使用非静态成员声明一个常量,你的类的每个实例都会有它自己的副本,这很浪费,因为它是一个常量,并且所有副本都将具有相同的值。因此static final 更有意义——这个常量只有一个副本。对于 PI 和 E 等常量,应始终使用static final

如果该成员的值被初始化一次(通常在构造函数中),则最终实例成员(即非静态成员)是有意义的,但对于类的不同实例可能不同。

【讨论】:

【参考方案2】:

static 成员由类的所有实例共享,因为每次创建实例都会创建一次非静态成员。

为什么要为每个实例创建不同的常量值?没意义吧..

因此,static final 是选择。

【讨论】:

以上是关于在我们的应用程序中最好使用静态最终变量或最终变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章

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

为什么接口方法不能“静态”和“最终”?

为啥接口方法不能是“静态的”和“最终的”?

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

为啥接口变量默认是静态的和最终的?

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