我认为在这种情况下最好的解决方案是使用工厂方法而不是公共构造函数。
所以你可以定义你的构造函数private
并提供工厂apply
伴随对象中的方法:
class Foo private (val x:Int)
object Foo {
def apply(i: Int) = new Foo(i)
def apply(s: String) = new Foo(convertToInt(s))
def convertToInt(s: String) = s.toInt
}
println(Foo(512).x)
println(Foo("256").x)
您可以找到有关以下内容的更多信息构造函数与工厂方法 here:
构造函数与工厂方法 https://stackoverflow.com/questions/628950/constructors-vs-factory-methods
Scala 也是如此。
Update
作为我制作的替代解决方案的示例非常通用解决方案。Foo
类现在可以使用任何曾经存在或可以创建的类将来,假设该类型可以转换(您可以定义应如何转换)到/从Int
:
trait Convertable[From, To] {
def convert(from: From): To
}
object Convertable {
implicit val intString = new Convertable[Int, String] {
def convert(from: Int) = from toString // your logic here
}
implicit val stringInt = new Convertable[String, Int] {
def convert(from: String) = from toInt // your logic here
}
implicit def self[T] = new Convertable[T, T] {
def convert(from: T) = from
}
}
case class Foo[T](original: T)(implicit toInt: Convertable[T, Int], fromInt: Convertable[Int, T]) {
val x: Int = toInt convert original
def toOriginal = fromInt convert x
}
println(Foo(512) x)
println(Foo("256") x)
(我可以定义toOriginal
只需返回 = original
,但这太无聊了:)
正如您所看到的,这个解决方案是通用的并且更复杂。但据我所知,许多应用程序需要不同原始值和/或类之间的某种转换。因此,在许多情况下,它对于许多情况来说都是合适的(并且可能被认为是非常好的)解决方案,并且可能也适合您。但通常不可能说出所有可能情况的“最佳”解决方案。