在 Kotlin 中,我经常遇到以下模式:
class DlgManager {
fun dismiss(dlg: Dialogue) {
// ...
dlg.onDismiss()
// ...
}
}
class Dialogue {
// Never call this directly, always go through DlgManager!
fun onDismiss() {
// ...
}
}
我想让任意呼叫者都无法呼叫
onDismiss
,除非呼叫者是 DlgManager
。可以通过注释实现吗?
@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
annotation class RestrictCallers(val caller: KClass<out Any>)
class DlgManager {
fun dismiss(dlg: Dialogue) {
// ...
dlg.onDismiss()
// ..
}
}
class Dialogue {
@RestrictCallers(DlgManager::class)
fun onDismiss() {
// ...
}
}
@RestrictCallers 的这样的实现会是什么样子?
要准确地完成您想做的事情,需要超出正常的语言规则并编写编译器插件。
但是,如果您不介意也注释可接受的调用者,那么使用 选择加入注释 就可以非常接近。
为此,请定义您的选择加入注释:
@RequiresOptIn(message = "Only to be called by annotated callers")
@Retention(AnnotationRetention.BINARY)
annotation class RestrictOnDismissCallers
注释
onDismiss
:
class Dialogue {
@RestrictOnDismissCallers
fun onDismiss() {
// ...
}
}
然后,任何尝试调用
onDismiss
的函数都会生成错误,除了那些带有 opt-in 注释的函数,例如:
@OptIn(RestrictOnDismissCallers::class)
fun dismiss(dlg: Dialogue)