我有一个十六进制网格的整数坐标结构,我将从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还是无关紧要?
答案 0 :(得分:4)
您应该将它们实现为val
。 def
关键字定义了一个方法,因此每次调用该方法时,都会执行该方法。换句话说,使用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)
。