2011-02-14 28 views
6

Cuál es el equivalente de los siguientes código Java en Scala:Scala constructor

import java.util.Random; 

public class Bool { 

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

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

Así que cuando se crea un nuevo objeto Bool, la variable puerta obtendrá automáticamente un valor booleano al azar.

Respuesta

11

En Scala, el cuerpo de la clase es equivalente a los métodos invocados por un constructor en Java. De ahí su clase sería algo como lo siguiente:.

import java.util.Random 

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

    ... // method definitions, etc. 
} 

(cuenta que para ser exigente, ya que no declaró variables Java final, se podría argumentar que los campos deben ser var s aquí en lugar Adicionalmente, su campo random es el paquete protegido que se parece a un descuido, y se hizo en Scala como protected[pkgName] donde pkgName es el nombre del componente más específico del paquete de la clase)

+1

Aunque, por supuesto, 'scala.util.Random' es preferible. :-) –

3

el código Scala más cerca debe ser:.

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

Incluso si el campo público random no parece una buena idea.

5

Aquí es mi opinión:

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

Esto deja abierta la posibilidad de crear una nueva instancia de MyBool con un determinado valor de la puerta, por ejemplo:

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

Dado que sólo puede haber dos diferentes valores de puerta, tendría sentido usar objetos estáticos, como este:

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 
} 

Uso:

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

+1 módulo obsoleto 'case' y falta' val'/'var' en la línea 2. – Raphael

+0

¿No es posible hacer todo en una línea? Al igual que la clase de caso MyBool (puerta var: Boolean = Random.nextBoolean) ... Entonces, a menos que le demos un valor al crear instancias, ¿es Random.nexBoolean? ¿O estoy hablando tonterías? – blackened

+1

@Raphael: No, el 'caso' definitivamente se necesita allí. Cada argumento de un constructor de clase de caso es automáticamente un 'val' público. Además, agrega una gran cantidad de golosinas automáticamente, como implementaciones razonables de 'equals',' hashCode' y 'toString', así como los métodos complementarios' apply' y 'unapply'. Por lo tanto, mejor no se debe dejar de lado. – Madoc

Cuestiones relacionadas