gpt4 book ai didi

Kotlin 生成将默认值设置为空参数的构造函数

转载 作者:IT老高 更新时间:2023-10-28 13:36:21 32 4
gpt4 key购买 nike

我们来看一个数据类的类:

data class User(
val userNumber: Int = -1,
val name: String,
val userGroups; List<String> = emptyList(),
val screenName: String = "new-user"
)

从 Kotlin 调用此函数时,非常简单。我可以简单地使用命名参数语法来做到这一点。从 Java 调用,我必须指定所有值,或者使用 @JvmOverloads 注释,它会生成以下构造函数(除了 kotlin 使用默认值的位掩码生成的构造函数):

User(int userNumber, @NotNull String name, @NotNull List userGroups,
@NotNull String screenName)
User(int userNumber, @NotNull String name, @NotNull List userGroups)
User(int userNumber, @NotNull String name)
User(@NotNull String name)

现在,如果我想在 Java 中创建一个 User 对象,相当于 User(name="John Doe", userGroups=listOf("admin", "super") 我不能用上面的构造函数来做。但是如果我把 val userNumber: Int = -1 放在 data class 声明的末尾,我可以做到(构造函数的生成似乎取决于定义可选参数的顺序)。这很好,因为期望 kotlin 生成所有排列会严重膨胀某些类。

Jackson 这样的工具最大的问题是根本无法工作,因为他们不知道要使用哪个构造函数(而且我不能专门注释其中一个生成的构造函数)。

那么,有没有办法生成一个(单个)构造函数,例如:

User(Integer userNumber, String name, List<String> userGroups, String screenName) {
this.userNumber = (userNumber == null) ? -1 : userNumber;
this.userGroups = (userGroups == null) ? Collections.emptyList() : userGroups;
//...
}

目前我正在使用上述方法,但在需要它们的地方手动定义构造函数。

编辑

我应该澄清一下,创建一个类似的构造函数是行不通的,显然因为两个签名都会在 JVM 上发生冲突。这就是我想要的:

data class User(
val userNumber: Int = -1,
val name: String,
val userGroups; List<String> = emptyList(),
val screenName: String = "new-user"
) {
companion object {
@JvmStatic
@JsonCreator
fun constructionSupport(
@JsonProperty("userNumber") userNumber : Int?,
@JsonProperty("name") name : String,
@JsonProperty("userGroups") userGroups : List<String>?,
@JsonProperty("screenName") screenName : String?
) = User(
userNumber = userNumber ?: -1,
name = name,
userGroups = userGroups ?: emptyList(),
screenName = screenName ?: "new-user"
)
}
}

还要注意我必须为属性写入两次默认值的冗余。我现在看它,我怀疑是否存在解决方案。也许这是我基于 kapt 的副项目的一个很好的用例:)

最佳答案

更好的解决方案是增加库理解 Kotlin 函数的可能性。例如,对于 Jackson,存在 jackson-module-kotlin。有了这个库,我们可以在数据类中使用默认参数。

例子:

data class User(
val userNumber: Int = -1,
val name: String,
val userGroups: List<String> = emptyList(),
val screenName: String = "new-user"
)

fun main(args: Array<String>) {
val objectMapper = ObjectMapper()
.registerModule(KotlinModule())

val testUser = User(userNumber = 5, name = "someName")

val stringUser = objectMapper.writeValueAsString(testUser)
println(stringUser)

val parsedUser = objectMapper.readValue<User>(stringUser)
println(parsedUser)

assert(testUser == parsedUser) {
println("something goes wrong")
}
}

关于Kotlin 生成将默认值设置为空参数的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45729442/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com