Scala在不可变对象上为"setter"命名约定

oll*_*erg 8 scala conventions

我不知道在不可变对象上叫什么叫"setter"?

对于一个可变对象Person,setter的工作方式如下:

class Person(private var _name: String) {
  def name = "Mr " + _name
  def name_=(newName: String) {
    _name = newName
  }
}

val p = new Person("Olle")
println("Hi "+ p.name)
p.name = "Pelle"
println("Hi "+ p.name)
Run Code Online (Sandbox Code Playgroud)

这一切都很好,但如果Person是不可变的呢?

class Person(private val _name: String) {
  def name = "Mr " + _name
  def whatHereName(newName: String): Person = new Person(newName)
}

val p = new Person("Olle")
println("Hi "+ p.name)
val p2 = p.whatHereName("Pelle")
println("Hi "+ p2.name)
Run Code Online (Sandbox Code Playgroud)

应该whatHereName叫什么?

编辑: 我需要把东西放在"setter"方法中,如下所示:

class Person(private val _name: String) {
  def name = "Mr " + _name
  def whatHereName(newName: String): Person = {
    if(name.length > 3)
      new Person(newName.capitalize)
    else
      throw new Exception("Invalid new name")
  }
}
Run Code Online (Sandbox Code Playgroud)

真正的代码比这大得多,所以对copy方法的简单调用是行不通的.

编辑2:

由于我的伪造例子有很多评论(这是不正确的)我最好给你真正的类()的链接Avatar.

我不知道该叫什么的"二传手"方法updateStrength,updateWisdom......但我可能会withStrength很快改变它.

Mik*_*erg 13

我喜欢jodatime的方式.这将是withName.

val p = new Person("Olle")
val p2 = p.withName("kalle");
Run Code Online (Sandbox Code Playgroud)

更多jodatime示例:http://joda-time.sourceforge.net/


Ole*_*ako 10

为此,Scala案例类具有自动生成的方法副本.它的使用方式如下:

val p2 = p.copy(name = "Pelle")