Java中不可变对象的优点似乎很明显:
您可以通过使用私有的最终字段和构造函数注入来支持不可变。
但是,在Java中支持不可变的对象有哪些缺点呢?
即
是否有可能设计一个大型系统(深对象图),主要使用不可变的对象?
发布于 2009-04-15 16:25:17
但是,在Java中支持不可变的对象有哪些缺点呢?与ORM或web演示工具不兼容?
基于反射的框架因不可变对象而变得复杂,因为它们需要构造函数注入:
执行的复杂性?
创建不可变对象仍然是一项乏味的任务;编译器应该处理实现细节,就像在groovy中一样。
是否有可能设计一个大型系统(深对象图),主要使用不可变的对象?
是的;不可变对象为其他对象(它们更倾向于组合)提供了很好的构建块,因为当您可以依赖复杂对象的不可变组件时,维护它的不变量要容易得多。我唯一真正的缺点是创建许多临时对象(例如字符串连接在过去是一个问题。)。
发布于 2009-04-15 15:42:48
随着不可变性,任何时候您需要修改数据,您需要创建一个新的对象。这个可能很贵。
想象一下,需要修改一个消耗了几兆内存的对象中的一个位:您需要实例化一个全新的对象,分配内存等等。如果您需要这样做很多次,可更改性就变得非常有吸引力。
发布于 2009-04-15 16:26:48
如果您追求可变性,那么当您需要调用不希望对象更改的方法时,或者您需要返回作为内部状态一部分的对象时,您需要创建一个防御副本。
如果您真正查看使用可变对象的程序,您会发现它们很容易通过修改来“攻击”:
这个问题并不经常出现,因为大多数程序都不会更改数据(实际上它们是不变的,因为它们永远不会改变)。
我个人决定了我能做的每一件事。我可能拥有所有变量的90%-95% (参数、局部、实例、静态、异常等)标记为决赛。在某些情况下,它必须是可变的,但绝大多数情况并非如此。
我想这可能取决于你的注意力。如果您正在编写供第三方使用的库,则要比编写只有您(或您的团队)才能维护的应用程序时更多地考虑这一点。
我发现,您可以使用不可变对象为大多数系统编写大型应用程序,而不会造成太大的痛苦。
https://stackoverflow.com/questions/752280
复制相似问题