【问题标题】:Annotate interface function that must call super注解必须调用super的接口函数
【发布时间】:2016-10-20 11:18:48
【问题描述】:

我正在创建界面,其中的一些功能有一个主体。 要求实现该接口的类在执行其他代码之前必须在覆盖函数中调用super。 我该怎么做?

interface Watcher {
    fun funWithoutBody()

    fun startWatching() {
        //do some important stuff which must be called
    }
}

【问题讨论】:

    标签: android kotlin annotations


    【解决方案1】:

    我偶然发现了我正在寻找的东西。这是@CallSuper 包中的@CallSuper 注释。 Docs

    使用@CallSuper 注解来验证一个覆盖方法 调用方法的超级实现。下面的例子 注释 onCreate() 方法以确保任何覆盖方法 实现调用 super.onCreate():

    @CallSuper
    protected fun onCreate(savedInstanceState: Bundle?) {
    }
    

    【讨论】:

    • 这种方法的问题是,如果您有多模块项目,并且您需要此功能与非 Android 模块的模块,您将无法使用此注解。
    【解决方案2】:

    Android Studio / IntelliJ IDEA 在某些情况下会做这种事情,但不是通过注解而是通过code inspection。

    例如MissingSuperCall 是 IntelliJ IDEA 支持的 Android Lint Check (Integration with Android Lint tool in IntelliJ IDEA 11.1 | IntelliJ IDEA Blog)。

    如果您使用的是 Android Studio 或 IntelliJ IDEA,您可以创建自己的自定义检查:IntelliJ IDEA 2016.2 Help :: Creating Custom Inspections。

    【讨论】:

    • 谢谢!正是我想要的
    【解决方案3】:

    您可以将startWatching 抽象化并在另一个函数中调用它。例如:

    interface Watcher {
        fun funWithoutBody()
    
        fun userDefinedStartWatching()
    
        fun startWatching() {
            //insert code you'd normally want to be called when using super()
            userDefinedStartWatching()
        }
    }
    

    【讨论】:

    • 但我想被 IDE 警告。就像你不在 android Activity 中调用 super.onDestroy() 一样
    • 我想知道它是如何工作的。其实代码是我自己写的,没必要,我不需要变通办法
    • 我认为这可能是 IDE 的一个特性,但不是代码,所以我不确定在编写纯 Kotlin 代码时这是否真的可行。
    • 可能是Java注解?去看看源代码
    • 你当然可以在没有被调用的时候抛出一个异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 2017-05-11
    • 1970-01-01
    相关资源
    最近更新 更多