我今天读了一章Effective Java。本章是关于最小化对象的可变性。我非常理解为什么不可变对象是好的,比如线程安全,简单等等。我的问题是因为不可变对象有很多优点,是否有任何可变对象首选的情况?
答案 0 :(得分:11)
当将类从状态A
转换为状态Z
会产生大量中间对象时,您需要可变类来处理这些情况,而您宁愿不花时间创建它们。
一个典型的例子是连接一个字符串数组。假设您需要连接100个字符串,并生成单个结果。如果没有可变字符串,您将需要生成98个中间对象,这些对象几乎可以立即进行垃圾收集。这在CPU上相当浪费,使可变对象成为正确的解决方案。
还有其他需要可变对象的情况。例如,将可变对象传递给方法可以让您收集多个结果,而不会跳过太多语法箍。另一个例子是排序和过滤:当然,你可以创建一个采用原始集合的方法,并返回一个已排序的方法,但这对于大型集合来说会变得非常浪费。
答案 1 :(得分:2)
不可变类可能会浪费内存和垃圾收集器时间,因为更改数据会产生浪费的实例。但是,函数式编程方法对于不可变类非常有效。
功能方法可用于修改数据,然后向开发人员提供不可变类。这种方式可变类从开发人员中抽象出来。功能带来了其他好东西,比如延迟加载和这些抽象调用的幕后优化。
Java 8流API可用于提供处理数据的功能方式。您可能还想尝试Scala,它是Java的一种功能变体。
尽管如此,最好将最复杂和性能至关重要的任务留给更传统的编程实践。通过精心规划的架构和适当的同步,可变对象将非常有效。当仅使用不可变对象时,大量流量使垃圾收集器非常繁忙。
功能编程方法可以合理地抽象出功能的数量总是存在限制。功能编程似乎在前端开发中非常有用,在前端开发中,架构复杂性通常非常高。
答案 2 :(得分:1)
这是因为对象的可变状态/属性的性质。例如,Person
的年龄会发生变化,Employee
的工资会发生变化,Television
的音量/频道/亮度会在一段时间内发生变化等。
Object
的状态会有很多例子可以改变。