简体   繁体   中英

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM