到目前为止的搜索结果让我相信,如果没有非主构造函数,这是不可能的
class Foo { // NOT OK: 2 extra lines--doesn't leverage Scala's conciseness
private var _x = 0
def this(x: Int) { this(); _x = x }
def x = _x
}
val f = new Foo(x = 123) // OK: named parameter is 'x'
或牺牲主构造函数中的参数名称(使使用命名参数的调用变得丑陋)
class Foo(private var _x: Int) { // OK: concise
def x = _x
}
val f = new Foo(_x = 123) // NOT OK: named parameter should be 'x' not '_x'
理想情况下,可以做这样的事情:
class Foo(private var x: Int) { // OK: concise
// make just the getter public
public x
}
val f = new Foo(x = 123) // OK: named parameter is 'x'
我知道命名参数在 Java 世界中是一个新事物,所以它可能对大多数人来说并不那么重要,但是来自命名参数更流行的语言(Python),这个问题立即弹出。
所以我的问题是:这可能吗?(可能不是),如果不是,为什么语言设计没有发现这样一个(在我看来)重要的用例?我的意思是代码要么必须牺牲干净的命名,要么必须牺牲简洁的定义,这是 Scala 的标志。
PS考虑一下一个公共字段突然需要私有化,同时保持getter公共的情况,在这种情况下,开发人员必须更改1行并添加3行才能达到效果,同时保持界面相同:
class Foo(var x: Int) {} // no boilerplate
->
class Foo { // lots of boilerplate
private var _x: Int = 0
def this(x: Int) { this(); _x = x }
def x = _x
}