Scala中公共静态最终字段的等效项

JT.*_*JT. 7 java scala

我正在学习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)

  • 另外,Scala约定是使用PascalCase作为常量,例如`Black`. (8认同)

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)