java的collections_Collections.unmodifiableSet()在Java中做什么?

最终声明不能修改的对象引用,例如

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的实例。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值