Java 静态最终变量的命名约定有什么原因吗?

Java 静态最终变量的命名约定有什么原因吗?,java,oop,static,naming-conventions,final,Java,Oop,Static,Naming Conventions,Final,我学习的是第一本Java书籍,目前正在学习数字和静态一章。他们最近引入了静态最终变量的概念。他们被解释得非常清楚。我的问题是,他们使用类名+一些任意名称来命名变量,用下划线分隔,都用大写。下面是一个例子。 public class Foo { public static final int FOO_SUM = 5; } 为什么会这样?这是惯例。该格式称为。它应该用于静态final原语或仅用于原语。除其他事项外,这是在中定义的,并且它表示将被视为常数的某个事物。如

我学习的是第一本Java书籍,目前正在学习数字和静态一章。他们最近引入了静态最终变量的概念。他们被解释得非常清楚。我的问题是,他们使用类名+一些任意名称来命名变量,用下划线分隔,都用大写。下面是一个例子。

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

为什么会这样?

这是惯例。该格式称为。它应该用于
静态final
原语或仅用于原语。除其他事项外,这是在中定义的,并且它表示将被视为常数的某个事物。如果对象是可变的,则应
静态final
字段使用SNAKE_大小写

类名的包含是针对调用方的。假设您有两个类
A
B
,它们都有一个
公共静态最终整数
变量:

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
中引用
B
编号
,则必须再次使用类名:

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

该符号与可追溯到Java早期的一致。该文件包括以下理由:

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


我的猜测是,这是一种命名常量的惯例,它是从早期语言中借用的。例如,在C语言中,编写
#define FOO_SUM 5
来定义常量(不是作为不可变变量,而是作为前置处理器的宏)是正常的。在C中使用所有大写名称有助于区分预处理器代码和其他代码。这是一种惯例。该格式称为。它只能用于
静态final
原语或不可变项。它表示一些将被视为常量的东西,包括类名不是约定的一部分;我猜书中就是这样做的,因为它是一个任意的例子,“FOO”是一个任意的词
Foo.Foo_SUM
是冗余的,因为它有两个类名。因为它已经嵌入到
Foo
类中,我要特别避免在常量名中有Foo的冗余。