Java 为什么非静态最终成员变量不需要遵循常量命名约定?

Java 为什么非静态最终成员变量不需要遵循常量命名约定?,java,netbeans,naming-conventions,constants,naming,Java,Netbeans,Naming Conventions,Constants,Naming,我使用NETBeaEide,在java之前,我是C++程序员。从C++中,我学到的是,常数变量名称只包含大写字母。我认为大多数编程语言都建议常量变量应该只包含大写字母和下划线来分隔单词 我的IDE NetBeans只在我试图用小写字母声明静态成员变量时警告我有关约定。如果变量是final,但不是静态的,则可以 final int mem1 = 90; // no warning static final int mem2 = 90; // warning 程序员不应该被迫使用大写字母来命名任何

我使用NETBeaEide,在java之前,我是C++程序员。从C++中,我学到的是,常数变量名称只包含大写字母。我认为大多数编程语言都建议常量变量应该只包含大写字母和下划线来分隔单词

我的IDE NetBeans只在我试图用小写字母声明
静态
成员变量时警告我有关约定。如果变量是
final
,但不是静态的,则可以

final int mem1 = 90; // no warning
static final int mem2 = 90; // warning

程序员不应该被迫使用大写字母来命名任何类型的(静态、非静态)常量变量吗?

只有常量应该是大写的。然而,这可能取决于程序员如何遵循约定。有些人还喜欢在常量开头加一个“u”,后跟小写的名称。此外,从程序员的角度来看,不需要在编译器中进行这样的检查。

final
并没有将值设为常量,它只是意味着字段的值只能赋值一次

下面是一个非常量最终字段的示例:

public final class IntHolder {
  private final int value;

  public IntHolder(int value) {
    this.value = value;
  }

  public int get() {
    return value;
  }
}

这里,
value
字段对于
IntHolder
的每个实例都明显不同,因此它不是一个常量。将字段命名为常量只会导致混淆。

这是一种命名约定。您是对的,为了可读性应该遵循它,但我认为它永远不会被强制执行,也不应该被强制执行。因为命名约定不是Java语言规范的一部分。非静态的
final
不是一个真正的常量。它也可以基于一些运行时计算的值在构造函数中初始化。另请参见非静态最终变量不是真正的常量。对于类的每个实例,它们可以是不同的。