Equivalent of public static final fields in Scala
I'm learning Scala, and I can't figure out how to best express this simple Java class in 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
}
The best I have is the following:
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)
But I lose the advantages of having BLACK, WHITE, and GREEN being tied to the Color namespace.
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)
}
You could just put the specific colors into the companion object:
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:
Alternatively, you could have vals within the companion object:
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)
}
You could make them lazy to defer instantiation until they are used:
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)
}
Going back the original solution, you could prevent extension of the class (simulating "final" by making the Color class sealed:
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)
}
sealed allows object extensions with the same physical file..not in different file. sealed is more close to package scope than the final.
精彩评论