簡體   English   中英

等同於Scala中的公共靜態最終字段

[英]Equivalent of public static final fields in 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
}

我所擁有的最好的是:

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)  

但是我失去了將BLACK,WHITE和GREEN綁定到Color名稱空間的優點。

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

您可以將特定的顏色放入伴隨對象中:

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

編輯

或者,您可以在隨播對象中包含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)
}

您可以讓它們懶惰地推遲實例化,直到使用它們:

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

回到原始解決方案,您可以阻止類的擴展(通過將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)
}

密封允許對象擴展具有相同的物理文件..不在不同的文件中。 密封比最終包裝更接近包裝范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM