gpt4 book ai didi

constructor - Kotlin 的数据类主构造函数中的局部参数

转载 作者:行者123 更新时间:2023-12-04 03:19:45 24 4
gpt4 key购买 nike

关于data禁止上课不是 使用 varval主构造函数中的关键字,即每个参数都隐式转换为类属性。但是,有时我不希望将每个参数都转换为类属性。

因此,据我所知,没有机会在主构造函数中传递参数,该参数只能在构造函数中访问,并且在实例的构造完成后被遗忘。这有充分的理由吗?

我看到解决这个问题的唯一方法是不是 使用 data类或使用允许非 var/val 前缀变量的辅助构造函数。然而,有很多参数需要传递,二级构造函数会极大地膨胀类。当然,我可以将所有参数包装到另一个对象中,但这只会将问题转移到另一个地方。

是否有推荐的方法或模式来应对这种情况?

最佳答案

你根本不受限制,你只需要做一些不同的事情。

数据类旨在非常清楚它们包含的内容和顺序,并且只允许 中的成员主构造函数 参数列表。

但是您还有其他选择:使用 二级构造函数 , 和/或 创建顶级函数与具有不同重载的类同名,或创建工厂方法 在伴随对象中:

data class Person(val name: String, val age: Int) {
// secondary constructor
constructor (name: String): this(name, 0) {
// ... make a newborn
}

// factory methods in companion object
companion object {
fun of(name: String, birthdate: LocalDate): Person {
return Person(name, yearsSince(birthdate))
}
}
}

// function with same name as class acting like a constructor
fun Person(name: String, birthdate: LocalDate): Person {
return Person(name, yearsSince(birthdate))
}

// these all work now:

Person("Fred", 30) // primary constructor
Person("Baby") // secondary constructor
Person("Geoff", LocalDate.parse("12/08/1990")) // top-level function
Person.of("Jennifer", LocalDate.parse("01/01/1981") // companion function

您也可以通过将其设为私有(private)来隐藏主构造函数,但不能隐藏 copy该构造函数的版本。

顺便说一句,为主构造函数提供具有此契约(Contract)的数据类确实有助于序列化/反序列化库知道如何处理该类,否则将是猜测。这是一件好事!

关于constructor - Kotlin 的数据类主构造函数中的局部参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51580698/

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