You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin抽象类如何更好向子类传递职责并强制遵守开发约定

针对你的两个需求,可行实现方案如下:

1. 强制子类明确知晓thingThatChildMightWantToAccess属性存在的方案

  • 方案1:抽象方法显式确认
    直接在抽象父类中新增一个无业务逻辑的抽象方法,要求所有子类必须实现,相当于强制子类显式声明自己知晓该属性的存在:
    abstract class ContainsRepetitiveBoilerPlate<T:View,U:InfoForView>:Fragment(){
        val thingThatChildMightWantToAccess=mutableListOf<U>()
        // 子类实现该方法即代表确认已知晓上述属性的存在和使用规则
        abstract fun acknowledgeAccessToSharedProperty()
        // 其余原有逻辑保持不变
    }
    
    子类就算只写空实现,也完成了显式确认的流程,避免出现子类不知道该属性存在的问题。
  • 方案2:Kotlin Opt-in注解强制声明
    自定义@RequiresOptIn注解修饰目标属性,子类如果要访问该属性,必须显式添加OptIn声明才能编译通过,完全满足显式确认的要求:
    @RequiresOptIn(message = "请确认已知晓该共享属性的使用规则")
    annotation class SharedPropertyAcknowledgement
    
    abstract class ContainsRepetitiveBoilerPlate<T:View,U:InfoForView>:Fragment(){
        @SharedPropertyAcknowledgement
        val thingThatChildMightWantToAccess=mutableListOf<U>()
        // 其余原有逻辑保持不变
    }
    
    子类如果要访问这个属性,必须在对应类/方法上添加@OptIn(SharedPropertyAcknowledgement::class)注解,否则编译直接报错。

2. 强制子类调用performNinetyPercentOfTheWork()的Lint校验方案

  • 方案1:Kotlin原生@RequiresMethodCall注解
    Kotlin 1.6+ 原生支持@RequiresMethodCall注解,直接加在父类上即可要求所有继承的子类必须调用指定方法,未调用时IDE会直接标红报错,编译阶段也会阻断:
    @RequiresMethodCall(methodName = "performNinetyPercentOfTheWork")
    abstract class ContainsRepetitiveBoilerPlate<T:View,U:InfoForView>:Fragment(){
        fun performNinetyPercentOfTheWork(){/* 原有通用逻辑 */}
        // 其余原有逻辑保持不变
    }
    
    该方案不需要额外引入工具,完全满足你要的linter层面校验的需求。
  • 方案2:自定义Android Lint规则
    如果需要更灵活的校验逻辑(比如要求必须在onViewCreated阶段调用、和其他业务逻辑绑定校验),可以自己编写自定义Lint检测器,匹配所有继承自该抽象类的Fragment,检查对应方法的调用情况,自定义错误级别和提示内容,符合要求才能通过编译。
  • 方案3:运行时校验兜底
    可以保留你示例中的标记位校验逻辑,在父类的固定生命周期节点(比如onViewCreated、onStart)检查方法调用标记,未调用直接抛出运行时异常,开发阶段直接暴露问题,避免线上隐患。

内容的提问来源于stack exchange,提问作者D. Kupra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 21:09:02