是否有常量的正式定义?

Oli*_*ire 9 java jls

Java规范是否定义了常量的原理,还是留给了推荐角色?

如果在规范中定义,它的定义是什么?

具体而言,以下任何或所有例子都被视为常数吗?如果确实存在部分或全部,是否按照规范或任何其他官方建议进行了考虑?

public static final int ONE = 1;
public static final double TWO = 2.0d;
public static final String THREE = "three";
public static final ImmutableList<Integer> ONE_TWO_THREE = ImmutableList.of(1, 2, 3);
public static final Logger logger = LogManager.getLogManager().getLogger(ThisClass.class);
Run Code Online (Sandbox Code Playgroud)

Sot*_*lis 16

Java语言中有两种常量用法.有一些常量表达式,这些表达式在规范中定义.请参见第15.28章"常量表达式"

常量表达式是表示基本类型值的表达式或不突然完成的字符串,仅使用以下内容组成:

  • 原始类型和文字类型的文字String(§3.10.1,§3.10.2,§3.10.3,§3.10.4,§3.10.5)
  • 转换为基本类型并转换为String类型(第15.16节)
  • 一元运算符+,-,~,和!(但不++--)(§15.15.3,§15.15.4,§15.15.5,§15.15.6)
  • 乘法运算符*,, /%(§15.17)
  • 添加剂操作符+-(§15.18)
  • 班次运营商<<,>>>>>(§15.19)
  • 关系运算符<,<=,>,和>=(但不包括instanceof)(§15.20)
  • 平等算子==!=(§15.21)
  • 按位和逻辑运算符&,^以及|(§15.22)
  • 条件运算符和运算符&&以及条件运算符||(第15.23节,第15.24节)
  • 三元条件运算符? :(§15.25)
  • 带括号的表达式(第15.8.5节),其包含的表达式是一个常量表达式.
  • 引用常量变量的简单名称(第6.5.6.1节)(§4.12.4).
  • TypeName . Identifier引用常量变量的形式的合格名称(第6.5.6.2节)(§4.12.4).

如果你按照常量变量的链接,你会发现

空白final是一个final变量,其声明缺少初始化程序.

常量变量是使用常量表达式初始化final的基本类型或类型的变量 String(第15.28节).变量是否是常量变量可能对类初始化(第12.4.1节),二进制兼容性(第13.1节,第13.4.9节)和明确赋值(第16节(定义赋值))有影响.

所以static不是必需的.Java语言只关心变量是否final在其声明中使用常量表达式进行初始化.

还有枚举常量,它们是枚举实例.


其他用途是开发人员用来引用不会改变的东西(无论是非常final量变量还是其他东西).小心如何将这些与上面的常量结合使用.


话虽这么说,你的例子包含变量,根据上面提到的规范被认为是常量,而不是.前三个变量是final原始类型或类型的变量String,因此是常量变量:

public static final int ONE = 1;
public static final double TWO = 2.0d;
public static final String THREE = "three";
Run Code Online (Sandbox Code Playgroud)

虽然被声明final,但最后两个变量不应被视为常量变量,因为它们既不是原始类型也不是类型String:

public static final ImmutableList<Integer> ONE_TWO_THREE = ImmutableList.of(1, 2, 3);
public static final Logger logger = LogManager.getLogManager().getLogger(ThisClass.class);
Run Code Online (Sandbox Code Playgroud)

  • @OlivierGrégoire因此,看一下[rev.2](http://stackoverflow.com/revisions/43207857/2)您的帖子,`public static final ImmutableList <Integer> ONE_TWO_THREE`以及`private static final Logger logger`都**不是**考虑*常量变量*因为它们既不是原始类型的变量也不是类型`String`的变量. (4认同)