在Scala中,如果我们有
class Foo(bar:String)
我们可以创建新对象但无法访问bar
val foo = new Foo("Hello")
foo.bar // gives error
但是,如果我们声明Foo
为case class
,则可以使用
case class Foo(bar:String)
val foo = Foo("hello")
foo.bar // works
由于这个原因,我被迫将我的许多课程作为案例类。否则,我必须编写用于访问bar
的样板代码:
class Foo(bar:String) {
val getbar = bar
}
所以我的问题是:
我想第二个问题值得单独提问。
答案 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