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}}]
答案 0 :(得分:4)
当你写final Object reference = someObject;
时,引用是someObject
的常量引用。它总是“指向”该对象。
然而,这并不意味着someObject
本身是不变的。
例如,在final List list = new ArrayList();
中,list是一个常量,它将始终引用相同的列表,但您可以添加/删除该列表。
在您的示例中,Integer
和BigInteger
都是不可变的,因此引用和引用的对象都是常量。
但请注意,JLS具有a precise definition of what constitutes a constant expression,其中仅包含基元和字符串。
答案 1 :(得分:2)
我假设您希望从语言规范中获得常量的实际定义,而不仅仅是明显的语义。
$ 4.12.4。最终变量说明如下:
基本类型或类型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);