Sobes.tech
Middle

İnkişaf təcrübənizdə harada generiklərdən istifadə etdiniz?

sobes.tech Süni İntellekt

AI-dan cavab

Növçülükdən istifadə etdi:

  • Tip təhlükəsiz kolleksiyaların həyata keçirilməsi üçün. Məsələn, ArrayList<MyObject> yerinə xam ArrayList istifadə etmək, tipə görə çevirmə ilə əlaqəli səhvlərin qarşısını alır.
    // Tip təhlükəsiz olmayan yanaşma (xam tip)
    List list = new ArrayList();
    list.add("Sətir");
    list.add(123); // int əlavə edir
    
    // Növ təhlükəsiz yanaşma ilə növçülük
    List<String> stringList = new ArrayList<>();
    stringList.add("Sətir");
    // stringList.add(123); // Kompilyator səhv verəcək
    
    
  • RecyclerView üçün ümumi adapterlərin yaradılması üçün. Müxtəlif məlumat tipləri üçün adapter loqikasını təkrar istifadə etməyə imkan verir.
    // Ümumi ViewHolder nümunəsi
    class GenericViewHolder<T>(itemView: View) : RecyclerView.ViewHolder(itemView) {
        fun bind(item: T) {
            // T tipindən asılı olaraq məlumatların bağlanması loqikası
        }
    }
    
    // Ümumi adapter nümunəsi
    class GenericAdapter<T>(private val items: List<T>) : RecyclerView.Adapter<GenericViewHolder<T>>() {
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GenericViewHolder<T> {
            // ViewHolder yaradılması
        }
    
        override fun onBindViewHolder(holder: GenericViewHolder<T>, position: Int) {
            holder.bind(items[position])
        }
    
        override fun getItemCount() = items.size
    }
    
  • Obyekt fabriklərinin yaradılmasında. Konkret obyekt tipini açıq çevirmədən almaq üçün.
    interface Factory<T> {
        T create();
    }
    
    class StringFactory : Factory<String> {
        override fun create(): String {
            return "Yeni sətir";
        }
    }
    
    class IntegerFactory : Factory<Int> {
        override fun create(): Int {
            return 100;
        }
    }
    
    Factory<String> stringFactory = StringFactory();
    val myString: String = stringFactory.create(); // Çevirmədən String əldə edilir
    
  • Metodlar və siniflərdə tiplərin məhdudlaşdırılması üçün. Məhdudlaşdırılmış növçülük istifadə edilir (<T extends MyInterface> və ya <T super MyClass>) və bu, növçülük tipinin müəyyən interfeysi həyata keçirməsini və ya müəyyən sinifdən irs almağını təmin edir.
    // Serializable interfeysini həyata keçirən elementlər siyahısını qəbul edən metod
    public <T extends Serializable> void saveObjectList(List<T> list) {
        // Yadda saxlamanın loqikası
    }
    
  • Memarlıq komponentlərində. Məsələn, LiveData və ya ViewModel ilə işləyərkən, tez-tez idarə etdikləri məlumat tiplərini müəyyən etmək üçün növçülük istifadə olunur.
    // Müəyyən tipdə obyektlərin siyahısı üçün LiveData
    val myData: LiveData<List<MyItem>> = // başlanğıc
    
    // Müəyyən tipdə məlumatlara malik ViewModel
    class MyViewModel : ViewModel() {
        val data: MutableLiveData<MyStateType> by lazy {
            MutableLiveData<MyStateType>()
        }
    }
    
  • Şəbəkə müştərilərinin hazırlanmasında. Serverdən alınan cavabların konkret tiplərə avtomatik deserializasiyası üçün.
    // Retrofit servisi nümunəsi və növçülük ilə cavab
    interface ApiService {
        @GET("users")
        Call<List<User>> getUsers();
    
        @GET("products/{id}")
        Call<Product> getProduct(@Path("id") String productId);
    }
    

Növçülük kodun tip təhlükəsizliyini, oxunaqlığını və təkrar istifadə imkanlarını əhəmiyyətli dərəcədə artırdı.