代码之家  ›  专栏  ›  技术社区  ›  Onorio Catenacci

在Scala中将类变量用作常量

  •  19
  • Onorio Catenacci  · 技术社区  · 16 年前

    为一个任务跟踪应用程序编写一个小类,我正在一起开发

    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)
     }
    }
    

    我试图提供三个构造函数:Task(ID,Description), 如果其中一个值不可用,则将这些值初始化为常量值 由来电者提供。我想在外面检查一下 公共VAL允许我在课外进行检查,以便 我确信我的状态是我所期望的。

    但是,由于某些原因,此代码将无法编译。我得到以下错误:

    error: not found: value EmptyID
    

    error: not found: value EmptyDescription
    

    那么我错过了什么?我正在学习“Scala编程”,所以 如果这个问题有一个简单的答案,请给我一页 第62页,我不明白为什么这个代码会失败。

    我猜这和这些都是 构造函数方法,可能两个VAL未初始化 有什么方法可以达到我想要的效果?

    3 回复  |  直到 16 年前
        1
  •  43
  •   Germán    16 年前

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

    object Task { 
     val EmptyID = 0
     val EmptyDescription = "No Description"
    }
    

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

    我认为Scala2.8支持默认值。

        2
  •  8
  •   Daniel Spiewak    16 年前

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

        3
  •  1
  •   Don Mackenzie    16 年前