【问题标题】:Generate data class with KotlinPoet使用 KotlinPoet 生成数据类
【发布时间】:2017-10-31 12:01:26
【问题描述】:

我想用 KotlinPoet 生成简单的数据类:

data class User(val id: Int)

我就是这样做的:

val builder = KotlinFile.builder("", "Foo")
val classBuilder = TypeSpec.classBuilder("User").addModifiers(KModifier.DATA)
val ctor = FunSpec.constructorBuilder()
ctor.addParameter("id", Int::class)
classBuilder.primaryConstructor(ctor.build())
builder.addType(classBuilder.build())
builder.build().writeTo(System.out)

但我得到的是:

data class User(id: Int) {
}

如何在构造函数参数中添加val 修饰符?

【问题讨论】:

    标签: kotlin kotlinpoet


    【解决方案1】:

    这里有一个issue 讨论这个问题。

    结论是,写这段代码的方式是创建一个与构造函数参数名称匹配的属性,并由它初始化:

    KotlinFile.builder("", "Foo")
            .addType(TypeSpec.classBuilder("User")
                    .addModifiers(KModifier.DATA)
                    .primaryConstructor(FunSpec.constructorBuilder()
                            .addParameter("id", Int::class)
                            .build())
                    .addProperty(PropertySpec.builder("id", Int::class)
                            .initializer("id")
                            .build())
                    .build()
            )
            .build()
            .writeTo(System.out)
    

    但是,此功能在 KotlinPoet 的 0.2.0 版本中不可用。它已经实现,并且在正在传递的存储库中有一个 test 用于此,但您必须等待 KotlinPoet 的 0.3.0 版本才能使用此功能,该功能应该会进来接下来的几天。

    此功能可从0.3.0 获得,现已推出。


    前面的代码具有与您的原始样式相匹配的替代格式:

    val builder = KotlinFile.builder("", "Foo")
    val classBuilder = TypeSpec.classBuilder("User").addModifiers(KModifier.DATA)
    
    val ctor = FunSpec.constructorBuilder()
    ctor.addParameter("id", Int::class)
    classBuilder.primaryConstructor(ctor.build())
    
    val idProperty = PropertySpec.builder("id", Int::class).initializer("id").build()
    classBuilder.addProperty(idProperty)
    
    builder.addType(classBuilder.build())
    builder.build().writeTo(System.out)
    

    【讨论】:

    • 是否有计划添加惯用的数据类字段声明支持?
    • 不确定,你得问问他们。与此同时,0.3.0 已于 23 小时前发布,您可以继续更新它。我也会编辑我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    相关资源
    最近更新 更多