对于 val 修饰的 mutable 类型的数据和 var 修饰的 immutable 类型的数据,两者之间,哪只种方式更安全呢?
这是一个十常见的问题,难的是找到两者之间的共同点。
首先,我们应该最大程度遵守引用透明性的原则。那什么是引用透明性呢?也就是说,如果存在一个表达式 e ,对于 val x = e 成立,并且 可以用 x 替代 e ; 这是可变性的特点。无论你什么时候设计一个代码决策,最好能够最大限度地遵守引用透明性的原则。
在实际开发中,对于方法内的 var ,其安全性是最高的,因为它不会逃逸到方法外部,也就不存在更改的可能性。如果实际代码中,并不如此,就尽量将方法分解成副作用最小的方法。
另一方面,一个可变的集合有可能逃脱,即使它没有。在更改代码时,您可能希望将其传递给其他方法,或者返回它。这是一种打破引用透明性的东西。
在一个对象(一个字段)上,如果发生逃逸,会产生更可怕的后果。无论哪种方式,对象都具有状态,因此,打破了引用透明性。但是,拥有一个可变的集合意味着即使对象本身也可能由于被修改而失去对自身状态的控制。