2010-03-29 12 views
7

uczę Scala, i nie mogę dowiedzieć się, jak najlepiej wyrazić tę prostą klasę Java w Scala:Odpowiednik publicznych statycznych pól w końcowych 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 
} 

Najlepszym mam jest następujący:

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) 

Ale tracę zalety związane z tym, że CZARNY, BIAŁY i ZIELONY są powiązane z przestrzenią nazw Kolor.

Odpowiedz

13

Można po prostu umieścić konkretne kolory do obiektu towarzyszącego:

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) 
} 

EDIT:

Alternatywnie, można mieć Vals w obiekcie towarzysz:

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) 
} 

Możesz sprawić, że będą leniwi, aby odroczyć insta ntiation dopóki nie zostaną wykorzystane:

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) 
} 

Wracając oryginalne rozwiązanie, można zapobiec rozszerzenie klasy (symulacja „ostateczne”, dokonując Klasa Color zaplombowane:

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

(Nie jestem osobą z Scala.) Czy to działa dla "końcowych" lekcji?) –

+1

Nie można rozszerzyć klasy końcowej, ale można ją uczynić "zapieczętowaną", aby nie można było jej rozszerzać poza bieżącą kompilację . –

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

Na marginesie, konwencja Scala ma używać PascalCase do stałych, takich jak 'Black'. – missingfaktor

1

uszczelnione pozwala rozszerzenia obiektów z tym samym plikiem fizycznym .. nie w innym pliku. zapieczętowany jest bardziej zbliżony do zakresu pakietu niż finał.

Powiązane problemy