Kotlin主要和次要构造函数问题

时间:2017-11-07 16:25:49

标签: android kotlin

我的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
        }
    }
}

1 个答案:

答案 0 :(得分: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()