关于Java的决赛和Lists / HashSets的意见

时间:2012-08-31 06:00:50

标签: java coding-style standards

有一个关于在finalHashSetList等中使用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约定必须对此持有立场或评论。

4 个答案:

答案 0 :(得分:2)

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

但是,请注意staticstatic变量将使其成为类变量,这意味着所有实例共享相同的引用。在某些情况下,这可能是完全错误的。当您需要每个实例都有自己的用户名实例时,您不希望将其设为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;调用者提供给您的班级的列表。