Освой программирование играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
В Android часто встречаются классы, состоящие из набора конструкторов, которые отличаются друг от друга дополнительными параметрами по нарастающей. Самый типичный пример - класс View с четырьмя конструкторами. И при создании собвственного компонента нам приходится писать следующее.
class CustomView : View {
constructor(context: Context?) : this(context, null)
constructor(context: Context?, attrs: AttributeSet?) : this(context, attrs, 0)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
// и т.д.
Данный подход сейчас считается анти-паттерном. Чтобы избежать подобного излишнего кода, Kotlin предложил другой вариант с аннотацией @JvmOverloads.
class CustomView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr)
Аннотация информирует компилятор, что следует создать конструктор на основе предыдущего с дополнительным параметром с значением по умолчанию.
Данный способ не всегда применим, следует быть внимательным. Например, на форуме писали, что может не сработать при наследовании от TextView.