Sobes.tech
Middle

Como eliminar os quatro construtores na visualização personalizada (CustomView)?

sobes.tech IA

Resposta da IA

Pode usar o método de fábrica ou o padrão builder em vez de usar diretamente os construtores.

  • Método de fábrica: Permite criar instâncias da vista, abstraindo o processo de criação e escondendo a lógica de seleção do construtor necessário.

    class MyCustomView private constructor(
        context: Context,
        attrs: AttributeSet?,
        defStyleAttr: Int,
        defStyleRes: Int
    ) : View(context, attrs, defStyleAttr, defStyleRes) {
    
        // Construtor privado para forçar o uso de métodos de fábrica
    
        companion object {
            fun createDefault(context: Context): MyCustomView {
                // Lógica de inicialização para o construtor padrão
                return MyCustomView(context, null, 0, 0)
            }
    
            fun createFromAttrs(context: Context, attrs: AttributeSet?): MyCustomView {
                // Lógica de inicialização com atributos
                return MyCustomView(context, attrs, 0, 0)
            }
    
            // Métodos de fábrica adicionais para outras combinações de construtores
        }
    }
    
  • Padrão builder: É útil quando há muitos construtores ou eles têm múltiplos parâmetros opcionais. Permite criar o objeto passo a 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) {
    
        // Construtor privado
    
        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 {
                // Lógica de criação e inicialização da vista com base nos parâmetros
                return MyCustomView(context, attrs, defStyleAttr, defStyleRes)
            }
        }
    }
    
    // Uso do Builder
    val myView = MyCustomView.Builder(context)
        .setAttrs(attrs)
        .build()
    

A escolha entre método de fábrica e padrão builder depende da complexidade da inicialização da vista. Para casos mais simples, os métodos de fábrica são suficientes. Para casos mais complexos com múltiplas opções, o padrão builder é preferível.