Sobes.tech
Middle

¿Cómo eliminar los cuatro constructores en la vista personalizada (CustomView)?

sobes.tech AI

Respuesta de la IA

Se puede utilizar el método de fábrica o el patrón builder en lugar de usar directamente los constructores.

  • Método de fábrica: Permite crear instancias de la vista, abstraer el proceso de creación y ocultar la lógica de selección del constructor necesario.

    class MyCustomView private constructor(
        context: Context,
        attrs: AttributeSet?,
        defStyleAttr: Int,
        defStyleRes: Int
    ) : View(context, attrs, defStyleAttr, defStyleRes) {
    
        // Constructor privado para forzar el uso de métodos de fábrica
    
        companion object {
            fun createDefault(context: Context): MyCustomView {
                // Lógica de inicialización para el constructor por defecto
                return MyCustomView(context, null, 0, 0)
            }
    
            fun createFromAttrs(context: Context, attrs: AttributeSet?): MyCustomView {
                // Lógica de inicialización con atributos
                return MyCustomView(context, attrs, 0, 0)
            }
    
            // Métodos de fábrica adicionales para otras combinaciones de constructores
        }
    }
    
  • Patrón builder: Es útil cuando hay muchos constructores o tienen múltiples parámetros opcionales. Permite crear el objeto paso a paso.

    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 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 para crear e inicializar la vista basada en los parámetros
                return MyCustomView(context, attrs, defStyleAttr, defStyleRes)
            }
        }
    }
    
    // Uso del Builder
    val myView = MyCustomView.Builder(context)
        .setAttrs(attrs)
        .build()
    

La elección entre método de fábrica y patrón builder depende de la complejidad de la inicialización de la vista. Para casos más simples, los métodos de fábrica son suficientes. Para casos complejos con muchas opciones, es preferible usar builder.