在Scala中使用类变量作为常量

Ono*_*cci 21 syntax scala

我正在努力学习Scala - 来自C++背景.我正在尝试为一个任务跟踪应用程序编写一个小类我正在一起攻击,以帮助我学习如何编写Scala代码.

这似乎应该很简单,但出于某种原因,它让我不知所措:

package com.catenacci.tts

class Task(val ID:Int, val Description:String) {
 val EmptyID = 0
 val EmptyDescription = "No Description"

 def this() = this(EmptyID,EmptyDescription)
 def this(ID:Int)={
   this(ID,EmptyDescription)
 }
 def this(Description:String)={
   this(EmptyID,Description)
 }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试提供三个构造函数:任务(ID,描述),任务(ID),任务(描述).在后两种情况下,如果调用者没有提供其中一个值,我想将值初始化为常量值.我希望能够在课堂外进行检查以进行单元测试.因此,我认为加入两个公共警察可以让我从班级外面检查,以确保我的状态是我所期望的.

但是,由于某种原因,此代码将无法编译.我收到以下错误:

error: not found: value EmptyID
Run Code Online (Sandbox Code Playgroud)

error: not found: value EmptyDescription
Run Code Online (Sandbox Code Playgroud)

那我错过了什么?我正在完成"Scala编程",所以如果对这个问题有一个简单的答案,请给我页码.我不介意阅读,但是按照第60页和第62页的代码,我不明白为什么这段代码失败了.

我猜这与构造函数方法有关,可能两个val在构造函数结束之前都没有初始化.如果是这样的话,是否有某种方法可以获得我正在寻找的效果?

Ger*_*mán 41

您可以在伴随对象中定义常量:

object Task { 
 val EmptyID = 0
 val EmptyDescription = "No Description"
}
Run Code Online (Sandbox Code Playgroud)

然后将它们引用为Task.EmptyID和Task.EmptyDescription.

我认为Scala 2.8支持默认值.


Dan*_*wak 8

请参阅Germán的答案.发生这种情况是因为构造函数在技术上是静态范围的一部分.换句话说,构造函数无法访问任何实例成员,因为尚未创建实例.任何"类成员"实际上都是实例成员,这就是问题中的代码不起作用的原因.Germán的答案通过将两个相关值移动到伴随对象来解决这个问题,这有效地使它们成为Task类的静态成员(不是真的,但你可以这样想).