2011-02-14 93 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