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