真正定义常量的是什么?

时间:2013-05-30 13:53:23

标签: java constants wrapper primitive

public class Constants {

    // This is a constant for sure!
    public static final int NUMBER1 = 42;

    // This is a constant.
    public static final Integer NUMBER2 = 42;

     // Is this really a constant?
    public static final BigInteger NUMBER3 = new BigInteger("42");

}

常量必须是原始[NUMBER1](或原始包装[NUMBER2]),或static final是否足以将字段视为常量[{{ 1}}]

2 个答案:

答案 0 :(得分:4)

当你写final Object reference = someObject;时,引用是someObject的常量引用。它总是“指向”该对象。

然而,这并不意味着someObject本身是不变的。

例如,在final List list = new ArrayList();中,list是一个常量,它将始终引用相同的列表,但您可以添加/删除该列表。

在您的示例中,IntegerBigInteger都是不可变的,因此引用和引用的对象都是常量。

但请注意,JLS具有a precise definition of what constitutes a constant expression,其中仅包含基元和字符串。

答案 1 :(得分:2)

我假设您希望从语言规范中获得常量的实际定义,而不仅仅是明显的语义。

$ 4.12.4。最终变量说明如下:

  

基本类型或类型String的变量,即final和   用编译时常量表达式(第15.28节)初始化,是   称为常量变量

Source

JLS以这种方式定义常量的原因是因为它提供了一些额外的优化潜力(当时这似乎是一个好主意):

class Foo {
    public static final int BAR = 5;
}

// other compilation unit
System.out.println(Foo.BAR); 
// compiler is allowed to generate the following code instead:
System.out.println(5);