我正在学习Scala,我无法弄清楚如何在Scala中最好地表达这个简单的Java类:
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
}
Run Code Online (Sandbox Code Playgroud)
我最好的是以下内容:
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)
Run Code Online (Sandbox Code Playgroud)
但是我失去了将BLACK,WHITE和GREEN绑定到Color命名空间的优点.
mis*_*tor 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)
}
Run Code Online (Sandbox Code Playgroud)
Mit*_*ins 13
您可以将特定颜色放入伴随对象:
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)
}
Run Code Online (Sandbox Code Playgroud)
编辑:
或者,您可以在随播对象中包含val:
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)
}
Run Code Online (Sandbox Code Playgroud)
您可以让它们延迟实例化,直到它们被使用为止:
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)
}
Run Code Online (Sandbox Code Playgroud)
回到原始解决方案,您可以阻止类的扩展(通过使Color类密封来模拟"final":
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)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7228 次 |
| 最近记录: |