Android'de hangi veri türleri vardır ve nasıl uygulanır
Android'deki veri türleri; bir uygulamada verilerin nasıl depolandığını, aktarıldığını ve işlendiğini belirleyen kurallar ve formatlar kümesidir (ilkel türler, referans nesneler, Parcelable/Serializable, MIME türleri, bileşen türleri, kaynaklar ve asenkron türler). Aşağıda kısa açıklamalar ve pratik tavsiyeler bulacaksınız.
Temel veri türü kategorileri ve rolleri
- İlkel türler (int, long, float, boolean): Hızlıdır, bellek tahsisi gerektirmez — sayaçlar, animasyonlar ve sık yapılan hesaplamalar için kullanın.
- Referans türler (String, List, View, Bitmap): Karmaşık yapıları barındırır — RecyclerView için listeler, ImageView için görseller. Kotlin'de gereksiz kutulamadan (boxing) kaçının; mümkün olduğunca inline sınıflar kullanın.
- Parcelable vs Serializable:
- Parcelable — Android'in yerel serileştirme mekanizmasıdır, daha hızlı ve daha kompakttır; Intent veya Binder üzerinden nesne aktarımı için uygulayın.
- Serializable — Daha basittir ancak daha yavaştır ve düşük donanımlı cihazlarda OOM (Out Of Memory) riski daha yüksektir.
- MIME türleri (image/jpeg, application/pdf): Intent filtreleri ve ContentProvider için içerik formatını belirler; dosya paylaşımı ve açma işlemlerinde zorunludur.
- Bileşenler (Activity, Service, BroadcastReceiver, ContentProvider): Her birinin kendi yaşam döngüsü ve veri yönlendirme için özel "türde" Intent/URI'si vardır.
- Kaynaklar ve düzen (layout) türleri: drawable, color, string-array, layout (ConstraintLayout, LinearLayout) — R üzerinden ve data binding/Compose ile kullanılır.
- Asenkron türler (suspend, Flow
, StateFlow): Veri akışları ve UI güncellemeleriyle çalışmanın modern yolu (Compose'da collectAsState, Room'da Flow).
Kotlin'de Activity'ler arasında nesne aktarmak için @Parcelize kullanın — kod kısalır ve manuel uygulama hatalarından kaçınılır.
Nerede ve nasıl uygulanır — Somut senaryolar
- Ekranlar arası veri aktarımı: intent.putExtra("data", myParcelableObject) — Parcelable'ı @Parcelize ile uygulayın.
- IPC ve servisler: İşlemler arasında karmaşık nesneler aktarmak için AIDL/Parcelable kullanın.
- Dosya açma/paylaşma: intent.setType("image/*").setAction(Intent.ACTION_SEND) ve manifest'te mimeType içeren intent-filter'lar.
- Veritabanı ve UI ile çalışma: DAO'dan Flow
döndürün, UI'da reaktif güncelleme için collectAsState/collect kullanın. - Kaynaklar: Tekrarlayan dizeleri string-array içinde gruplayın, ölçeklenebilirlik için vector drawable kullanın.
Parcelable ve Serializable Karşılaştırması
Nesne aktarımında seçim yapmak için karşılaştırma
| Tür | Hız | Boyut | Öneri |
|---|---|---|---|
| Parcelable | Yüksek (yansıma yok) | Kompakt | Intent/Binder için, Kotlin'de @Parcelize |
| Serializable | Düşük (yansıma) | Daha büyük | Sadece basit, nadiren aktarılan nesneler için |
Büyük bitmap/dizileri Intent üzerinden aktarmayın — bunun yerine dosya/URI (SAF) veya SharedViewModel kullanmak daha iyidir.
Sık yapılan hatalar
- Performans kritik alanlarda Serializable yerine Parcelable kullanmamak.
- Büyük nesneleri Intent üzerinden aktarmak ve OOM almak.
- Raw türlerden (Object) dönüşüm yapmak ve unchecked-cast kullanmak — ClassCastException'a yol açar.
- Android 12+ üzerinde genel bileşenler için manifest'te exported özelliğinin eksik olması.
SSS
- Parcelable'ı her zaman manuel olarak yazmak gerekir mi?
- Hayır. Kotlin'de sınıf basitse ve özel mantık gerektirmiyorsa @Parcelize kullanın.
- Ne zaman intent-filter'da MIME kullanmalıyım?
- Uygulamanın dosyaları veya dış bağlantıları formatlarına göre açması/işlemesi gerektiğinde.
- Android için Flow, RxJava'dan neden daha iyidir?
- Daha az boilerplate kod, Kotlin Coroutines ve lifecycle-aware API'lerle daha iyi entegrasyon.
Özetle: İlkel ve referans verileri net bir şekilde ayırarak başlayın, aktarım için Parcelable/@Parcelize, dosya işlemleri için MIME, asenkron mantık için ise Flow/StateFlow kullanın. Bu yaklaşım uygulamanızın performansını ve kararlılığını hemen artıracaktır.