假设我有以下特征和对象:
trait NoAnon {
val i: Int
}
object NoAnon {
def create = new NoAnon {
val i = 123
}
}
我想防止在随播对象之外创建NoAnon
的匿名实例。即。只允许此示例中的create
执行此操作。我可以将这些包含在另一个对象中,并将该特征设为私有对象来实现此目的:
object Ctx {
private[Ctx] trait NoAnon {
val i: Int
}
object NoAnon {
def create = new Ctx.NoAnon {
val i = 123
}
}
}
是否可以在没有封闭对象Ctx
的情况下执行此操作?
为了更清楚一点,traits可以模仿私有抽象类构造函数的功能吗?也就是说,以下示例,除了特征。
abstract class NoAnon private[NoAnon] {
val i: Int
}
object NoAnon {
def create = new NoAnon {
val i = 123
}
}
答案 0 :(得分:2)
也许您可以使用具有私有构造函数的类并使用您的特征扩展它。您甚至可以在配对对象中嵌套该类:
trait NoAnon extends NoAnon.type#NoAnonCheck {
val i: Int
}
object NoAnon {
class NoAnonCheck private[NoAnon]
def create = new NoAnon {
val i = 1
}
}
然后,如果你尝试过:
new NoAnon { val i = 2 }
你得到:
error: constructor NoAnonCheck in class NoAnonCheck cannot be accessed in <$anon: NoAnonCheck with NoAnon>
但您可以使用NoAnon.create
。除了添加这样的东西,我不认为目前在Scala中有一种纯粹的方法。
当然,正如您所知及在评论中提到的,其他选项是使特征对于封闭对象或包的范围是私有的。