Эквивалент публичных статических финальных полей в Scala - PullRequest
7 голосов
/ 29 марта 2010

Я изучаю Scala и не могу понять, как лучше выразить этот простой Java-класс в 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
}

Лучшее, что у меня есть, это:

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.

Ответы [ 3 ]

17 голосов
/ 29 марта 2010
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)
}
13 голосов
/ 29 марта 2010

Вы можете просто поместить определенные цвета в объект-компаньон:

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

В качестве альтернативы, вы можете иметь значения в объекте-компаньоне:

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 запечатанным:

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)
}
1 голос
/ 17 августа 2011

загерметизирует позволяет расширения объекта с тем же физическим файлом .. не в другом файле. Герметичный ближе к объему пакета, чем окончательный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...