微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我应该根据 Java 约定将最终的“Atomic...”成员字段命名为常量全部大写吗?

如何解决我应该根据 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 举报,一经查实,本站将立刻删除。