类构造函数中的非字段参数?



是否有可能拥有不成为字段的构造函数参数?例如

class Foo(p1: String, p2: Int) {
val f1 = p1 * p2
}

我唯一想要的字段是f1,而不是p1p2。这个想法是从参数派生字段。

这很好 -p1p2都不是这里的字段,只是f1.将它们设置为字段是选择加入而不是选择退出(案例类除外,其中所有参数也是字段,您无法对此执行任何操作(。

使它们成为字段,您必须添加varval,类似于

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成为一个领域。除了不以这种方式使用它们之外,没有办法避免它。

最新更新