Middle
Cum să elimini cei patru constructori în vizualizarea personalizată (CustomView)?
sobes.tech AI
Răspuns de la AI
Poți folosi metoda fabrică sau pattern-ul builder în loc să folosești direct constructorii.
-
Metoda fabrică: Permite crearea de instanțe ale vizualizării, abstractizând procesul de creare și ascunzând logica de alegere a constructorului necesar.
class MyCustomView private constructor( context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int ) : View(context, attrs, defStyleAttr, defStyleRes) { // Constructor privat pentru a forța utilizarea metodelor fabrică companion object { fun createDefault(context: Context): MyCustomView { // Logica de inițializare pentru constructorul implicit return MyCustomView(context, null, 0, 0) } fun createFromAttrs(context: Context, attrs: AttributeSet?): MyCustomView { // Logica de inițializare cu atribute return MyCustomView(context, attrs, 0, 0) } // Metode fabrică suplimentare pentru alte combinații de constructori } } -
Pattern-ul builder: Este util când există mulți constructori sau aceștia au multiple parametri opționali. Permite crearea pas cu pas a obiectului.
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) { // Constructor privat 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 { // Logica de creare și inițializare a vederii pe baza parametrilor return MyCustomView(context, attrs, defStyleAttr, defStyleRes) } } } // Utilizarea builder-ului val myView = MyCustomView.Builder(context) .setAttrs(attrs) .build()
Alegerea între metoda fabrică și pattern-ul builder depinde de complexitatea inițializării vederii. Pentru cazuri mai simple, metodele fabrică sunt suficiente. Pentru cazuri complexe cu multiple opțiuni, este preferabil pattern-ul builder.