2011-02-14 152 views
6

什么是相当于下面的斯卡拉Java代码:斯卡拉构造

import java.util.Random; 

public class Bool { 

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

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

所以创建一个新的布尔对象时,门变量将自动获得一个随机的布尔值。

回答

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字段是包保护它看起来像一个疏忽,并会在Scala中被渲染为protected[pkgName]其中pkgName是类包的最具体的组件的名称)

+1

虽然,`scala.util.Random`当然更可取。 :-) – 2011-02-14 19:00:00

3

越接近Scala代码应该是:

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

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

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 
+0

+1模2过期的`case`和缺少`val` /`var`在第2行。 – Raphael 2011-02-14 18:30:33