如何复制多个主要构造函数?

时间:2018-01-04 00:11:42

标签: constructor kotlin

我不确定Kotlin在这方面的最佳做法是什么。

假设我有一个Java类,User有两个字段:usernamepassword。它有一个这样的主要构造函数:

public User(String username, String password) {
    this.username = username;
    this.password = hashPassword(password);
}

和ORM的第二个构造函数:

public User(String username, String password) {
    this.username = username;
    this.password = password;
}

(加上更多字段未显示)

通过这种设置,我可以为大多数代码提供友好的面孔,并且仍然让ORM传递所有字段以从数据库重新创建对象。

我的Kotlin代码有一个主要的构造函数:

class User(var username: String,
       var name: String,
       password: String)

使用初始化程序调用{​​{1}}并将其分配给私有属性。

如何正确构造辅助构造函数,以便我不必散列数据库中的值?

1 个答案:

答案 0 :(得分:2)

  

(加上更多字段未显示)

假设这意味着您的第二个构造函数具有不同的签名,例如通过在其参数列表中添加另一个字段,您可以通过多种方式实现所需:

  1. 创建一个私有主构造函数和几个辅助构造函数:

    class User
    private constructor(val username : String)
    {
        private val password : String
    
        constructor(username : String, password : String)
            : this(username)
        {
            this.password = hashPassword(password)
        }
    
        constructor(username : String, password : String, anotherParameter : String)
            : this(username)
        {
            this.password = password
        }
    }
    
  2. password设为var并在调用主要构造函数后再次分配密码(请注意,这需要 Kotlin 1.2 或更高版本):

    class User(val username : String, password : String)
    {
        private lateinit var password : String
    
        init
        {
            if (!this::password.isInitialized)
                this.password = hashPassword(password)
        }
    
        constructor(username : String, password : String, anotherParameter : String)
            : this(username, password)
        {
            this.password = password
        }
    }
    
  3. 在主构造函数中添加一个标志,告知密码是否已经过哈希

    class User(val username : String, password : String, isHashed : Boolean = false)
    {
        private val password : String
    
        init
        {
            this.password = if (isHashed) password else hashPassword(password)
        }
    
        constructor(username : String, password : String, anotherParameter : String)
            : this(username, password, isHashed=true)
    }