将方法的调用者限制为类

问题描述 投票:0回答:1

在 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 的这样的实现会是什么样子?

kotlin annotations
1个回答
0
投票

要准确地完成您想做的事情,需要超出正常的语言规则并编写编译器插件。

选择加入注释

但是,如果您不介意也注释可接受的调用者,那么使用 选择加入注释 就可以非常接近。

为此,请定义您的选择加入注释:

@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)
© www.soinside.com 2019 - 2024. All rights reserved.