scala - Scala 案例类可以排除 setter 吗?

标签 scala

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

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

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

或者,等效地,您能否在一行普通代码中创建一个具有输入参数和它们的 getter 的无主体类?

最佳答案

默认情况下,Scala 中的所有类都没有 setter,除非明确说明,甚至是 case 类。 foobar 都是 val,而不是 var(在函数式编程的世界中数据不可变的脉络),所以案例类已经缺少 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 和不是 case class 的 getter,当然,这也很简单:

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

在这里你只需要显式地把 val 放在构造函数的参数中来告诉编译器你想要创建公共(public)字段,而不是私有(private)字段,当然这适用于 var 太像以前了

关于scala - Scala 案例类可以排除 setter 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26076144/

相关文章:

scala - 在 Scala 中对实用程序函数进行分组的首选方式?

Scala 对函数参数名称的反射

scala - 从 RDD 访问 KafkaOffset 时出现异常

scala - Scala 中的 TraversableOnce、Future 和 Option 用于理解

function - 命名方法和命名函数的定义是什么?

Scala REPL不打印范围

scala - Spark Dataframe - 如何从结构类型列中获取特定字段

scala - 我可以使用特征中的方法覆盖 scala 类方法吗?

斯卡拉 Spark UDF ClassCastException : WrappedArray$ofRef cannot be cast to [Lscala. Tuple2

Scala 类主体或主构造函数主体