我不确定Kotlin在这方面的最佳做法是什么。
假设我有一个Java类,User
有两个字段:username
和password
。它有一个这样的主要构造函数:
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}}并将其分配给私有属性。
如何正确构造辅助构造函数,以便我不必散列数据库中的值?
答案 0 :(得分:2)
(加上更多字段未显示)
假设这意味着您的第二个构造函数具有不同的签名,例如通过在其参数列表中添加另一个字段,您可以通过多种方式实现所需:
创建一个私有主构造函数和几个辅助构造函数:
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
}
}
将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
}
}
在主构造函数中添加一个标志,告知密码是否已经过哈希
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)
}