如何解决我应该根据 Java 约定将最终的“Atomic...”成员字段命名为常量全部大写吗?
当定义一个类型为the Atomic…
classes的变量,并将其标记为final
以避免替换时,这样的变量是否被认为是一个常量?
包含在命名变量中的对象引用不会改变,因为 final
。然而,Atomic…
对象实际上只是一个有效负载的保护性包装器,一个很可能会改变的值。
我的问题的重点是 Java 命名约定。按照惯例,诸如 final
成员字段或 final static
之类的常量应该以全大写命名。所以我开始想知道如何命名 Atomic…
的对象引用,例如 AtomicInteger
。
这是一个人为的示例类。
➥ final private AtomicInteger
应该命名为 count
还是 COUNT
?
package work.basil.example;
import java.util.concurrent.atomic.AtomicInteger;
public class CountUp
{
final private AtomicInteger count; // ? `count` or `COUNT` ?
public CountUp ( )
{
this.count = new AtomicInteger();
}
public int increment ( )
{
return this.count.incrementAndGet();
}
public int getCount ( )
{
return this.count.get();
}
}
您可能认为此问题与 Should a “static final Logger” be declared in UPPER-CASE? 或 Should I use upper-case naming to declare java constant variables? 等重复。但不是。我相信 Atomic…
对象的性质可以解决这个问题。
我的第一个想法是:上下文就是一切。在讨论特定线程安全问题时,我会将 AtomicInteger
称为常量。但在业务逻辑的上下文中,Atomic
的有效负载是要改变的。我不会认为 Atomic
实际上是一个常数。所以我倾向于使用通常的 camelCase 命名。
解决方法
Google 的代码风格指南指出,引用可变对象的最终字段不被视为“常量”,也不大写。
https://google.github.io/styleguide/javaguide.html
引用部分5.2.4 常量名:
但究竟什么是常数?
常量是静态 final 字段,其内容非常不可变,其方法没有可检测的副作用。这包括原语、字符串、不可变类型和不可变类型的不可变集合。如果任何实例的 observable 状态可以更改,则它不是常量。仅仅打算永远不会改变对象是不够的。
该部分的一些示例:
// Not constants
static String nonFinal = "non-final";
final String nonStatic = "non-static";
static final Set<String> mutableCollection = new HashSet<String>();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。