首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中不可变对象的缺点是什么?

Java中不可变对象的缺点是什么?
EN

Stack Overflow用户
提问于 2009-04-15 15:37:03
回答 17查看 9.3K关注 0票数 35

Java中不可变对象的优点似乎很明显:

  • 一致状态
  • 自动螺纹安全
  • 简单性

您可以通过使用私有的最终字段和构造函数注入来支持不可变。

但是,在Java中支持不可变的对象有哪些缺点呢?

  • 与ORM或web演示工具不兼容?
  • 不灵活的设计?
  • 执行的复杂性?

是否有可能设计一个大型系统(深对象图),主要使用不可变的对象?

EN

回答 17

Stack Overflow用户

回答已采纳

发布于 2009-04-15 16:25:17

但是,在Java中支持不可变的对象有哪些缺点呢?与ORM或web演示工具不兼容?

基于反射的框架因不可变对象而变得复杂,因为它们需要构造函数注入:

  • Java中没有默认参数,这迫使我们始终提供所有必要的依赖项
  • 构造函数重写可能会很麻烦。
  • 构造函数参数名称通常不能通过反射获得,这迫使我们依赖于参数顺序来解决依赖关系。

执行的复杂性?

创建不可变对象仍然是一项乏味的任务;编译器应该处理实现细节,就像在groovy中一样。

是否有可能设计一个大型系统(深对象图),主要使用不可变的对象?

是的;不可变对象为其他对象(它们更倾向于组合)提供了很好的构建块,因为当您可以依赖复杂对象的不可变组件时,维护它的不变量要容易得多。我唯一真正的缺点是创建许多临时对象(例如字符串连接在过去是一个问题。)。

票数 19
EN

Stack Overflow用户

发布于 2009-04-15 15:42:48

随着不可变性,任何时候您需要修改数据,您需要创建一个新的对象。这个可能很贵。

想象一下,需要修改一个消耗了几兆内存的对象中的一个位:您需要实例化一个全新的对象,分配内存等等。如果您需要这样做很多次,可更改性就变得非常有吸引力。

票数 15
EN

Stack Overflow用户

发布于 2009-04-15 16:26:48

如果您追求可变性,那么当您需要调用不希望对象更改的方法时,或者您需要返回作为内部状态一部分的对象时,您需要创建一个防御副本。

如果您真正查看使用可变对象的程序,您会发现它们很容易通过修改来“攻击”:

  • 传递给构造函数的
  • 传递给方法的对象
  • 从方法返回的对象。

这个问题并不经常出现,因为大多数程序都不会更改数据(实际上它们是不变的,因为它们永远不会改变)。

我个人决定了我能做的每一件事。我可能拥有所有变量的90%-95% (参数、局部、实例、静态、异常等)标记为决赛。在某些情况下,它必须是可变的,但绝大多数情况并非如此。

我想这可能取决于你的注意力。如果您正在编写供第三方使用的库,则要比编写只有您(或您的团队)才能维护的应用程序时更多地考虑这一点。

我发现,您可以使用不可变对象为大多数系统编写大型应用程序,而不会造成太大的痛苦。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/752280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档