有一个关于在final
,HashSet
,List
等中使用Set
构造的办公室查询。
假设您有一个要更新的用户名列表。列表本身不会重新初始化,只是它的值发生了变化。
然后提出了一个问题,即用户名变量是否应该是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
不可修改是有效的,因此大写字母&amp; final
没问题。
思考? Java惯例会说什么?
我对答案真的很感兴趣,并且相信这是一个问题。 Java约定必须对此持有立场或评论。
答案 0 :(得分:2)
将其声明为final
可能是一种很好的方法。它基本上告诉您不允许将final
变量的引用更改为另一个实例。
但是,请注意static
。 static
变量将使其成为类变量,这意味着所有实例共享相同的引用。在某些情况下,这可能是完全错误的。当您需要每个实例都有自己的用户名实例时,您不希望将其设为static
。
答案 1 :(得分:1)
大写字母通常用于表示常量,通常是基元或字符串,但有时可以引用对象。实际上它们很少出现在基本数据结构中,例如List。我会说在这种情况下使用大写字母是不好的形式。
将变量标记为final
的适当性取决于上下文,而它用于常量,这不是唯一用途。如果它适用于永远不会再次分配的列表,则具有较低的最终结果,例如,
private static final List<String> usernames = new List<String>();
将是最好的方式。
答案 2 :(得分:-1)
说到
在Java集合(映射,集合和列表)的上下文中,将Java声明为final是不会使它们无法修改的。当我说集合/容器是可修改/不可修改的时,它实际上意味着我可以/不能修改它的内容。因此,使用声明它们最终实际上意味着对该集合的引用是不可修改的,但是集合本身是可修改的。假设您想让它们不可修改,您需要做的是,最终关键字
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声明集合时也要小心,因为容器可用于所有对象。检查你的意图是否真的需要这种设计,并确定你为什么要这样做。
答案 3 :(得分:-1)
将列表标记为最终列表不会使列表无法修改。相反,将其标记为最终只会使其无法重新初始化。
如果您真的想要一个不可修改的列表,我建议您查看Guava的ImmutableList。
以下是ImmutableList文档的片段:
与Collections.unmodifiableList(java.util.List)不同,它是一个可以更改的单独集合的视图,ImmutableList的实例包含自己的私有数据,永远不会更改。 ImmutableList方便公共静态最终列表(&#34;常量列表&#34;),也可以让你轻松制作一个&#34;防御性副本&#34;调用者提供给您的班级的列表。