Koleksiyonlar
- Kotlin kursu
- Orta seviye
- Ders 114/116
- 6 dk
List, Map ve Flow ile veri süzme yazarsın.
Library: Koleksiyon yönetimi
Bu ders, kitapları bir koleksiyonda tutan Library sınıfını tanımlar. İçinde private val books = mutableListOf<Book>() bulunur; add metodu ekler, listAll metodu kitapların bir kopyasını liste olarak döndürür. Böylece kitaplar tek bir yerden yönetilir.
class Library {
private val books = mutableListOf<Book>()
fun add(b: Book) { books.add(b) }
fun listAll(): List<Book> = books.toList()
}mutableListOf değiştirilebilir bir liste oluşturur; add sona ekler. toList() listenin değiştirilemez bir kopyasını döndürür; bu, dışarıdan listenin bozulmasını engeller. Kapsülleme (encapsulation) ilkesine göre books private tutulur; erişim metotlar üzerinden yapılır.
Kapsülleme ve erişim
books alanı private olarak tutulur; dışarıdan doğrudan erişilemez. Bu, kapsülleme (encapsulation) ilkesidir: iç temsil gizli, erişim metotlarla sınırlıdır. listAll, listenin bir kopyasını döndürdüğü için dış kod orijinal listeyi bozamaz.
val lib = Library()
lib.add(Book("Suç ve Ceza", "Dostoyevski", 1866, Fiction))
for (b in lib.listAll()) {
println(b.format())
}Burada kitap eklenir ve listAll ile döngüde gezilir. Dış kod lib.books'a erişemez (private); yalnızca add ve listAll kullanabilir. Bu, Library'nin iç tutararlılığını korur. İleride remove veya findByAuthor gibi metotlar eklenebilir.
Uygulama Library sınıfı tanımla ve kullan
Hazır koddaki Book ve Category tanımları hazır. Sen class Library tanımla. İçinde private val books = mutableListOf<Book>() olsun. fun add(b: Book) metodu books.add(b) yapsın. fun listAll(): List<Book> = books.toList() olsun. main içinde val lib = Library() oluştur; iki kitap ekle; for (b in lib.listAll()) ile her kitabın format çıktısını println ile yazdır.
Başlangıç kodu
data class Book(val title: String, val author: String, val year: Int, val category: Category) {
fun format(): String = "$title - $author ($year) [${category.label()}]"
}
sealed class Category {
abstract fun label(): String
}
object Fiction : Category() {
override fun label() = "Roman"
}
object NonFiction : Category() {
override fun label() = "İnceleme"
}
// Library sınıfı: Book tutan değiştirilebilir liste içersin (private val books)
// add(b: Book): listeye ekle
// listAll(): List<Book> döndür
// main: iki kitap ekle, listAll ile her birinin format çıktısını yazdır
fun main() {
// buraya yaz
}Örnek çözüm
class Library {
private val books = mutableListOf<Book>()
fun add(b: Book) { books.add(b) }
fun listAll(): List<Book> = books.toList()
}
fun main() {
val lib = Library()
lib.add(Book("Suç ve Ceza", "Dostoyevski", 1866, Fiction))
lib.add(Book("Sapiens", "Harari", 2011, NonFiction))
for (b in lib.listAll()) {
println(b.format())
}
}Beklenen çıktı
Suç ve Ceza - Dostoyevski (1866) [Roman] Sapiens - Harari (2011) [İnceleme]
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Library parçalarını eşle
| Kavram | Anlamı |
|---|---|
mutableListOf<Book> |
Değiştirilebilir liste |
fun add(b) |
Ekleme metodu |
fun listAll() |
Liste döndürme |
private val books |
Gizli alan |
2 Değiştirilebilir liste oluştur
private val books = ____<Book>()
private val books = mutableListOf<Book>()
Açıklama: mutableListOf<Book>() değiştirilebilir liste oluşturur.
3 Library.books alanı neden private yapılır?
- Daha az bellek tüketsin diye
- Dış kodun listeyi doğrudan değiştirmesini önlemek için Doğru cevap
- Daha hızlı çalışsın diye
- Derleyici uyarı vermesin diye
Açıklama: private, dış erişimi engeller ve kapsülleme sağlar.