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); }
Генерикҳо ба таври назаррас бехатарии намуд, хонданпазирӣ ва имконияти такрор истифода бурданро баланд мебардоранд.