2014-09-27 83 views
1

Scala案例類可否排除setter,例如:即:Scala案例類可否排除setter?

case class Foo (foo: String, bar: Integer) 

會封裝一個名爲String和Integer,並保持它們從外部不可變。

或者,等價地,您可以創建一個無身體類,它具有輸入參數和getter對於他們,在一個不道德的行代碼中?

回答

12

除非明確說明,否則所有類默認情況下都不包含Scala中的setter,即使是case類。 foobar都是vals,而不是vars(功能性編程世界中的數據不可變性),所以case類已經缺少setters,根據需要。

關注:

scala> case class Foo(foo: String, bar: Integer) 
defined class Foo 

scala> val a = Foo("hello", 12) 
a: Foo = Foo(hello,12) 

scala> a.foo = "meh" 
<console>:10: error: reassignment to val 
     a.foo = "meh" 
      ^

scala> case class MutableFoo(var foo: String, var bar: Integer) 
defined class MutableFoo 

scala> val b = MutableFoo("hello", 21) 
b: MutableFoo = MutableFoo(hello,21) 

scala> b.foo = "bleh" 
b.foo: String = bleh 

scala> b 
res10: MutableFoo = MutableFoo(bleh,21) 

作爲創建的getter不是一個class一個case class,肯定的,那太容易了:

scala> class Bar(val foo: String, val bar: Int) 
defined class Bar 

scala> val c = new Bar("hi", 22) 
c: Bar = [email protected] 

scala> c.foo 
res11: String = hi 

scala> c.bar 
res12: Int = 22 

在這裏你只需要明確提出val在構造函數參數告訴編譯器你想公開字段,而不是私有字段,當然這與var一樣適用

+0

謝謝你,我沒有意識到case類不能啓用setter,除非在函數原型中明確使用vars。謝謝!! – matanster 2014-09-27 15:55:46