Middle
როგორ გავწეროთ ოთხი კონსტრუქტორი პერსონალიზებული ხედვაში (CustomView)?
sobes.tech AI
პასუხი AI-სგან
მოდელი მეთოდი ან builder pattern შეიძლება გამოყენებულ იქნას პირდაპირი კონსტრუქტორების ნაცვლად:
-
მოდელი მეთოდი: საშუალებას აძლევს შექმნას ხატვის მაგალითები, აბსტრაქცირებს შექმნის პროცესს და მალავს საჭირო კონსტრუქტორის არჩევის ლოგიკას:
class MyCustomView private constructor( context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int ) : View(context, attrs, defStyleAttr, defStyleRes) { // პირადი კონსტრუქტორი, რათა გამოიყენოს ფაბრიკური მეთოდები companion object { fun createDefault(context: Context): MyCustomView { // საწყისი ლოგიკა დეფოლტ კონსტრუქტორისთვის return MyCustomView(context, null, 0, 0) } fun createFromAttrs(context: Context, attrs: AttributeSet?): MyCustomView { // ლოგიკა ატრიბუტებით return MyCustomView(context, attrs, 0, 0) } // დამატებითი ფაბრიკური მეთოდები სხვა კონსტრუქტორებისთვის } } -
Builder pattern: სასარგებლოა, როდესაც კონსტრუქტორების რაოდენობა ბევრია ან მათ აქვთ მრავალი არჩევითი პარამეტრი. საშუალებას აძლევს ეტაპობრივად შექმნას ხატვის ობიექტი:
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) { // პირადი კონსტრაქტორი 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 { // შექმნის და ინიციალიზაციის ლოგიკა return MyCustomView(context, attrs, defStyleAttr, defStyleRes) } } } // გამოყენება builder-ის val myView = MyCustomView.Builder(context) .setAttrs(attrs) .build()
შერჩევა — მოდელი მეთოდი ან builder pattern, დამოკიდებულია ხატვის ინიციალიზაციის სირთულეზე. მარტივ შემთხვევებში საკმარისია მოდელი მეთოდები, ხოლო რთულ და მრავალ ვარიანტიან შემთხვევებში — builder უკეთესია.