Sobes.tech
Middle

Hoe verwijder je de vier constructors in de aangepaste weergave (CustomView)?

sobes.tech AI

Antwoord van AI

Je kunt de fabriekmethode of het builder-patroon gebruiken in plaats van direct gebruik te maken van constructeurs.

  • Fabriekmethode: Maakt het mogelijk om instanties van de weergave te maken, door het creatieproces te abstraheren en de logica voor het kiezen van de juiste constructor te verbergen.

    class MyCustomView private constructor(
        context: Context,
        attrs: AttributeSet?,
        defStyleAttr: Int,
        defStyleRes: Int
    ) : View(context, attrs, defStyleAttr, defStyleRes) {
    
        // Privé constructor om het gebruik van fabrieksmethoden af te dwingen
    
        companion object {
            fun createDefault(context: Context): MyCustomView {
                // Initialisatiemethode voor de standaardconstructor
                return MyCustomView(context, null, 0, 0)
            }
    
            fun createFromAttrs(context: Context, attrs: AttributeSet?): MyCustomView {
                // Initialisatie met attributen
                return MyCustomView(context, attrs, 0, 0)
            }
    
            // Extra fabrieksmethoden voor andere constructorcombinaties
        }
    }
    
  • Builder-patroon: Handig wanneer er veel constructors zijn of ze veel optionele parameters hebben. Maakt het mogelijk om het object stapsgewijs te maken.

    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) {
    
        // Privé constructor
    
        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 om de view te maken en te initialiseren op basis van de parameters
                return MyCustomView(context, attrs, defStyleAttr, defStyleRes)
            }
        }
    }
    
    // Gebruik van de builder
    val myView = MyCustomView.Builder(context)
        .setAttrs(attrs)
        .build()
    

De keuze tussen fabrieksmethode en builder-patroon hangt af van de complexiteit van de initialisatie van de view. Voor eenvoudigere gevallen zijn fabrieksmethoden voldoende. Voor complexere gevallen met veel opties is het builder-patroon aan te bevelen.