我正在用 Java 编写一个 gradle 插件。为了使其可配置,我想定义一个扩展对象。由于这本质上是一个值对象,我想我会使用 Immutables 来定义类,以减少代码量。但是,这变得很困难,我想知道这是否可能?
我尝试的第一件事是定义一个简单的不可变类:
@Value.Immutable
public abstract class MyExtension {
public abstract String someField();
}
然后将其添加为扩展名:
project.getExtensions()
.create("extensionName", MyExtension.class);
这失败了:
> Failed to apply plugin 'my.plugin.id'.
> Could not create an instance of type com.palantir.gotham.ontology.GothamOntologyFragmentsPluginExtension.
> Could not generate a decorated class for type MyExtension.
> Cannot have abstract method MyExtension.someField().
使用接口而不是抽象类定义不可变对象会产生相同的错误。然后我尝试通过不可变类代替,使用:
project.getExtensions()
.create(TypeOf.typeOf(MyExtension.class), "extensionName", ImmutableMyExtension.class);
但是,这会失败并出现不同的错误:
> Failed to apply plugin 'my.plugin.id'.
> Could not create an instance of type ImmutableMyExtension.
> Class ImmutableMyExtension is final.
似乎 gradle 要求扩展类是可扩展的,而 immutables 总是生成final
类。有什么办法可以让它工作吗?