Sobes.tech
Middle

Өзүңүздүн өнүктүрүү тажрыйбаңызда кайда генериктерди колдондуңуз?

sobes.tech AI

AIден жооп

Жалпысынан колдонулган гениериктер:

  • Типке коопсуз коллекциялар түзүү үчүн. Мисалы, ArrayList<MyObject> ордуна жука ArrayList колдонуу, бул типти өзгөртүү менен байланышкан каталарды алдын алат.
    // Типке коопсуз эмес ыкма (жука тип)
    List list = new ArrayList();
    list.add("Жол");
    list.add(123); // Int кошуу
    
    // Гениериктер менен типке коопсуз ыкма
    List<String> stringList = new ArrayList<>();
    stringList.add("Жол");
    // stringList.add(123); // Компилятор катаны чыгарат
    
    
  • RecyclerView үчүн универсалдуу адаптерлер түзүү үчүн. Адаптер логикасын ар кандай маалымат түрлөрү үчүн кайра колдонууга мүмкүндүк берет.
    // Универсалдуу ViewHolder мисалы
    class GenericViewHolder<T>(itemView: View) : RecyclerView.ViewHolder(itemView) {
        fun bind(item: T) {
            // T түрүнө жараша маалыматты байлоо логикасы
        }
    }
    
    // Универсалдуу адаптер мисалы
    class GenericAdapter<T>(private val items: List<T>) : RecyclerView.Adapter<GenericViewHolder<T>>() {
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GenericViewHolder<T> {
            // ViewHolder түзүү
        }
    
        override fun onBindViewHolder(holder: GenericViewHolder<T>, position: Int) {
            holder.bind(items[position])
        }
    
        override fun getItemCount() = items.size
    }
    
  • Объект фабрикаларын түзүү үчүн. Конкреттүү түрдөгү объектти алуу үчүн, аны түздөн-түз түргө өткөрбөстөн.
    interface Factory<T> {
        T create();
    }
    
    class StringFactory : Factory<String> {
        override fun create(): String {
            return "Жаңы жол";
        }
    }
    
    class IntegerFactory : Factory<Int> {
        override fun create(): Int {
            return 100;
        }
    }
    
    Factory<String> stringFactory = StringFactory();
    val myString: String = stringFactory.create(); // String алдык, түргө өткөрбөстөн
    
  • Типтерди чектөө үчүн. Чектелген гениериктерди колдонуу (<T extends MyInterface> же <T super MyClass>) белгилүү бир интерфейсти ишке ашырган же белгилүү бир класстан мурас алган типти камсыз кылуу үчүн.
    // Метод, Serializable интерфейсин ишке ашырган элементтердин тизмесин кабыл алат
    public <T extends Serializable> void saveObjectList(List<T> list) {
        // Сактоо логикасы
    }
    
  • Архитектуралык компоненттерде. Мисалы, LiveData же ViewModel менен иштөөдө, көбүнчө гениериктер колдонулат, алар башкарган маалыматтардын түрүн аныктоо үчүн.
    // Белгилүү бир түрдөгү объекттердин тизмеси үчүн LiveData
    val myData: LiveData<List<MyItem>> = // баштоо
    
    // Белгилүү бир түрдөгү маалыматтар менен ViewModel
    class MyViewModel : ViewModel() {
        val data: MutableLiveData<MyStateType> by lazy {
            MutableLiveData<MyStateType>()
        }
    }
    
  • Тармактык кардарларды иштеп чыгууда. Серверден келген жоопторду конкреттүү түргө автоматтык десериализациялоо үчүн.
    // Retrofit кызматтын мисалы гениерик менен жоопто
    interface ApiService {
        @GET("users")
        Call<List<User>> getUsers();
    
        @GET("products/{id}")
        Call<Product> getProduct(@Path("id") String productId);
    }
    

Гениериктер коддун тип коопсуздугун, окумдуулугун жана кайра колдонулушу мүмкүнчүлүгүн жогорулатат.