Middle
Jak odstranit čtyři konstruktory v vlastní představě (CustomView)?
sobes.tech AI
Odpověď od AI
Můžete místo přímého použití konstruktorů použít tovární metodu nebo pattern builder.
-
Tovární metoda: Umožňuje vytvářet instance zobrazení, abstrahuje proces vytváření a skrývá logiku výběru potřebného konstruktoru.
class MyCustomView private constructor( context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int ) : View(context, attrs, defStyleAttr, defStyleRes) { // Soukromý konstruktor, který vynucuje použití továrních metod companion object { fun createDefault(context: Context): MyCustomView { // Inicializační logika pro výchozí konstruktor return MyCustomView(context, null, 0, 0) } fun createFromAttrs(context: Context, attrs: AttributeSet?): MyCustomView { // Inicializační logika s atributy return MyCustomView(context, attrs, 0, 0) } // Další tovární metody pro jiné kombinace konstruktorů } } -
Pattern builder: Je užitečný, když je mnoho konstruktorů nebo mají mnoho volitelných parametrů. Umožňuje krokově vytvářet objekt.
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) { // Soukromý 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 { // Logika tvorby a inicializace pohledu na základě parametrů return MyCustomView(context, attrs, defStyleAttr, defStyleRes) } } } // Použití builderu val myView = MyCustomView.Builder(context) .setAttrs(attrs) .build()
Volba mezi tovární metodou a patternem builder závisí na složitosti inicializace pohledu. Pro jednodušší případy jsou dostačující tovární metody. Pro složitější s mnoha možnostmi je vhodnější pattern builder.