scala之Scala 案例类可以排除 setter 吗

Leo_wl 阅读:13 2024-09-03 21:39:00 评论:0

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
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号