【发布时间】:2022-09-24 03:31:08
【问题描述】:
我想在 Scala 中创建一个 Person 类,它有一个私有 var 字段来存储人的年龄,并允许对该字段进行公共读取访问。查看 Alvin Alexander 的“Scala Cookbook”,执行此操作的代码非常可怕:
class Person(private var _age: Int):
def incrAge() = _age += 1
def age = _age
必须创建 _name 是人为的,并且从接口中并不清楚这个构造函数参数本质上与 age 访问器相同。这样做有没有更好的办法?
-
\"这样做有没有更好的办法?\"除了不使用
vars而是使用不可变的案例类之外,不,我想不出\“更好的方法\”.主要是因为我不明白这有什么问题? -
必须创建两个名称来管理单个字段是丑陋的。
age访问器给人的印象是该字段被称为age,但如果在构造函数中使用 pass-by-name,客户端必须记住使用_age。这不会发生在例如Java 或 Ruby。我不能使用案例类,因为我想要具有标识的正确对象。 -
\"这不会发生在例如 Java 或 Ruby 中。\"当然会(至少在爪哇),实际上更糟糕的是,您需要
age属性、getAge方法和构造函数的name参数,并且您需要执行this.age = age来实现相同的行为,您可以使用agein斯卡拉只需将 getter 命名为getAge。 -\"我不能使用案例类,因为我想要具有标识的正确对象\"不知道正确的对象意味着什么,如果您需要使用引用相等,您可以随时使用eq,但这通常是一个坏主意或不必要的。 -
确切地。在 Java 中,尽管存在缺陷,但字段
age可以与用于初始化它的构造函数参数具有相同的名称。我觉得奇怪的是 Scala 没有更优雅地处理这种常见情况。顺便说一句,这解释了对象身份:scala-exercises.org/scala_tutorial/classes_vs_case_classes。 -
无论如何,你可以用更多的样板得到你想要的:scastie.scala-lang.org/BalmungSan/qmBOURkQQuaEmmgPPhdOtg/1
标签: scala constructor