外部不可更改类上的Kotlin DSL范围控制(类似于@DslMarker)
我有很多外部类(在外部生成;不在我的控制之下),它们没有生成器,创建起来相当麻烦。但是,使用外部不可更改类上的Kotlin DSL范围控制(类似于@DslMarker),kotlin,Kotlin,我有很多外部类(在外部生成;不在我的控制之下),它们没有生成器,创建起来相当麻烦。但是,使用apply构建它们相当容易,例如: SomeOfTheObjects().apply { someProperty = SomeOtherComplexObject().apply { someOtherProperty = "..." } } 现在我喜欢它与接收器一起工作的方式,但我想防止在SomeOtherComplexObject中设置someProperty。如果这些类在我的控制
apply
构建它们相当容易,例如:
SomeOfTheObjects().apply {
someProperty = SomeOtherComplexObject().apply {
someOtherProperty = "..."
}
}
现在我喜欢它与接收器一起工作的方式,但我想防止在SomeOtherComplexObject
中设置someProperty
。如果这些类在我的控制下,在该类上放置一个@DslMarker
就足够了,但由于它们不是,我想到的唯一其他方法是使用也
,而不重命名参数,例如:
SomeOfTheObjects().also {
it.someProperty = SomeOtherComplexObject().also {
it.someOtherProperty = "..."
//it.someProperty will not work if SomeOtherComplexObject has no such property
}
}
虽然它可以工作,但现在代码中有大量的it.
,我想知道,是否有可能出现与@DslMarker
类似的行为
我尝试了以下几种方法:
@DslMarker
annotation class DemoMarker
@DemoMarker
inline fun <T> T.build(@DemoMarker builder : T.() -> Unit) = this.apply(builder)
@DslMarker
注释类标记
@人口标记
inline fun T.build(@DemoMarker-builder:T.()->Unit)=此.apply(builder)
“混合”,因为我最后到处都放了注释,但这没有任何效果。如果我把它放在一门课上,它会像预期的那样工作。我是不是错过了什么,而事实上这是可能的?或者是否有人对此有适当的解决方法,除了使用
也?对于第三方类,您可以在接收器类型上使用DslMarker注释,如前所述
如前所述,对于第三方类,您可以在接收器类型上使用DslMarker注释
你能从第三方类继承吗?可能会用@DslMaker
继承并标记您的类?这是可能的,但其中大约有4k个类。。。它们显然是从模式生成的。也许我可以从某处获得模式,然后从头开始生成源代码,并在生成时添加注释:-)但我认为这个问题仍然有效。。。我希望还有其他解决方法:-)您能从第三方类继承吗?可能会用@DslMaker
继承并标记您的类?这是可能的,但其中大约有4k个类。。。它们显然是从模式生成的。也许我可以从某处获得模式,然后从头开始生成源代码,并在生成时添加注释:-)但我认为这个问题仍然有效。。。我希望还有其他解决方法:-)完美!现在我只需要先设置这样一个扩展函数(比如apply
/也
),但这比其他任何东西都简单:-)完美!现在,我只需要首先设置这样一个扩展函数(比如apply
/也
),但这比其他任何东西都简单:-)
@DslMarker
@Target(AnnotationTarget.CLASS, AnnotationTarget.TYPE)
annotation class TestDsl
fun build1(builder: (@TestDsl DslReceiver1).() -> Unit) {}