1
Scala案例類可否排除setter,例如:即:Scala案例類可否排除setter?
case class Foo (foo: String, bar: Integer)
會封裝一個名爲String和Integer,並保持它們從外部不可變。
或者,等價地,您可以創建一個無身體類,它具有輸入參數和getter對於他們,在一個不道德的行代碼中?
Scala案例類可否排除setter,例如:即:Scala案例類可否排除setter?
case class Foo (foo: String, bar: Integer)
會封裝一個名爲String和Integer,並保持它們從外部不可變。
或者,等價地,您可以創建一個無身體類,它具有輸入參數和getter對於他們,在一個不道德的行代碼中?
除非明確說明,否則所有類默認情況下都不包含Scala中的setter,即使是case類。 foo
和bar
都是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
一樣適用
謝謝你,我沒有意識到case類不能啓用setter,除非在函數原型中明確使用vars。謝謝!! – matanster 2014-09-27 15:55:46