Scala中以下Java代码的等价物是什么:
import java.util.Random;
public class Bool {
private boolean door;
Random random = new Random();
Bool() {
this.door = random.nextBoolean();
}
}
因此,当创建新的Bool对象时,门变量将自动获得随机布尔值。
答案 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
字段看起来不是一个好主意。