Middle
Как да премахнете четирите конструктора в персонализираното представяне (CustomView)?
sobes.tech AI
Отговор от AI
Може да се използва фабричен метод или builder pattern вместо директно използване на конструктори.
-
Фабричен метод: Позволява създаването на екземпляри на изгледа, като абстрахира процеса на създаване и скрива логиката за избор на необходимия конструктор.
class MyCustomView private constructor( context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int ) : View(context, attrs, defStyleAttr, defStyleRes) { // Частен конструктор за принудително използване на фабрични методи companion object { fun createDefault(context: Context): MyCustomView { // Логика за инициализация за конструктор по подразбиране return MyCustomView(context, null, 0, 0) } fun createFromAttrs(context: Context, attrs: AttributeSet?): MyCustomView { // Логика за инициализация с атрибути return MyCustomView(context, attrs, 0, 0) } // Допълнителни фабрични методи за други комбинации от конструктори } } -
Builder pattern: Полезен, когато има много конструктори или те имат множество опционални параметри. Позволява стъпково създаване на изгледа.
class MyCustomView private constructor( private val context: Context, private val attrs: AttributeSet?, private val defStyleAttr: Int, private val defStyleRes: Int ) : View(context, attrs, defStyleAttr, defStyleRes) { // Частен конструктор class Builder(private val context: Context) { private var attrs: AttributeSet? = null private var defStyleAttr: Int = 0 private var defStyleRes: Int = 0 fun setAttrs(attrs: AttributeSet?) = apply { this.attrs = attrs } fun setDefStyleAttr(defStyleAttr: Int) = apply { this.defStyleAttr = defStyleAttr } fun setDefStyleRes(defStyleRes: Int) = apply { this.defStyleRes = defStyleRes } fun build(): MyCustomView { // Логика за създаване и инициализация на изгледа въз основа на параметрите return MyCustomView(context, attrs, defStyleAttr, defStyleRes) } } } // Използване на Builder val myView = MyCustomView.Builder(context) .setAttrs(attrs) .build()
Изборът между фабричен метод и builder pattern зависи от сложността на инициализацията на изгледа. За по-прости случаи достатъчни са фабричните методи. За по-сложни с множество опции е по-подходящ builder.