Котлин и конструкторы, инициализирующие - PullRequest
1 голос
/ 21 мая 2019

Извините, что задал очень новый вопрос о Котлине, но я изо всех сил пытаюсь понять некоторые вещи, связанные с конструкторами и инициализацией.

У меня есть этот класс и конструктор:

class TestCaseBuilder constructor(
     caseTag: String = "Case",
     applType: Buy.ApplFor = Buy.ApplFor.PROOFFINANCE,
     komnr: String = "5035") {

     var caseTag: String       = caseTag
     var applType: Buy.ApplFor = applType  
     var komnr: String         = komnr             

То, что я пытаюсь сделать здесь, - это иметь три дополнительных параметра в конструкторах, используя для них значения по умолчанию.Причина, по которой я объявляю их в теле класса, заключается в том, что мне нужен доступ к ним из основного класса.

Теперь этот код работает.Нет ошибок при запуске.Но IntelliJ дает следующий комментарий для переменных (например: caseTag):

Property is explicitly assigned to parameter caseTag, can be declared
directly in constructor.

То, что я нашел при поиске, это примеры с использованием init {}, но результат, который я получил, включает в себя:инициализируем переменные дважды, один раз в конструкторе, а затем в init {}.Что явно не правильно, я бы сказал?

Что может быть лучше (или чем иметь) необязательные параметры в конструкторе, а затем создавать из них переменные класса?

Ответы [ 2 ]

3 голосов
/ 21 мая 2019

Вы можете объявить свойства непосредственно в первичном конструкторе.Это означает, что вы можете удалить явные объявления в теле класса:

class TestCaseBuilder constructor(
     var caseTag: String = "Case",
     var applType: Buy.ApplFor = Buy.ApplFor.PROOFFINANCE,
     var komnr: String = "5035")

Вы также можете удалить ключевое слово constructor, если ваш основной конструктор не имеет аннотаций или модификаторов видимости (по умолчанию public).

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

@JvmOverloads аннотация может перегрузить конструктор с другим размером параметра

class TestCaseBuilder @JvmOverloads constructor(
    var caseTag: String = "Case",
    var applType: Buy.ApplFor = Buy.ApplFor.PROOFFINANCE,
    var komnr: String = "5035"
)

Тогда класс получил три конструктора с необязательным параметром

val a = TestCaseBuilder("CaseA")
val b = TestCaseBuilder("CaseB", Buy.ApplFor.SomethingElse)
val c = TestCaseBuilder("CaseB", Buy.ApplFor.SomethingElse, "1111")
...