gpt4 book ai didi

Scala 构造函数、命名参数和隐式 Getter/Setter

转载 作者:行者123 更新时间:2023-12-04 03:05:38 24 4
gpt4 key购买 nike

是否可以在 Scala 构造函数中使用命名参数,然后在不破坏构造函数接口(interface)或使代码非常难看的情况下覆盖 getter 和 setter?

获取以下 scala 代码

class Person( var FirstName: String, var LastName: String )

干净整洁。这将创建一个名为 person 的简单类,我们可以通过以下方式使用它
val john = new Person( FirstName="John", LastName="Doe" )
john.FirstName = "Joe"
println( john.FirstName )

稍后,我们决定要向 FirstName setter 添加一些验证。因此,我们创建一个新的私有(private)局部变量并覆盖 getter 和 setter 方法
class Person( var _FirstName: String, var _LastName: String ) {

def FirstName = _FirstName
def FirstName_= (value:String) = _FirstName = value

}

仍然有些干净,但是为了做到这一点,我们不得不更改构造函数参数名称,从而破坏了外部接口(interface)。

我想出的第一个解决这个问题的方法是
class Person {
var _FirstName:String = null
var LastName:String = null

def FirstName = _FirstName
def FirstName_= (value:String) = _FirstName = value

def this( FirstName: String, LastName: String ){
this()
this._FirstName = FirstName
this.LastName = LastName
}

}

这有点丑陋和不雅,并且消除了我最初使用 scala 的大部分好理由。

有没有更好的方法来做到这一点?

tl;dr 如何覆盖默认构造函数中定义的成员的 getter/setter 而不使代码丑陋或更改公共(public)接口(interface)?

最佳答案

你考虑过使用伴生对象吗?

class Person private (f: String, l: String ) {
var FirstName = f
var LastName = l
}

object Person {
def apply(FirstName:String, LastName:String) =
new Person(FirstName, LastName)
}

关于Scala 构造函数、命名参数和隐式 Getter/Setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5066684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com