是否有可能拥有不成为字段的构造函数参数?例如
class Foo(p1: String, p2: Int) {
val f1 = p1 * p2
}
我唯一想要的字段是f1
,而不是p1
和p2
。这个想法是从参数派生字段。
这很好 -p1
和p2
都不是这里的字段,只是f1
.将它们设置为字段是选择加入而不是选择退出(案例类除外,其中所有参数也是字段,您无法对此执行任何操作(。
要使它们成为字段,您必须添加var
或val
,类似于
class Foo(val p1: String, var p2: Int)
编辑: 如果你想要一个与参数同名但类型不同的字段,你可以做这样的事情:
class Foo(p1: String, val p2: Int) {
//Can be val if you want
var _p1: Int = (p1 : String).toInt
def p1: Int = _p1
def p1_=(p1: Int) = _p1 = p1 //An optional setter
}
这实际上与拥有一个名为p1
的字段相同。
如果您还想使用一些复杂的操作设置字段并使用局部变量,则可以使用块(也许还有一个辅助构造函数(
class Foo(p1: String, val p2: Int) {
val _p1: Int = {
val intermediateVariable: String = p1
intermediateVariable.toInt
}
def p1: Int = _p1
或
class Foo(val p1: Int) {
def this(p1: String) = this({
val uselessIntermediateVariable = p1.toInt
uselessIntermediateVariable
})
}
在一个简单的类中,如果不添加任何修饰符作为 val 或 var,则构造函数的参数是私有元素。例:
class C(val a: Int, b: Int) {
val c = a + b
}
val i = new C(1,2)
println(i.a) // it's public
println(i.b) // this line won't allow you to compile, it's private
println(i.c) // also public
例外情况是你创建一个 case 类,使用 case 修饰符构造函数的所有参数都是公共的。您可以将它们设为私有标记为私有参数。例:
case class C(a: Int, private val b: Int) {
val c = a + b
}
val i = new C(1,2)
println(i.a) // it's public
println(i.b) // this line won't allow you to compile, it's private
println(i.c) // also public
只是为了澄清现有的答案,非大小写类参数可以自动成为字段,但前提是它们用于方法或lazy val
初始值设定项,例如
class Foo(p1: String, p2: Int) {
val f1 = p1 * p2
def m1() = p1 + p1
}
将使p1
成为一个领域。除了不以这种方式使用它们之外,没有办法避免它。