复制一个数据类

如果我们使用不可修改的对象,就像我们之前讲过的,假如我们需要修改这个对象状态,必须要创建一个新的一个或者多个属性被修改的实例。这个任务是非常重复且不简洁的。

举个例子,如果我们需要修改Forecast中的temperature(温度),我们可以这么做:

val f1 = Forecast(Date(), 27.5f, "Shiny day")
val f2 = f1.copy(temperature = 30f)

如上,我们拷贝了第一个forecast对象然后只修改了temperature的属性而没有修改这个对象的其它状态。

当你使用Java类时小心"不可修改性"

如果你决定使用不可修改来工作,你需要意识到Java不是根据这种思想来设计的,在某些情况下,我们仍然可以修改这些状态。在上一个例子中,你还是可以访问Date对象,然后改变它的值。有个简单(不安全)的方法是记住所有需要修改状态的对象作为一个规则,然后必要的时候去拷贝一份。

另外一个方法是封装这些类。你可以创建一个ImmutableDate类,它封装了Date并且不允许去修改它们的状态。决定哪种方式取决于你。本书中,我不会对不可修改性太限制,所以我不会去为一些危险的类去创建一个封装类。