You can simply put certain colors in a 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 can have vals inside 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 can 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) }
By returning the original solution, you can prevent the class from expanding (by simulating "final" by making the Color class leakproof:
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) }