是否有常量的正式定义?

时间:2017-04-04 12:54:05

标签: 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);

1 个答案:

答案 0 :(得分:16)

Java语言中有常量的两种用法。有常量表达式,它们在规范中定义。见Chapter 15.28 Constant Expressions

  

常量表达式是表示基元值的表达式   类型或字符串不突然完成并使用   只有以下内容:

     
      
  • 原始类型的文字和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)。
  •   

如果您点击constant variables的链接,就会找到

  

空白finalfinal变量,其声明缺少   初始化程序。

     

常量变量是基本类型或类型的final变量   使用常量表达式初始化的String(第15.28节)。   变量是否是常量变量可能会产生影响   关于类初始化(第12.4.1节),二进制兼容性   (§13.1,§13.4.9)和明确的任务(§16(确定任务))。

因此不需要static。 Java语言只关心变量是final并在其声明中使用常量表达式进行初始化。

还有enum constants枚举实例。

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

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

public static final int ONE = 1;
public static final double TWO = 2.0d;
public static final String THREE = "three";

虽然被声明为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);