2010-03-29 12 views
7

estoy aprendiendo Scala, y no puedo encontrar la manera de expresar mejor esta clase de Java simple en Scala:Equivalente de campos public static final en Scala

public class Color { 
    public static final Color BLACK = new Color(0, 0, 0); 
    public static final Color WHITE = new Color(255, 255, 255);  
    public static final Color GREEN = new Color(0, 0, 255); 

    private final int red; 
    private final int blue; 
    private final int green; 

    public Color(int red, int blue, int green) { 
    this.red = red; 
    this.blue = blue; 
    this.green = green; 
    } 

    // getters, et cetera 
} 

Lo mejor que tengo es la siguiente:

class Color(val red: Int, val blue: Int, val green: Int) 
object BLACK extends Color(0, 0, 0) 
object WHITE extends Color(255, 255, 255) 
object GREEN extends Color(0, 0, 255) 

Pero pierdo las ventajas de tener BLANCO, NEGRO y VERDE vinculado al espacio de nombres Color.

Respuesta

13

Se podía poner los colores específicos en el objeto acompañante:

class Color(val red: Int, val blue: Int, val green: Int) 
object Color { 
    object BLACK extends Color(0, 0, 0) 
    object WHITE extends Color(255, 255, 255) 
    object GREEN extends Color(0, 0, 255) 
} 

EDITAR:

Alternativamente, usted podría tener Vals dentro del objeto acompañante:

class Color(val red: Int, val blue: Int, val green: Int) 
object Color { 
    val BLACK = new Color(0, 0, 0) 
    val WHITE = new Color(255, 255, 255) 
    val GREEN = new Color(0, 0, 255) 
} 

Podrías hacerlos perezosos para diferir insta ntiation hasta que se utilizan:

class Color(val red: Int, val blue: Int, val green: Int) 
object Color { 
    lazy val BLACK = new Color(0, 0, 0) 
    lazy val WHITE = new Color(255, 255, 255) 
    lazy val GREEN = new Color(0, 0, 255) 
} 

Volviendo la solución original, que podría evitar la extensión de la clase (la simulación de "final" al hacer la clase Color sellada:

sealed class Color(val red: Int, val blue: Int, val green: Int) 
object Color { 
    object BLACK extends Color(0, 0, 0) 
    object WHITE extends Color(255, 255, 255) 
    object GREEN extends Color(0, 0, 255) 
} 
+0

(No soy una persona de Scala. ¿Eso funciona para las clases "finales"? –

+1

No se puede extender una clase final, pero podría hacerlo "sellado" para que no se pueda extender fuera de la unidad de compilación actual . –

17
case class Color(red: Int, blue: Int, green: Int) 

object Color { 
    val BLACK = Color(0, 0, 0) 
    val WHITE = Color(255, 255, 255) 
    val GREEN = Color(0, 0, 255) 
} 
+7

Como nota aparte, la convención de Scala es usar PascalCase para constantes, como 'Black'. – missingfaktor

1

sellada permite extensiones de objeto con el mismo archivo físico ... no en archivo diferente. sellado está más cerca del alcance del paquete que el final.

Cuestiones relacionadas