Kotlin’de Iterator Pattern ve Data Class Kullanımı

Merhaba arkadaşım, bu makaleyi okumadan önce şuradaki yazımı okumanı isterim. Böylece burada anlattıklarımıza daha aşina olursun. Eğer okuduysan başlayabiliriz.

Iterator Pattern kullanımı hakkında ön bilgilere sahip olduğunu göre daha önceki uygulamada bazı değişiklikler yapmak istiyorum. Uygulamalara farklı şekillerde bakmak ufuk açan bir yaklaşımdır. Önceki uygulamada koleksiyon olarak sadece String veri sağlayan bir koleksiyon kullandık. Burada data class yapısını kullanarak projemize daha yenilikçi bir bakış açısı kazandıracağız. Öncelikle data class kavramı hakkında sizleri kısaca bilgilendirmek istiyorum.

Data class hakkında verdiğim bilgiler Kotlin kitabımdan alıntıdır.

Data Class kavramı, verileri tutmak ve üzerinde işlemler yapmak için geliştirilen bir kavramdır. Bu kavram aslında bir sınıftır. Fakat verileri tutmak ve üzerinde işlemler yapmak için özel olarak tasarlandığı için farklı özellikleri olan sınıflardır. Data Class özellikle kodun okunurluğunu arttıran yapılardır.
Java’ya aşina biriyseniz verilerle çalışmak için POJO (Plain Old Java Object) yapılarını kullanırdık. Bu yapılarda değişkenler tanımlanır ve her değişken için getter ve setter metotları kullanılırdı. Getter ile değişkenin değeri alınırken, setter ile değişkene yeni bir değer atanabilirdi.

Örnek bir POJO yapısı aşağıdaki gibidir.

public class City {
    String no;
    String name;

    public String getNo() {
        return no;
    }

    public void setNo(String no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
} 

Java gibi bir programlama dilinde maalesef Data Class gibi bir yapı bulunmadığı için POJO yapıları ile durumu idare etmeye çalışıyoruz. Kotlin’de sadece veriler ile çalışmak için Data sınıfları geliştirilmiştir. Yukarıdaki kod yerine Kotlin dilinde aşağıdaki kodu kullanmanız yeterlidir.


data class City(var no: String,
                var name: String)

Evet yapmanız gereken sadece budur. Data class tanımlamak için class anahtar ifadesinden önce data anahtar ifadesini eklemeniz gerekiyor. City sınıfını aşağıda kodlarınız vereceğimiz uygulamada kullanacağız.

Bu kısa bilgilendirmeden sonra kodları paylaşabiliriz.

Iterator



import City

interface Iterator {
    fun hasNext(): Boolean
    fun next(): City?
}

next() metodunun dönüş tipinin City olduğunu dikkat ediniz.

Container




interface Container {
    fun getIterator():Iterator
}

AllData.kt


var cities = ArrayList<City>()

class AllData : Container {
    override fun getIterator(): Iterator {
        fillList()
        return Languages()
    }

    private fun fillList() {
        cities.add(City("01","Adana"))
        cities.add(City("02","Adıyaman"))
        cities.add(City("03","Afyon"))
        cities.add(City("04","Ağrı"))
        cities.add(City("05","Amasya"))
        cities.add(City("06","Ankara"))
    }

    class Languages : Iterator {
        var index = 0
        override fun hasNext(): Boolean {
            if (index < cities!!.size) {
                return true
            }
            return false
        }

        override fun next(): City? {
            if (this.hasNext()) {
                return cities!!.get(index++)
            }
            return null
        }

    }
}

fillList() metodunda koleksiyona veri ekleme yöntemini fark ettiniz mi? Tabi cities koleksiyonunda saklanacak verilerin tipinin City olduğunu da kaçırmamak gerekiyor.

Home.kt

fun main() {
    val iterator = AllData().getIterator()
    println("NO---------City")
    while (iterator.hasNext()) {
        var city: City? = iterator.next()
        println("${city!!.no}---------${city!!.name}")
    }
}

Ekran çıktısı aşağıdaki gibidir.

Uygulamanın kaynak kodu için tıklayınız.