Параметр вторичного конструктора - PullRequest
0 голосов
/ 08 января 2019

Может кто-нибудь помочь мне разобраться? У моего объекта было 3 основных параметра, все строки. Теперь я хочу добавить вторичный конструктор с одним параметром emum, который, в свою очередь, установит каждый из 3 исходных параметров следующим образом:

class MyObject(var string1: String, var string2: String, var string3: String)
{
    constructor(presetCode: PresetCode ) : this("", "", "")
    {
      when (presetCode)
      {
       PresetCode.Code1 ->
        {
         string1 = "aaa"
         string2 = "bbb"
         string3 = "ccc"
        }
       }
      }

   var anotherObject = AnotherObject(string1)

}

Проблема в том, что AnotherObject (string1) не работает, так как string1 - просто пустая строка.

как я могу установить 3 параметра с помощью этого вторичного конструктора и затем успешно вызвать AnotherObject (string1)? спасибо

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Один из вариантов - заменить вспомогательный конструктор методом invoke() для сопутствующего объекта:

class MyObject(var string1: String, var string2: String, var string3: String) {
    companion object {
        operator fun invoke(presetCode: PresetCode) = when (presetCode) {
            PresetCode.Code1 -> MyObject("aaa", "bbb", "ccc")
            else -> MyObject("", "", "")
        }
    }

    var anotherObject = AnotherObject(string1)
}

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

val o = MyObject(PresetCode.Code1)

Этот подход прост, лаконичен и очень гибок. (Например, он может вернуть кэшированный экземпляр вместо создания нового.)

0 голосов
/ 08 января 2019

Вот решение, которое я нашел, основываясь на вашем дизайне класса, для которого требуется одна AnotherObject конструкция на MyObject экземпляр:

class MyObject
{
    constructor(s1: String, s2: String, s3: String)
    {
        string1 = s1
        string2 = s2
        string3 = s3
        anotherObject = AnotherObject(string1)
    }

    constructor(presetCode: PresetCode)
    {
        when (presetCode)
        {
            PresetCode.Code1 ->
            {
                string1 = "aaa"
                string2 = "bbb"
                string3 = "ccc"
            }
            else ->
            {
                string1 = ""
                string2 = ""
                string3 = ""
            }
        }
        anotherObject = AnotherObject(string1)
    }

    var string1: String
    var string2: String
    var string3: String
    var anotherObject: AnotherObject
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...