Middle
Geliştirme deneyiminizde genericleri nerelerde kullandınız?
sobes.tech yapay zeka
AI'dan gelen yanıt
Jeneriklerin kullanımı:
- Tip güvenli koleksiyonlar uygulamak için. Örneğin,
ArrayList<MyObject>yerine hamArrayListkullanmak, çalışma zamanında tip dönüşüm hatalarını önler.// Tip güvenli olmayan yaklaşım (ham tip) List list = new ArrayList(); list.add("Dize"); list.add(123); // int ekleniyor // Jenerikler ile tip güvenli yaklaşım List<String> stringList = new ArrayList<>(); stringList.add("Dize"); // stringList.add(123); // Derleyici hata verecek - RecyclerView için evrensel adaptörler oluşturmak için. Farklı veri tipleri için adaptör mantığını yeniden kullanmaya olanak tanır.
// Evrensel bir ViewHolder örneği class GenericViewHolder<T>(itemView: View) : RecyclerView.ViewHolder(itemView) { fun bind(item: T) { // T tipine bağlı veri bağlama mantığı } } // Evrensel adaptör örneği class GenericAdapter<T>(private val items: List<T>) : RecyclerView.Adapter<GenericViewHolder<T>>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GenericViewHolder<T> { // ViewHolder oluştur } override fun onBindViewHolder(holder: GenericViewHolder<T>, position: Int) { holder.bind(items[position]) } override fun getItemCount() = items.size } - Nesne fabrikaları oluşturmak için. Belirli bir nesne tipi almak için açık dönüşüm olmadan.
interface Factory<T> { T create(); } class StringFactory implements Factory<String> { @Override public String create() { return "Yeni dize"; } } class IntegerFactory implements Factory<Integer> { @Override public Integer create() { return 100; } } Factory<String> stringFactory = new StringFactory(); String myString = stringFactory.create(); // Dize alınır, dönüşüm gerekmez - Metodlar ve sınıflarda tipleri kısıtlamak için.
<T extends MyInterface>veya<T super MyClass>gibi kısıtlı jenerikler kullanmak, jenerik tipin belirli bir arayüzü uyguladığını veya belirli bir sınıftan türediğini garanti eder.// Serializable arayüzünü uygulayan öğeler listesini kabul eden metod public <T extends Serializable> void saveObjectList(List<T> list) { // Kaydetme mantığı } - Mimari bileşenlerde. Örneğin, LiveData veya ViewModel ile çalışırken, genellikle yönetilen veri tipini belirlemek için jenerikler kullanılır.
// Belirli bir tipteki nesnelerin listesi için LiveData val myData: LiveData<List<MyItem>> = // başlatma // Belirli bir tipteki verilerle ViewModel class MyViewModel : ViewModel() { val data: MutableLiveData<MyStateType> by lazy { MutableLiveData<MyStateType>() } } - Ağ istemcileri geliştirilirken. Sunucu yanıtlarının otomatik olarak belirli bir tipe deserialize edilmesi için.
// Retrofit servisi örneği, yanıtında jenerik kullanımı interface ApiService { @GET("users") Call<List<User>> getUsers(); @GET("products/{id}") Call<Product> getProduct(@Path("id") String productId); }
Jenerikler, tip güvenliğini, okunabilirliği ve kodun yeniden kullanılabilirliğini önemli ölçüde artırdı.