Scala案例类可以排除setter,例如的是:
case class Foo (foo: String, bar: Integer)
将封装一个命名的String和Integer,并使它们从外部保持不变。
或者,等效地,您是否可以在一个不常见的代码行中创建一个具有输入参数和getter的无体类?
答案 0 :(得分:12)
默认情况下,所有类在Scala中都没有setter,除非明确说明,甚至是case类。 foo
和bar
都是val,而不是vars(在函数式编程领域的数据不变性的情况下),因此案例类已根据需要缺少setter。
观看:
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)
至于使用不是class
的getter创建case class
,当然也很容易:
scala> class Bar(val foo: String, val bar: Int)
defined class Bar
scala> val c = new Bar("hi", 22)
c: Bar = Bar@43c89f32
scala> c.foo
res11: String = hi
scala> c.bar
res12: Int = 22
在这里你只需要在构造函数args中明确地放置val
来告诉编译器你想要创建公共字段而不是私有字段,当然这也适用于var
之前的1}