有一条规则说:
表示常量(最终变量)的名称必须全部为大写 使用下划线来分隔单词 (取自http://geosoft.no/development/javastyle.html)
适用于原始类型,如int或strings:
private static final int MAX_COUNT = 10;
但是非原始类型是什么?在大多数情况下,我见过以下内容:
private static final Logger log = Logger.getLogger(MyClass.class);
或单例,其中实例变量不是大写。
问题是声明这些类型的变量(如log和instance)的正确方法是什么?
答案 0 :(得分:64)
那仍然是常量。有关常量命名约定的更多信息,请参阅JLS。但实际上,这只是一个偏好问题。
接口类型中的常量名称应为,
final
类类型的变量通常可以是一个或一个序列 更多单词,首字母缩略词或缩写,全部大写,带组件 由下划线"_"
个字符分隔。常数名称应该是 描述性而非不必要的缩写。通常他们可以 是任何适当的词性。常量名称的示例 包括MIN_VALUE
,MAX_VALUE
,MIN_RADIX
和MAX_RADIX
班Character
。一组表示集合的替代值的常量,或者, 较不常见的是,有时会将整数值中的位掩码 有用地使用通用首字母缩略词作为名称前缀指定,如:
interface ProcessStates { int PS_RUNNING = 0; int PS_SUSPENDED = 1; }
隐藏涉及常量名称的情况很少见:
- 常量名称通常没有小写字母,因此它们通常不会模糊包或类型的名称,也不会影响通常包含至少一个小写字母的字段。
- 常量名称不能掩盖方法名称,因为它们在语法上是有区别的。
答案 1 :(得分:9)
语言不关心。重要的是遵循您正在进行的项目的既定风格和惯例,以便其他维护者(或者您从现在起五个月后)尽可能不被混淆。
我认为可变对象的全大写名称肯定会让我感到困惑,即使对该对象的引用恰好存储在static final
变量中。
答案 2 :(得分:7)
那是一个非常有趣的问题。我会根据他们的类型划分你问题中的两个常数。 int MAX_COUNT
是基本类型的常量,而Logger log
是非基本类型。
当我们使用原始类型的常量时,我们只在代码public static final in MAX_COUNT = 10
中改变常量一次,我们只是访问其他地方for(int i = 0; i<MAX_COUNT; i++)
的常量值。这就是我们习惯使用这种惯例的原因。
虽然在非原始类型的情况下,虽然我们只在一个地方private static final Logger log = Logger.getLogger(MyClass.class);
初始化常量,但我们应该在其他地方log.debug("Problem")
上变异或调用此常量的方法。我们不喜欢在大写字符之后添加点运算符。毕竟我们必须在点运算符之后放置一个函数名称,这肯定会成为驼峰式名称。这就是LOG.debug("Problem")
看起来很尴尬的原因。
String
类型的情况也是如此。我们通常不会在代码中对String
常量进行变异或调用方法,这就是为什么我们使用String
类型对象的大写命名约定。
答案 3 :(得分:4)
没有“正确”的方式 - 只有惯例。你已经陈述了最常见的惯例,以及我在自己的代码中遵循的约定:所有静态决赛应该全部上限。我想其他团队也会遵循其他惯例。
答案 4 :(得分:4)
对象的常量引用不是常量,它只是对象的常量引用。
private static final
不是什么定义为常数或不定。它只是定义常量的Java方法,但并不意味着每个private static final
声明都用于定义常量。
当我写private static final Logger
时,我没有尝试定义常量,我只想尝试定义对private
对象的引用(它不可访问)来自其他类),static
(它是类级变量,不需要实例)和final
(只能分配一次)。如果它恰好与Java希望你声明一个恒定的,好的,运气不好的方式一致,但它并不能使它成为一个常数。我不在乎编译器,声纳或任何Java专家所说的内容。像MILLISECONDS_IN_A_SECOND = 1000
这样的常量值是一回事,对象的常量引用是另一种。
答案 5 :(得分:2)
在我看来,变量是“常量”通常是一个实现细节,并不一定证明不同的命名约定。它可能有助于提高可读性,但在某些情况下它可能会受到伤害。
答案 6 :(得分:1)
这些变量是常量,即private static final
是否以全部大写字母命名。全封闭惯例简单地使这些变量更加明显是常量,但并不是必需的。我见过
private static final Logger log = Logger.getLogger(MyClass.class);
以前是小写的,我很好,因为我知道只使用记录器来记录消息,但它确实违反了惯例。你可以说,命名它log
是一个子约定,我想。但一般来说,以大写字母命名常量不是一种正确的方法,但它是最佳方式。
答案 7 :(得分:0)
不要狂热地遵守SUN已经制定的惯例,对你和你的团队感觉如何。
<击>
例如,这就是eclipse如何做到这一点,打破了惯例。尝试添加implements Serializable
,eclipse将要求为您生成此行。
更新:有特殊情况被排除但不知道。然而,我拒绝做你和你的团队看起来合适的事情。