Middle
Hogyan szüntessük meg a négy konstruktorot az egyedi nézetben (CustomView)?
sobes.tech MI
Válasz az MI-től
A gyári módszer vagy a builder minta használható a konstruktorok közvetlen használata helyett.
-
Gyári módszer: Lehetővé teszi a nézet példányainak létrehozását, elvonva a létrehozási folyamatot, és elrejtve a megfelelő konstruktor kiválasztásának logikáját.
class MyCustomView private constructor( context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int ) : View(context, attrs, defStyleAttr, defStyleRes) { // Privát konstruktor, hogy kötelezővé tegye a gyári módszerek használatát companion object { fun createDefault(context: Context): MyCustomView { // Alapértelmezett konstruktor inicializálási logika return MyCustomView(context, null, 0, 0) } fun createFromAttrs(context: Context, attrs: AttributeSet?): MyCustomView { // attribútumokkal történő inicializálási logika return MyCustomView(context, attrs, 0, 0) } // További gyári módszerek más konstruktor kombinációkhoz } } -
Builder minta: Akkor hasznos, ha sok konstruktor van vagy sok opcionális paraméterrel rendelkezik. Lehetővé teszi az objektum lépésenkénti létrehozását.
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át konstruktor 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 { // A nézet létrehozásának és inicializálásának logikája a paraméterek alapján return MyCustomView(context, attrs, defStyleAttr, defStyleRes) } } } // Builder használata val myView = MyCustomView.Builder(context) .setAttrs(attrs) .build()
A gyári módszer és a builder minta közötti választás a nézet inicializálásának összetettségétől függ. Egyszerűbb esetekben elegendőek a gyári módszerek. Komplex esetekben, sok opcióval, a builder előnyösebb.