Scala:常量属性val或def

时间:2012-05-10 01:16:46

标签: scala constants

我有一个十六进制网格的整数坐标结构,我将从C#移植到Scala,如下所示:

object Cood
{
  def Up = new Cood(0, 2)
  def UpRight = new Cood(1, 1)
  def DownRight = new Cood(1,- 1)
  def Down = new Cood(0, - 2)
  def DownLeft = new Cood(- 1, - 1)
  def UpLeft = new Cood(- 1, + 1)
  def None = new Cood(0, 0)
}

class Cood(val x: Int, val y: Int)
{
   //more code
}

由于非基本类型没有常量,因此它们是静态获取属性。在Scala中我应该将它们实现为def或val s还是无关紧要?

2 个答案:

答案 0 :(得分:4)

您应该将它们实现为valdef关键字定义了一个方法,因此每次调用该方法时,都会执行该方法。换句话说,使用val Cood对象将被创建一次并存储,但使用def时,每次访问时都会创建一个新副本。

如果您担心创建可能未使用的对象,那么您应该尝试lazy val,这是仅在第一次访问时填充的val。

答案 1 :(得分:2)

您应该将您的Cood类实现为case class

case class Cood(x: Int, y: Int)

就是这样,不需要额外的getter / setter,equality方法,toString或者提取器来进行模式匹配。

但是,如果您只是想将它作为普通课程,请写下class Cood(val x: Int, val y: Int)