3

final有一个关于在 Java 中为HashSetListSet等使用构造的办公室查询。

假设您有一个要更新的用户名列表。列表本身不会被重新初始化,只是它的值发生了变化。

然后提出了用户名变量是否应该是 a 的问题final

private static final List<String> USERNAMES = new List<String>();
...
USERNAMES.add("user1");

或者

private static List<String> usernames = new List<String>();
...
usernames.add("user1");

我的问题是,按照惯例,您会使用哪个?

可以提出该论点,暗示它不可修改的大写字母在这里无效,因为您可以修改列表的内容(您不能修改列表实例本身)。因此,它实际上不是一个常数。

出于同样的原因,说list不可修改是有效的,因此大写 &final很好。

想法?Java 约定会说什么?

我真的对答案很感兴趣,并相信这是一个问题。Java 约定必须对此有立场或评论。

4

4 回答 4

2

将其声明为final可能是一个好方法。它基本上告诉您不允许将final变量的引用更改为另一个实例。

但是,请小心使用static. 变量将static使其成为类变量,这意味着所有实例共享相同的引用。在某些情况下,这可能是完全错误的。当您需要每个实例都有自己的用户名实例时,您不会想要创建static.

于 2012-08-31T06:05:20.527 回答
1

大写字母通常用于暗示一个常数,通常是一个原始的或字符串,但有时可以指代一个对象。在实践中,它们很少以基本数据结构的形式出现,例如列表。我会说在这种情况下使用大写字母是不好的形式。

将变量标记为的适当性final取决于上下文,虽然它用于常量,但这不是唯一的用途。如果列表不再被分配是合适的,那么有一个小写的最后,例如,

private static final List<String> usernames = new List<String>();

将是最好的方式。

于 2012-08-31T06:06:34.403 回答
-1

将列表标记为最终列表不会使列表不可修改。相反,将其标记为 final 只会使其无法重新初始化。

如果您真的想要一个不可修改的列表,我建议您查看 Guava 的ImmutableList

这是 ImmutableList 文档中的一个片段:

与 Collections.unmodifiableList(java.util.List) 不同,后者是仍然可以更改的单独集合的视图,ImmutableList 的实例包含自己的私有数据并且永远不会更改。ImmutableList 对于公共静态最终列表(“常量列表”)很方便,还可以让您轻松地制作由调用者提供给您的类的列表的“防御性副本”。

于 2012-08-31T06:29:22.880 回答
-1

到那个时刻

最终关键字

在 Java 集合(Maps、Sets 和 Lists)的上下文中,将它们声明为 final 并不会使它们不可修改。当我说 collection/container is modified/unmodifyable 时,它​​实际上意味着我可以/不能修改它的内容。所以使用声明它们最终实际上意味着对该集合的引用是不可修改的,但集合本身是可修改的。假设你想让它们不可修改,你要做的是,

UnmodifyableCollection<T> {

  public boolean add(T t){
    throw new  UnsupportedException();
 }

  public T remove(T t){
    throw new  UnsupportedException();
 }

}

类似于上面的内容,不允许添加/删除任何内容。Collections.unmodifyXXX()方法做同样的事情。

最终关键字也有更广泛的用途,例如

1)限制子类化(使类不可变)

2) 限制方法覆盖

3) 定义常量

使用 static final 声明集合时也要小心,因为容器可用于所有对象。检查你的意图是否真的需要那个设计,并确定你为什么想要那个。

于 2012-08-31T06:20:15.767 回答