我简单地使用var
类型的immutable.ListMap
变量。不幸的是,项目的代码复杂度并不能使我有机会将其移至immutable val
在审查中,我得到一条评论,将其更改为var
的{{1}}变量。
就像“您已经拥有mutable.ListMap
并且可变不会使事情变得更糟”。
您对此有何看法?是否有任何性能指标或代码样式禁止使用可变变量?在var
和mutable var
之间选择哪个更好?
我已经阅读了
的所有答案val-mutable versus var-immutable in Scala,注意到其中有很多赞的评论:
将不可变val优先于不可变var而不将可变val优先于可变var
该陈述有证据或解释吗?
答案 0 :(得分:1)
var
具有可变集合,是双重可变性。
var mm : scala.collection.mutable.xxx = ???
这意味着收藏集mm
可以并且可能随时间变化和/或 mm
本身可以更改为引用完全不同的收藏集。
可变集合有时很有用。很少需要可变变量,因此应避免使用。类型为可变集合的可变变量?我只是看不出有什么理由。
答案 1 :(得分:1)
ListMap
实际上是一个很好的例子,因为在多线程环境中,即使您只是 looking ,也必须synchronize
。
另一方面,var
的分配是原子的,您根本不需要synchronize
,只需将其标记为@volatile
即可。
这既提高了性能,又提高了可靠性(每当您的东西需要synchronized
访问权限时,有人忘记正确编写代码只是时间问题)。
因此,是的,如果由于某种原因您不能使用“不可变的val”,那么肯定要更喜欢“不可变的var”,而不是“可变的val”,除非有明确而具体的原因要求容器是可变的(例如,地图确实很大并且经常更新,从而导致可测量的性能问题。)
关于“可变变量”,是的,就像提到的其他答案一样,我也不知道为什么在这个世界上你想要那个。