Gradle任务属性约定:非final属性在init块使用的IDE警告处理
Gradle抽象任务约定属性的可行性与警告解决
可行性说明
这段代码在Gradle中完全可行。Gradle会在运行时为抽象的Property属性自动生成实现类并注入实例,init块中设置的约定值能正常生效,不会影响任务的执行逻辑。IDE的警告只是Kotlin编译器基于语言规则的提示,并非Gradle运行层面的错误。
无需显式注入ObjectFactory的警告消除方法
方法1:添加Kotlin抑制注解
直接在init块或类上添加抑制注解,告诉编译器忽略非final成员在初始化块中使用的警告:
abstract class MyTask : DefaultTask() { @get:Internal abstract val myProperty: Property<String> @Suppress("NON_FINAL_MEMBER_IN_INIT") init { myProperty.convention("foobar") } }
方法2:通过属性委托直接声明约定
利用DefaultTask自带的objects(ObjectFactory实例),在属性声明时直接创建Property并设置约定值,无需abstract修饰,从根源避免警告:
abstract class MyTask : DefaultTask() { @get:Internal val myProperty: Property<String> = objects.property(String::class.java).convention("foobar") }
方法3:构造函数初始化(可选)
通过@Inject让Gradle自动注入ObjectFactory,在构造函数中完成属性初始化,同样无需手动注入:
abstract class MyTask @Inject constructor(objects: ObjectFactory) : DefaultTask() { @get:Internal val myProperty: Property<String> = objects.property(String::class.java).convention("foobar") }
这种方式适合需要批量初始化多个属性的场景。
内容的提问来源于stack exchange,提问作者Kelvin Chung
相关产品推荐
相关产品推荐

