在运行时用Java添加(或删除)对象到最终的静态HashSet?

时间:2012-11-16 19:39:22

标签: java static runtime set final

我正在使用Java 4;前段时间我遇到了一个在公共类中声明的变量:

final private static Set name = new HashSet(){
  {
     add(object1); 
     ...; 
     add(objectN);
  }
};

我需要在某些情况下在运行时添加(或删除)对象。

该类有一个公共构造函数,在我不得不向对象添加或删除对象之前调用它。

我认为最终变量被视为常量,因此我无法在运行时调用它上面的.add(object)和.remove(object)方法。但无论如何我做了它,我创建了两个公共方法来执行添加和删除操作,并且它有效。

为什么呢?我希望它不要编译或在运行时抛出某种异常。

有人可以解释一下吗?

非常感谢,

最好的问候

3 个答案:

答案 0 :(得分:2)

您无法更改最终变量的引用,但可以更改状态。

例如:

您无法更改name = new HashSet();

等参考

答案 1 :(得分:2)

name变量的引用基本上是常量,无法修改。但是,如您发现的那样,集合的内容可以在运行时进行变更。为了防止这种情况,您可以将其设为 immutable ,例如

final private static Set name = Collections.unmodifiableSet(new HashSet(){
    {
        add(object1); 
        ...; 
        add(objectN);
    }
});

答案 2 :(得分:1)

在它们所属的类的构造函数执行后,不能为最终变量赋予新引用。但是,你肯定可以通过调用它们的方法来改变它们的内部状态。