Sobes.tech
Middle

Come eliminare i quattro costruttori in una vista personalizzata (CustomView)?

sobes.tech AI

Risposta dell'AI

Puoi usare il metodo factory o il pattern builder invece di usare direttamente i costruttori.

  • Metodo factory: Permette di creare istanze della vista, astrarre il processo di creazione e nascondere la logica di scelta del costruttore necessario.

    class MyCustomView private constructor(
        context: Context,
        attrs: AttributeSet?,
        defStyleAttr: Int,
        defStyleRes: Int
    ) : View(context, attrs, defStyleAttr, defStyleRes) {
    
        // Costruttore privato per forzare l'uso dei metodi factory
    
        companion object {
            fun createDefault(context: Context): MyCustomView {
                // Logica di inizializzazione per il costruttore di default
                return MyCustomView(context, null, 0, 0)
            }
    
            fun createFromAttrs(context: Context, attrs: AttributeSet?): MyCustomView {
                // Logica di inizializzazione con attributi
                return MyCustomView(context, attrs, 0, 0)
            }
    
            // Metodi factory aggiuntivi per altre combinazioni di costruttori
        }
    }
    
  • Pattern builder: È utile quando ci sono molti costruttori o hanno molti parametri opzionali. Permette di creare l'oggetto passo dopo passo.

    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) {
    
        // Costruttore privato
    
        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 di creazione e inizializzazione della vista in base ai parametri
                return MyCustomView(context, attrs, defStyleAttr, defStyleRes)
            }
        }
    }
    
    // Uso del builder
    val myView = MyCustomView.Builder(context)
        .setAttrs(attrs)
        .build()
    

La scelta tra metodo factory e pattern builder dipende dalla complessità dell'inizializzazione della vista. Per casi più semplici, i metodi factory sono sufficienti. Per casi complessi con molte opzioni, è preferibile usare il pattern builder.