假设:
class Foo(x: Int) {}
object Foo {
def apply(x: Int) = new Foo(x)
}
除了将Foo
的构造函数标记为private
之外,如何在调用new Foo(...)
时出现警告或编译时失败?
换句话说,我想限制(通过编译时警告或错误)构建Foo
到Foo.apply
。
这可能吗?
答案 0 :(得分:7)
在scala中,有两种惯用方法可以实现这一点。
工厂可以访问构造函数,而其他任何人都没有:
class Foo private[Foo](val x: Int)
object Foo {
def apply(x:Int) = new Foo(x)
}
val foo = new Foo(1) // cannot compile
val foo1 = Foo(1) //compiles fine
在scala中,sealed
类只能在定义的同一源文件中扩展。
我建议您使用Foo
sealed abstract class
并在对象的申请方法中返回Foo
的匿名孩子。
sealed abstract class Foo(val x:Int)
object Foo {
def apply(x:Int):Foo = new Foo(x) {}
}
在这种情况下,Foo
可以在任何地方创建,除了定义它的文件。
UPD :实际上,这个问题已经是discussed on stackoverflow。
UPD2 :添加了两种方法的简要概述。