【问题标题】:Can a Scala case class exclude setters?Scala 案例类可以排除二传手吗?
【发布时间】:2014-09-27 23:43:38
【问题描述】:

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

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

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

或者,等效地,您能否在一行不拘一格的代码中创建一个包含输入参数和 getter 的无主体类?

【问题讨论】:

  • 几年后,我仍然觉得很遗憾,案例类是该语言的一个全有或全无的特性。我宁愿为 scala 提供某种 lombok。

标签: scala


【解决方案1】:

默认情况下,Scala 中的所有类都没有设置器,除非明确说明,即使是案例类。 foo 和 bar 都是 val,而不是 var(在函数式编程领域的数据不变性方面),因此 case 类已经缺少 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)

至于用不是case class 的getter 创建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 一起使用

【讨论】:

  • 谢谢,我没有意识到除非在函数原型中明确使用变量,否则案例类不会启用设置器。谢谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多