2
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足以将字段视为常量 [ NUMBER3]?

4

2 回答 2

4

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

然而,这并不意味着它someObject本身是恒定的。

例如, in final List list = new ArrayList();, list 是一个常量,它总是引用同一个列表,但您可以添加/删除该列表。

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

但是请注意,JLS 对常量表达式的构成有一个精确的定义,它只包括原语和字符串。

于 2013-05-30T13:56:03.197 回答
2

我假设您想要语言规范中常量的实际定义,而不仅仅是明显的语义。

4.12.4 美元。final 变量说明如下:

原始类型或 String 类型的变量,它是 final 并使用编译时常量表达式(第 15.28 节)初始化,称为常量变量

资源

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); 
于 2013-05-30T13:59:29.363 回答