哪个更好:带有mutable.ListMap的var或带有immutable.ListMap的var?

时间:2019-03-28 18:04:27

标签: scala immutability var

我简单地使用var类型的immutable.ListMap变量。不幸的是,项目的代码复杂度并不能使我有机会将其移至immutable val

在审查中,我得到一条评论,将其更改为var的{​​{1}}变量。 就像“您已经拥有mutable.ListMap并且可变不会使事情变得更糟”。

您对此有何看法?是否有任何性能指标或代码样式禁止使用可变变量?在varmutable var之间选择哪个更好?

我已经阅读了

的所有答案

val-mutable versus var-immutable in Scala,注意到其中有很多赞的评论:

  
    
      

将不可变val优先于不可变var而不将可变val优先于可变var

    
  

该陈述有证据或解释吗?

2 个答案:

答案 0 :(得分:1)

var具有可变集合,是双重可变性。

var mm : scala.collection.mutable.xxx = ???

这意味着收藏集mm可以并且可能随时间变化和/或 mm本身可以更改为引用完全不同的收藏集。

可变集合有时很有用。很少需要可变变量,因此应避免使用。类型为可变集合的可变变量?我只是看不出有什么理由。

答案 1 :(得分:1)

ListMap实际上是一个很好的例子,因为在多线程环境中,即使您只是 looking ,也必须synchronize。 另一方面,var的分配是原子的,您根本不需要synchronize,只需将其标记为@volatile即可。

这既提高了性能,又提高了可靠性(每当您的东西需要synchronized访问权限时,有人忘记正确编写代码只是时间问题)。

因此,是的,如果由于某种原因您不能使用“不可变的val”,那么肯定要更喜欢“不可变的var”,而不是“可变的val”,除非有明确而具体的原因要求容器是可变的(例如,地图确实很大并且经常更新,从而导致可测量的性能问题。)

关于“可变变量”,是的,就像提到的其他答案一样,我也不知道为什么在这个世界上你想要那个