使用最终实例变量,其值在编译时已知

时间:2013-11-15 14:43:55

标签: java static final

是否有任何理由使用最终实例变量而不是 一个静态的最终实例变量,当你在编译时已经知道它的值时它对所有实例都是一样的吗?

我的意思是,尽管这种初始化在语法上是有效的:

class Test {

    final int size = 3;

    ...
}

它将为每个实例创建一个副本,所以问题是,是否有任何情况下这样做而不是:

class Test {

    static final int size = 3;

    ...
}

为所有实例制作一份副本。

谢谢

3 个答案:

答案 0 :(得分:5)

最终但非静态变量的目的是具有对象范围的常量。它应该在构造函数中初始化。

class A {
    final int a;

    A(int a) {
        this.a = a;
    }
}

如果在声明中初始化变量,最好使用static keyword。

答案 1 :(得分:0)

我尝试使static的任何方法或字段都是静态的。这有助于提高性能,但最好的理由是明确表示所有实例的字段都相同。

答案 2 :(得分:0)

我不知道它是否算“有道理”,但我认为当您考虑序列化或通过反射获取实例的所有字段时,它会有所不同。

我想像服务器接收来自不同系统的JSON消息,其中size属性可能具有不同的值,即使来自Java客户端的所有消息都具有大小3.如果您希望消息中包含的大小而不必自定义序列化,将其声明为(非静态)实例变量可能是最简单的方法。