Scala中私有var的公共只读访问



序言:我正在教授一门使用Scala进行对象函数编程的课程,我们所做的一件事是提取示例问题,并比较如何使用对象函数编程和基于状态的面向对象编程来实现它们,这是大多数学生的背景。

因此,我想在Scala中实现一个简单的类,它有一个带有public访问器方法的private var(这是基于状态的面向对象编程中非常常见的习惯用法(。看看Alvin Alexander的";Scala烹饪书;建议使用的代码非常可怕:

class Person(private var _age: Int): 
def incrAge() = _age += 1
def age = _age

我说";可怕的";因为我必须发明两个基本上表示age字段的名称,一个用于构造函数,另一个用于类接口。我很好奇,熟悉Scala的人是否知道一种更简单的语法可以避免这种情况?

EDIT:现在我很清楚Scala将val/var声明与给定的可见性(public/private(相结合,因此对于var;突变子是CCD_ 9或两者都是private。根据不同的视角,你可能会发现这是不灵活的,或者觉得它正确地惩罚了你使用var🙂.

是的,更好的方法是不使用var

class Person(val age: Int) {
def incrAge = new Person(age+1)
}

如果你要编写惯用的scala代码,你应该从假装它的某些部分根本不存在开始:主要是vars、nulls和returns,还有可变结构或集合、数组和某些方法,如TryOptionAwait对象上的.get。哦,还有isInstanceOfasInstance

你可以问";如果这些东西不应该被使用,为什么会存在&";。嗯,因为有时,在极少数非常具体的情况下,它们实际上对实现非常有限非常具体的目的很有用。但这可能不到你职业生涯中遇到的案例的0.1%,除非你参与了一些核心的低级别库开发(在这种情况下,你不会在这里发布这样的问题(。

因此,在你掌握了足够的语言,能够明确区分0.1%的病例和99.9%的病例之前,你最好忽略这些语言特征,假装它们不存在(如果你不使用其中一个就无法完成某项任务,请在这里提出问题,人们会很乐意帮助你(。

你说";必须创建两个名称来管理一个字段是很难看的"的确但你知道什么更丑吗?使用vars。

(顺便说一句,在java中,通常这样做的方式是getAgesetAge——仍然是两个名称。丑陋的根源在于允许用给定名称标记的值在程序执行的不同点上不同,而不是突变的语义看起来有多具体(。

最新更新