Как разместить разные аргументы для класса сущности - PullRequest
1 голос
/ 29 мая 2019

Я вызываю свой класс сущности в операторе if/else-if для 2 различных условий, и значения, которые я передаю в параметры, зависят от условия. В блоке if я передаю 3 параметра, а в блоке else-if я передаю 4. Объект сущности выдает ошибку, поскольку ожидает 4 параметра. Я хочу, чтобы первый параметр был необязательным, и я хотел бы знать, есть ли способ сделать это в Kotlin.

Это мой класс сущности:

@Entity(tableName = "entry_table")
data class Entry(
    @PrimaryKey(autoGenerate = true) 
    var id: Int? = null, 

    val username: String? = null, 
    val hint: String? = null, 
    val password: String? = null)

И это блок if/else-if, в который я вставляю значения в объект сущности:

if (requestCode == ADD_ENTRY_REQUEST && resultCode == Activity.RESULT_OK) {
            ...

            val entry = Entry(username, hint, password)
            ...

        } else if (requestCode == EDIT_ENTRY_REQUEST && resultCode == Activity.RESULT_OK) {
            ...

            val entry = Entry(id, username, hint, password)
            ...

        }

В Java вы можете решить эту проблему, создав 2 конструктора с одинаковым количеством параметров, но мне интересно, можем ли мы сделать то же самое в Kotlin или есть другой подход.

Ответы [ 2 ]

2 голосов
/ 29 мая 2019

Вы можете попробовать переместить идентификатор в конец, например, так:

@Entity(tableName = "entry_table")
data class Entry(
    val username: String? = null, 
    val hint: String? = null, 
    val password: String? = null,
    @PrimaryKey(autoGenerate = true) 
    var id: Int? = null)

И затем создать его следующим образом:

val entry = Entry(username, hint, password, id)

Или, если вы хотите сохранить идентификатор какпервый параметр, вы можете использовать именованные аргументы, например:

val entry = Entry(username = username, hint = hint, password = password)

Надеюсь, это поможет!

0 голосов
/ 29 мая 2019

Вы можете и, вероятно, должны использовать несколько конструкторов.

Недостатком вашего подхода является то, что все свойства должны быть необязательными по техническим причинам. Но я думаю, username и password на самом деле являются обязательными. Последствия - потеря проверки времени компиляции (и, следовательно, склонность к NPE) и громоздкое чтение (!! необходимо при доступе к имени пользователя).

Вы можете избежать этих проблем, следуя этому подходу:

  1. Чтобы ваш класс имел конструктор по умолчанию без аргументов, который требуется JPA, используйте плагин компилятора https://kotlinlang.org/docs/reference/compiler-plugins.html#jpa-support
  2. Сделать обязательные свойства ненулевыми (я полагаю, только hint необязательно)
  3. Используйте столько вспомогательных конструкторов, сколько хотите

@Entity(tableName = "entry_table")
data class Entry(
    @PrimaryKey(autoGenerate = true) 
    val id: Int, 

    val username: String,
    val hint: String?, 
    val password: String
) {
    constructor(
        username: String,
        hint: String = null,
        password: String = "change it"
    ) : this(0, username, hint, password)
}

В более реалистичном сценарии только id и username были неизменными. password и hint должны быть изменены.

@Entity(tableName = "entry_table")
data class Entry(
    @PrimaryKey(autoGenerate = true) 
    val id: Int, 
    val username: String
) {
    constructor(
        username: String,
    ) : this(0, username)

    var hint: String? = null
    var password: String = "change it"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...