如何在不使用文字的情况下定义常量?

How can a constant be defined without using a literal?

我很难理解如何在不使用文字的情况下定义常量。 final int A = 1 + 1 算吗?

Java 语言规范定义了 Constant Expressions。第一项是 "Literals of primitive type and literals of type String",所以这些文字也是常量。同样,它列出 "Simple names (§6.5.6.1) that refer to constant variables"。但是,还有许多其他形式的表达式仅使用某些也定义为常量表达式的运算符组成。有关完整规则,请参阅链接部分。

常量是一个不会改变的值:

int getRandomNumber() {
    //chosen by a fair dice roll, guaranteed to be random
    return 4; //<- literal
}

public final int random = getRandomNumber(); //<- constant

XKCD 221

这里的random不是文字,因为它是方法调用的结果。然而,它是一个常量,因为它被声明为 final.

Java 的文字数量有限:

String a = "a"; // string literal
int three = 3; // number literal
int[] manyThree = {3,3,3}; //an array literal consisting of number literals

但是任何变量都可以通过声明为常量final

好吧,您可以很容易地拥有一个非文字常量。拿这个:

public class A {
    public static final int A_CONSTANT = new java.util.Random().nextInt();
}

A.A_CONSTANT 当然是一个常量 -- 它是 finalstatic,所以一旦 class 被加载,它就不会改变!但是,它不是文字——它在 运行 时是常量,而不是编译时。每次加载 A 时,A_CONSTANT 都会有一个新的 常量 值,而文字 4 始终正好是 4。

文字不是常量而是常量。 (没有 a)常量是可以用文字表示的值的名称。 (或通过另一个常数)