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);
答案 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的链接,就会找到
空白
final
是final
变量,其声明缺少 初始化程序。常量变量是基本类型或类型的
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);