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);
    }
    

Генерикҳо ба таври назаррас бехатарии намуд, хонданпазирӣ ва имконияти такрор истифода бурданро баланд мебардоранд.