我发现我偶尔想在特征中写一个任意断言,或者在其他我想要断言的东西尚未完全定义的地方。
trait Foo {
val aList: List[String]
val anotherList: List[String]
def printPairs = aList.zip(anotherList).foreach(println)
assert(aList.size == anotherList.size) // NullPointerException, because these references are undefined right now.
}
我认为我正在寻找的一个概括是一个钩子(总是)在完全定义和实例化类之后触发,因为这是我通常放在构造函数中的那种检查。
答案 0 :(得分:1)
你可以使用早期定义(在Scala Language Reference中搜索它以获取更多信息) - 使用与你编写的特征完全相同的特性,你可以按如下方式扩展它:
class Bar(l1: List[String], l2: List[String]) extends {
val aList = l1
val anotherList = l2
} with Foo
哪会在调用assert
之前启动列表,因此:
new Bar(List("a", "b"), List("c", "d")) // built successfully
new Bar(List("a", "b"), List("c", "d", "e")) // throws exception
当然 - 它并不完全是你所要求的(在构造之后总是被称为“钩子”),因为任何扩展类都必须知道哪些成员必须“早期”被覆盖,但据我所知,这是最近的你可以得到。