Sobes.tech
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 ham ArrayList kullanmak, ç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ı.