Извините за вопрос новичка по Kotlin, но я изо всех сил пытаюсь понять некоторые вещи, связанные с конструкторами и инициализацией.
У меня есть этот класс и конструктор:
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 {}. Что явно не правильно, я бы сказал?
Что лучше иметь (или чем иметь) необязательные параметры в конструкторе, а затем создавать из них переменные класса?
Вы можете объявлять свойства непосредственно в первичном конструкторе. Это означает, что вы можете отказаться от явных объявлений в теле класса:
class TestCaseBuilder constructor(
var caseTag: String = "Case",
var applType: Buy.ApplFor = Buy.ApplFor.PROOFFINANCE,
var komnr: String = "5035")
Вы также можете удалить ключевое слово constructor
, если ваш основной конструктор не имеет аннотаций или модификаторов видимости (по умолчанию public
).
@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")
Я бы предложил изменить последнее предложение на это: «Если основной конструктор не имеет никаких аннотаций или модификаторов видимости, ключевое слово конструктора можно опустить». взято из официальных документов: kotlinlang.org/docs/reference/classes.html#constructors