什么是不可变的?

这可能是有史以来问过的最愚蠢的问题,但我认为对于一个Java新手来说,这是相当令人困惑的

  1. 有人能澄清什么是不可变的吗
  2. 为什么字符串是不可变的
  3. 不可变对象的优点/缺点是什么
  4. 为什么像StringBuilder这样的可变对象应该优先于字符串和反之亦然

一个很好的例子(在Java中)将非常感谢

不可变意味着一旦对象的构造函数完成了执行,该实例就不能被更改

这很有用,因为这意味着您可以传递对对象的引用,而不用担心其他人会更改其内容特别是在处理并发性时,永远不会更改的对象没有锁定问题

e、 g

类Foo
{
私有最终字符串myvar;
public Foo(最终字符串初始值)
{
this.myvar=初始值;
}
公共字符串getValue()
{
返回this.myvar;
}
}

Foo不必担心getValue()的调用方可能会更改字符串中的文本

如果您设想一个类似于Foo的类,但是成员是StringBuilder而不是String,那么您可以看到getValue()的调用方能够更改Foo实例的StringBuilder属性

还要注意您可能会发现的不同类型的不变性:Eric Lippert写了一篇关于这一点的博客文章。基本上,您可以拥有接口不可变但在幕后实际可变的私有状态(因此不能在线程之间安全共享)的对象

发表评论