Как я могу реплицировать несколько первичных конструкторов?

Я не уверен, что наилучшая практика 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) 

с инициализатором, который вызывает hashPassword и присваивает его частной собственности.

Как я могу построить вторичный конструктор правильно, так что мне не нужно хэшировать значение, выходящее из базы данных?

(плюс много больше полей, не показанных)

Предполагая, что это означает, что у вашего второго конструктора есть другая подпись, например, добавив другое поле в список параметров, то, что вы хотите, может быть достигнуто несколькими способами:

  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) }