最终声明不能修改的对象引用,例如
private final Foo something = new Foo();
创建一个新的Foo,并将引用放在某物中。此后,不可能改变一些东西来指向一个不同的Foo实例。
这不妨碍修改对象的内部状态。我仍然可以在有关范围内访问Foo的任何方法。如果这些方法中的一个或多个修改该对象的内部状态,则final将不会阻止该对象的内部状态。
因此,以下内容:
private final Set fixed = new HashSet();
不会创建不能添加或以其他方式更改的集合;这只是意味着固定的只会引用该实例。
相反,做:
private Set fixed = Collections.unmodifiableSet( new HashSet() );
创建一个Set的实例,如果尝试调用fixed.add()或fixed.remove(),则该对象将抛出UnsupportedOperationException – 对象本身将保护其内部状态并阻止其被修改。
为了完整起见:
private final Set fixed = Collections.unmodifiableSet( new HashSet() );
创建一个Set的实例,它不允许其内部状态被改变,也意味着固定的只会指向该集合的一个实例。
final可以用于创建原语的常量的原因是基于不能更改该值的事实。请记住,以上修复只是一个引用 – 一个包含不能更改的地址的变量。那么,对于原语,例如
private final int ANSWER = 42;
ANSWER的值是42.由于ANSWER无法更改,所以它的值只有42。
一个模糊所有行的例子就是这样:
private final String QUESTION = "The ultimate question";
根据上述规则,QUESTION包含代表“最终问题”的String实例的地址,该地址不能更改。这里要记住的是,String本身是不可变的 – 你不能对改变它的String实例做任何事情,否则这样做的任何操作(如替换,子字符串等)将引用完全不同String的实例。
最后
以上就是自然钢铁侠最近收集整理的关于java的collections_Collections.unmodifiableSet()在Java中做什么?的全部内容,更多相关java内容请搜索靠谱客的其他文章。
发表评论 取消回复