Освой программирование играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Аннотация @JvmOverloads

В 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.

Реклама