Scala案例类可以排除setter吗?

时间:2014-09-27 15:20:41

标签: scala

Scala案例类可以排除setter,例如的是:

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

将封装一个命名的String和Integer,并使它们从外部保持不变。

或者,等效地,您是否可以在一个不常见的代码行中创建一个具有输入参数和getter的无体类?

1 个答案:

答案 0 :(得分:12)

默认情况下,所有类在Scala中都没有setter,除非明确说明,甚至是case类。 foobar都是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之前的