2014-09-27 28 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