使Java对象不可变的缺点

使Java对象不可变的缺点,java,immutability,Java,Immutability,一位面试官问我使课堂一成不变的缺点。我给出了一个关于不可变对象占用的堆空间以及它如何降低Java应用程序性能的答案 在Java中使对象不可变还有哪些缺点?如果应用程序不要求对象是可变的,那么使其不可变也没有缺点,您应该这样做 如果存在应用程序需求,则对象是可变的,然后使其可变。缺点是必须创建新对象才能更改其“值”。如果你的类代表了一些“经常改变”的东西,那么你将创建很多对象,把垃圾加载到垃圾收集器上。 你也应该考虑到反易化/实现不可变对象的难度更大,因为它通常需要编写一个没有无参数构造函数的类。

一位面试官问我使课堂一成不变的缺点。我给出了一个关于不可变对象占用的堆空间以及它如何降低Java应用程序性能的答案


在Java中使对象不可变还有哪些缺点?

如果应用程序不要求对象是可变的,那么使其不可变也没有缺点,您应该这样做


如果存在应用程序需求,则对象是可变的,然后使其可变。

缺点是必须创建新对象才能更改其“值”。如果你的类代表了一些“经常改变”的东西,那么你将创建很多对象,把垃圾加载到垃圾收集器上。

你也应该考虑到反易化/实现不可变对象的难度更大,因为它通常需要编写一个没有无参数构造函数的类。

让我们使用一个BigInteger

BigInteger i1 = BigInteger.valueOf(1);
它有add方法,但不能向其中添加1,它是不可变的,所以您要做的是

BigInteger i2 = i1.add(i1);

也就是说,每次都会创建一个新对象,即使用不可变BigInteger的算法非常慢

@dfa很好地回答了这个问题[here][1]。[1] :什么应用程序要求指定对象必须是可变的?不可变对象永远不会更改,但这并不意味着不能在更改单个属性的情况下创建新对象。我认为Java对象的可变性与不可变性不是应用程序需求的问题,而是风格的问题。我们都习惯了不可变的Java字符串…@RudolphEst,例如,一个跟踪谁登录的聊天服务器,一个统计处理的电子邮件总数的分析器,一个员工在收到工作时会停止倾听,这是并发任务的最大数量,或者会关闭…@RudolphEst我想前两个问题有纯粹的功能性解决方案,但我不知道一个长时间运行的对象是否能够同时支持关闭和不可变。即使功能技术不可用,不可变对象也很有用。同意,在Java环境中,这可能有点过头了。大多数情况下,我认为不可变类可以用作数据对象,而不是在其他情况下。我非常同意当不变性变得复杂时需要monad和其他函数魔法(至少对我们这些可怜的Java开发人员来说是如此),但这是可以做到的。这是一个正确的观点,但一般来说,即使只有参数化构造函数的类也可以使用函数进行序列化和反序列化。然而,它给Hibernate(例如)或某些序列化程序的使用增加了复杂性。我认为内存消耗(以及扩展垃圾收集)问题可能是最重要的考虑因素,尽管Java字符串显示了相反的推理,但它们有很多,而且它们可以非常频繁地更改,但由于它们可以共享内部地址空间,因此使它们不可变实际上可以提高内存使用率+1@RudolphEst仅插入常量(即硬编码)字符串。如果字符串“更改”,将创建一个新字符串