静态最终变量的Java命名约定

时间:2011-08-31 15:45:58

标签: java coding-style

有一条规则说:

  

表示常量(最终变量)的名称必须全部为大写   使用下划线来分隔单词   (取自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)的正确方法是什么?

8 个答案:

答案 0 :(得分:64)

那仍然是常量。有关常量命名约定的更多信息,请参阅JLS。但实际上,这只是一个偏好问题。


  

接口类型中的常量名称应为,final   类类型的变量通常可以是一个或一个序列   更多单词,首字母缩略词或缩写,全部大写,带组件   由下划线"_"个字符分隔。常数名称应该是   描述性而非不必要的缩写。通常他们可以   是任何适当的词性。常量名称的示例   包括MIN_VALUEMAX_VALUEMIN_RADIXMAX_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将要求为您生成此行。

更新:有特殊情况被排除但不知道。然而,我拒绝做你和你的团队看起来合适的事情。