【问题标题】:Kotlin primary and secondary constructor issueKotlin 主次构造函数问题
【发布时间】:2017-11-07 16:25:49
【问题描述】:

我的 Kotlin 对象中有两个构造函数,一个主构造函数和一个辅助构造函数。主要的没有任何东西,而次要的有一些参数。我想在辅助构造函数中映射一个 DTO,但我看不出有什么问题。

示例

open class User(): RealmObject() {

    @PrimaryKey
    open var id: Long = 0

    open var login: String? = null

    open var firstName: String? = null

    open var surname: String? = null

    open var isAdmin: Boolean = false

    open var groups: RealmList<Int>? = null

    constructor(id: Long?, login: String?, firstName: String?, surname: String?, admin: Boolean?, groups: List<Int>?) : this()

    companion object {
        fun map(dto: UserDTO): User {
            Timber.d(dto.toString()) //The response data from the WS, OK with some data
            val groups = RealmList<Int>()
            dto.groups?.forEach { groups.add(it) }
            val u = User(dto.id, dto.login, dto.firstName, dto.surname, dto.admin, groups) //Calling the secondary constructor
            Timber.d(u.toString()) // Everything is null or false, KO
            return u
        }
    }
}

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    有几件事看起来有点不对劲。您在没有参数的情况下调用主构造函数的“this”,也没有在辅助构造函数中设置传入的值;因为它们没有在构造函数中声明为 valvar 内联,所以它们不会在构造函数完成后继续存在。

    这里更好的方法是只使用一个构造函数在构造函数而不是类主体中声明所有 val/vars,并提供默认初始化值。这样,您可以使用命名参数进行构造,在这种情况下不需要多个。

    例如:

    open class SomeClass(@PrimaryKey
                         open var id: Long = 0,
                         open var login: String? = null,
                         open var firstName: String? = null,
                         open var surname: String? = null,
                         open var isAdmin: Boolean = false,
                         open var groups: RealmList<Int>? = null): RealmObject()
    

    【讨论】:

    • 感谢您的提示和帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    相关资源
    最近更新 更多