编码约定:CAPITAL_LETTERS 中的最终 class 实例?

Coding conventions: final class instance in CAPITAL_LETTERS?

原始类型的常量(final)应该写成CAPITAL_LETTERS。但是 class 实例 呢?例如,当它作为函数参数传递时,从内部 class 调用并且应该 声明为 final所有参数都应该是最终的吗?是不是应该这样呢:

public static void myFunction(
    final MyClass CLASS_INSTANCE) {

    // Code.
}

CAPITAL_LETTERS... What about a class instance?

没有。那会很奇怪。参数使用驼峰式大小写。某些东西是 final 的事实不会影响大小写约定。

Are all parameters supposed to be final?

没有。声明事物 final 如果它们不应该改变。这通常适用于参数,但并非总是如此。

声明某些东西 final 有两个作用:它有助于找出某些东西从未被初始化或在初始化后可以更改的错误;并提示编译器允许进行一些优化。

不,最终参数不应全部大写 -- 它们不是常量。

术语常量final 不是同义词。

大写确实用于常量,as specified by early Java naming conventions

The names of variables declared class constants and of ANSI constants should be all uppercase with words separated by underscores ("_").

但并非所有 final 声明的变量都是常量。 来自 Java language specification, section 4.12.4, "Final variables":

A constant variable is a final variable of primitive type or type String that is initialized with a constant expression (§15.28).

参数不是常量。它们不是用常量表达式初始化的。在您的示例中,参数不是原始类型或字符串。

因此,参数以混合大小写形式指定,首字母小写。

首先要吹毛求疵:Java 确实没有常量。它具有 final 静态变量,出于所有意图和目的,这些变量通常表现得像常量。但在某些罕见情况下,它们的行为会有所不同(而且出乎意料),即使它们具有原始类型也是如此。

无论如何,按照惯例,行为类似于常量的变量以大写字母命名。例如,java.awt.Color 定义了 Color 类型的常量 REDBLUE。 (它还定义了常量 redblue,但由于 REDBLUE 是后来添加的,我怀疑 Sun/Oracle 的人认为这些名称是错误的。)

但是参数不是常量,并且行为与它们不同。对于每个方法调用,它们都可以有不同的值。因此参数总是以驼峰命名,即使它们被声明为最终的。

参数是否应该声明为最终的?什么时候,这里是惯例停止和纯粹品味开始的地方。有人说是,有人说不是。我属于 "no" 阵营。如果您尝试修改参数,则将参数设置为 final 可以通过给出编译器错误来帮助防止引入错误。但是,如果您的方法主体太长以至于您确实需要此帮助,那么您的方法可能应该重构。另一方面,我发现没有 final 关键字的参数列表到处都更容易阅读和清晰,所以我倾向于将它们排除在外。