Dart 语言中有一个级联操作符,也就是两个句点(..),可以使用单个对象来级联调用多个方法。
比如,下面的代码多次调用 myTokenTable 的 add 方法,需要重复使用 myTokenTable 对象。
myTokenTable.add("aToken");
myTokenTable.add("anotherToken");
// many lines elided here
// and here
// and on and on
myTokenTable.add("theUmpteenthToken");
在使用级联操作符之后,可以简化成下面这样的写法。用(..)替换了 myTokenTable 的重复使用。
myTokenTable
..add("aToken");
..add("anotherToken");
// many lines elided here
// and here
// and on and on
..add("theUmpteenthToken");
看到这里,熟悉的人一眼就看出来了,这是标准的构建器(Builder)模式的应用。只需要每一个方法返回当前的对象自身,就可以很方便地级联起来。Lombok 的注解 @Builder 可以自动生成这样的代码。
TokenTable add(String token) {
return this;
}
但是有一个限制条件,那就是你必须能够修改这些代码。如果是第三方库中的对象,或者有其他限制导致不能返回当前对象,这种做法就不能生效了。
个人觉得这样的级联操作符还是有价值的。如果能够增加一个 null 安全的访问操作符 就更好了。类似 (?.) 这样的。只有当对象不为 null 的时候,才执行后面的代码。这样可以避免很多不必要的空指针异常。
Kotlin 已经实现了类似的功能,虽然不是通过操作符来完成的。但可以为方法调用设置一个隐式的上下文对象。
val myObject = Address().apply {
setRecipient("Joe Smith")
addLine("123 Fake Street")
setCity("Fakeville")
setCountry("Fakamy")
setZipcode("123456")
}
希望级联操作符和 null 安全的访问操作符有一天能进入到 Java 中。