【问题标题】:Is there a reason for this naming convention on static final variables?静态最终变量的这种命名约定是否有原因?
【发布时间】:2020-05-05 04:26:37
【问题描述】:

我正在学习 HeadFirst Java 书籍,目前正在学习数字和静态章节。他们最近引入了静态最终变量的概念。完全清楚他们的解释方式。我的问题是,他们使用类名+一些任意名称来命名变量,用下划线分隔,全部大写。这是一个示例。

    public class Foo {
        public static final int FOO_SUM = 5;
    }

这是为什么?

【问题讨论】:

  • 我猜这是从早期语言中借来的命名常量的约定。例如,在 C 语言中,通常写#define FOO_SUM 5 来定义一个常量(不是作为不可变变量,而是作为预处理器的宏)。在 C 中使用全大写名称有助于区分预处理器代码和其他代码。
  • 这是一个约定。该格式称为UPPER_SNAKE_CASE。它只能用于static final 原语或不可变对象。它标志着一些被认为是不变的东西。
  • 包含类名不是约定的一部分;我猜这本书就是这样写的,因为它是一个任意的例子,而“FOO”是一个任意的词。
  • 我会说最好不要将类名放在常量名中,因为您已经使用类名来访问它; Foo.FOO_SUM 是多余的,因为它有两次类名。
  • 由于它已经嵌入到 Foo 类中,我会特别避免在常量名称中包含 Foo 的冗余。

标签: java oop static naming-conventions final


【解决方案1】:

符号与Code Conventions for the Java Programming Language 一致,这可以追溯到Java 的早期。该文件包括理由:

本文档反映了 Sun Microsystems, Inc. 的 Java 语言规范中提出的 Java 语言编码标准。

【讨论】:

    【解决方案2】:

    这是一个约定。该格式称为SNAKE_CASE。它应该仅用于static final 原语或immutable objects。除其他外,这在official Oracle style guideGoogle Java style guide 中进行了定义,它发出了一些被视为常数的信号。如果对象是可变的,则应该将 SNAKE_CASE 用于 static final 字段。

    类名的包含是针对调用方的。假设你有两个类AB,都有一个public static final int NUMBER 变量:

    public class A {
        public static final int NUMBER = 1;
    }
    
    public class B {
        public static final int NUMBER = 2;
    }
    
    public class Ideone {
    
        public static void main(String[] args) {
            System.out.println(A.NUMBER); // = 1
            System.out.println(B.NUMBER); // = 2
        }
    }
    

    在同一类中,可以省略类名,例如:

    public class A {
        public static final int NUMBER = 1;
    
        public int getNumberPlusTwo() {
            return NUMBER + 2; // returns 3
        }
    }
    

    如果要在A 中引用BNUMBER,则必须再次使用类名:

    public class A {
        ...
        public int getBsNumberPlusTwo() {
            return B.NUMBER + 2; // returns 4
        }
    }
    

    Ideone Demo

    【讨论】:

      猜你喜欢
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多