Kotlin – 限制扩展方法范围
有没有办法限制DSL中的扩展方法?
说我有这样的班级结构:
class Outer { fun middle(op: Middle.() -> Unit): Middle { val middle = Middle() middle.op() return middle } } class Middle { fun inner(op: Inner.() -> Unit): Inner { val inner = Inner() inner.op() return inner } } class Inner fun outer(op: Outer.() -> Unit): Outer { val outer = Outer() outer.op() return outer }
然后我可以创建一个如下所示的调用:
outer { middle { inner { middle { } // Here is the problem } } }
我的问题是标记的middle { }
调用是令人困惑的,因为当它看起来像添加到Inner
时,它将Middle
添加到Outer
。
有没有办法不允许middle { }
调用?
您可以使用deprecated
使用的解决方法:
class Outer { fun middle(op: Middle.() -> Unit): Middle {...} @Deprecated("can not be used inside a Outer block", level = DeprecationLevel.ERROR) fun outer(op: Outer.() -> Unit): Outer = TODO() } class Middle { fun inner(op: Inner.() -> Unit): Inner {...} @Deprecated("can not be used inside a Middle block", level = DeprecationLevel.ERROR) fun middle(op: Middle.() -> Unit): Middle = TODO() } class Inner { @Deprecated("can not be used inside a Inner block", level = DeprecationLevel.ERROR) fun inner(op: Inner.() -> Unit): Inner = TODO() }
现在编译器会给你一个错误,而IDE在完成时不会提示错误的函数:
outer { middle { inner { middle { } // error } } }
但是你真的不应该为大的DSL做。 @KirillRakhman建议您最好等https://youtrack.jetbrains.com/issue/KT-11551 。
编辑:我解决了我的例子后,它变得更小。 一个类的虚拟函数毕竟不是那么多的样板。