我有一些带有受保护构造函数的类,而工厂方法位于抽象超类的伴随对象中。从Scala 2.9.0.RC4开始,这不再编译了。我通过使构造函数包受保护来“修复”该问题。但我不希望其他类甚至在同一个包中也能调用构造函数。
那我该怎么办?
sealed abstract class A
object A {
//the factory method, returning either a B or C
def apply(): A
}
class B protected (...) extends A
class C protected (...) extends A
答案 0 :(得分:1)
你可以让它们成为对象的私有内部类。
object A {
private class B extends A
private class C extends A
}
答案 1 :(得分:1)
由于你需要可以访问模式匹配的类,我建议为它们创建一个新的子包,并使构造函数对该包是私有的。现在只需要更改客户端代码中的import语句。
sealed abstract class A {
}
package myPackage.subPackage {
object A {
def apply(): A = new B
}
class B private[subPackage] () extends A {
}
}
package other {
object Foo {
def foo {
myPackage.subPackage.A()
//does not compile: new myPackage.subPackage.B
}
}
}
答案 2 :(得分:0)
另一种选择是为A的每个实现创建伴随对象,并将构造委托给此对象中的工厂方法:
sealed abstract class A
object A {
//the factory method, returning either a B or C
def apply(): A = {
if (...) B()
else C()
}
}
object B {
def apply() : B = new B()
}
class B private (...) extends A
object C {
def apply() : C = new C()
}
class C private (...) extends A