Scala构造函数

时间:2011-02-14 15:50:29

标签: scala

Scala中以下Java代码的等价物是什么:

import java.util.Random;

public class Bool {

 private boolean door;
 Random random = new Random();

 Bool() {
  this.door = random.nextBoolean();
 }
}

因此,当创建新的Bool对象时,门变量将自动获得随机布尔值。

3 个答案:

答案 0 :(得分:11)

在Scala中,类的主体等同于Java中构造函数调用的方法。因此,您的课程将如下所示:

import java.util.Random

class Bool {
    private val random = new Random
    private val door = random.nextBoolean()

    ... // method definitions, etc.
}

(注意,为了挑剔,因为你没有声明你的Java变量final,有人可能会认为字段应该是var在这里。另外,你的random field受包受保护,看起来像一个疏忽,并将在Scala中呈现为protected[pkgName],其中pkgName是类'包的最具体组件的名称。)

答案 1 :(得分:5)

这是我的看法:

case class MyBool(door: Boolean = Random.nextBoolean)

这样就可以创建一个具有特定门值的MyBool新实例,例如:

val x1 = MyBool() // random door
val x2 = MyBool(true) // door set explicitly

由于只能有两个不同的门值,因此使用静态对象是有意义的,如下所示:

sealed trait MyBool {
  def door:Boolean
}
object MyBool {
  case object True extends MyBool {
    def door = true
  }

  case object False extends MyBool {
    def door = false
  }

  def apply:MyBool = if(Random.nextBoolean) True else False
}

用法:

val x1 = MyBool() // random door value
val x2 = MyBool.True // explicit door value

答案 2 :(得分:3)

更接近的scala代码应为:

class Bool {
  var random = new Random
  private var door = random.nextBoolean
}

即使公共random字段看起来不是一个好主意。