自动为类参数创建getter(以避免大小写类)?

时间:2012-09-10 15:28:06

标签: scala

在Scala中,如果我们有

class Foo(bar:String)

我们可以创建新对象但无法访问bar

val foo = new Foo("Hello")
foo.bar // gives error

但是,如果我们声明Foocase class,则可以使用

case class Foo(bar:String) 
val foo = Foo("hello")
foo.bar // works

由于这个原因,我被迫将我的许多课程作为案例类。否则,我必须编写用于访问bar的样板代码:

class Foo(bar:String) {
  val getbar = bar
}

所以我的问题是:

  1. 有没有办法在不使用案例类或样板代码的情况下“修复”这个?
  2. 在这种情况下使用案例类是个好主意吗? (或案例类的缺点是什么?)
  3. 我想第二个问题值得单独提问。

2 个答案:

答案 0 :(得分:18)

只需在构造函数中使用val关键字即可公开访问:

class Foo(val bar:String) {

}

至于你的问题:如果这是你需要的唯一功能,不要使用案例类,只需用val写。

但是,很高兴知道为什么案例类不好。

如果类所有参数默认为public,而在普通类中它们都是私有的。但你可以调整这种行为:

scala> class Foo(val bar:String, baz: String)
defined class Foo

scala> new Foo("public","private")
res0: Foo = Foo@31d5e2

scala> res0.bar
res1: String = public

scala> res0.baz
<console>:10: error: value baz is not a member of Foo
              res0.baz

即便如此:

class Foo(private[mypackage] val bar:String) {
  // will be visible only to things in `mypackage`
}

对于案例类(感谢@JamesIry):

case class Bar(`public`: String, private val `private`: String)  

答案 1 :(得分:5)

您可以使用BeanProperty批注自动生成类似java的getter

import scala.reflect.BeanProperty
case class Foo(@BeanProperty bar:String) 

现在Foo有一个返回bar值的getBar方法。

请注意,这只有在你有充分的理由使用类似java的getter时才有用(典型的原因是你需要你的类成为一个合适的java bean,以便使用期望java bean的java库和使用反射来访问bean的属性。)

否则,只需直接访问bar值,这就是“scala方式”。

请参阅http://www.scala-lang.org/api/current/index.html#scala.reflect.BeanProperty