Immutable Bir Sınıf Nasıl Oluşturulur?

Metin Alnıaçık
2 min readApr 11, 2023

--

Merhaba, bu yazımızda immutable sınıfın ne olduğu veya avantajlarının ve dejavantajlarının neler olduğu gibi soruların üzerinde durmayacağız. Sadece Immutable sınıfın nasıl oluşturulacağı ve oluşturulurken nelere dikkat edilmesi gerektiği üzerinde duracağız.

Bir sınıfın, immutable sınıf olabilmesi için aşağıdaki koşulları sağlaması gerekmektedir.

1 — Sınıf, final olarak tanımlanmalıdır. Yani, herhangi bir sınıf bu sınıftan kalıtım alamayacaktır.
2 — Sınıftaki tüm alanlar private olarak tanımlanmalıdır.
3 — Sınıftaki hiçbir alanının setter metodu olmamalıdır.
4 — Sınıftaki tüm alanlar final olarak tanımlanmalıdır.
5 — Sınıftaki tüm alanların verileri, nesne oluşturulurken atanmalıdır.
6 — Eğer mutable olan referans tip bir alanın getter metodu ve constructor tanımı yapılıyorsa, gerçek nesnenin referansını kullanmak yerine nesnenin kopyası kullanılmalıdır.

Bu kavramın daha kolay anlaşılabilmesi için örnekleri basitten, nispeten daha karmaşık olanlara doğru adım adım gideceğiz.

Durum 1: sınıftaki alanlardan hiçbiri mutable değilse immutable sınıf aşağıdaki gibi oluşturulur.

Yukarıdaki immutable sınıfı test edebilmek için main metodu bulunan bir sınıf yazıyoruz.

personForCase1 nesnesindeki name ve surname alanlarını değiştirilemez. Yani ilgili nesnedeki hiçbir değer değiştirilemez!

Durum 2: sınıfın içerisindeki alanlardan bir tanesi user-defined bir sınıftır. Bu sınıf immutable’dır. Bu durumda da ilk örnekte olduğu gibi hiçbir değer değişmeyecektir.

Yukarıdaki sınıfları test edebilmek için main metodu bulunan bir sınıf yazıyoruz.

personForCase2 ve extraInformations nesnelerindeki hiçbir alanın değeri değiştirilemez. Çünkü her iki sınıf da immutable’dır.

Durum 3: sınıfın içerisindeki alanlardan bir tanesi user-defined bir sınıftır. Bu sınıf mutable’dır. Bu örneği dikkatlice inceleyelim.

Yukarıdaki sınıfları test edebilmek için main metodu bulunan bir sınıf yazıyoruz.

Konsol ekranında görüldüğü gibi, extraInformationsAsMutable nesnesinin setAge metodu kullanılarak age değeri güncellenebilir. Bunun yanı sıra personForCase3.getExtraInformationsAsMutable() satırında da extraInformationsAsMutable nesnesi alınır ve setAge metodu kullanılarak age değeri güncellenebilir. Bu durumda PersonForCase3 sınıfı immutable değildir.

Durum 4: yukarıdaki örnekte oluşturulmuş olan extraInformationsAsMutable nesnesinin setAge metodunu etkisiz hale getirmek istiyorsak, PersonForCase4 sınıfının constructor kısmında bazı değişiklikler yapmamız gereklidir.

12. satırda, constructor ile gelen değeri direkt olarak sınıftaki değere atamak yerine yeni bir nesne oluşturarak dışarıdaki nesne ile sınıfın içerisindeki nesne arasındaki referans bağını koparıyoruz. Bu durumu test edebilmek için main metodu bulunan bir sınıf yazıyoruz.

PersonForCase4 sınıfının constructor‘ında yapmış olduğumuz değişikliklerden dolayı 8. satırdaki setAge metodu çalışmayacaktır. Fakat 14. satırdaki setAge metodu çalışacaktır. Bunu engellemek için bir geliştirme daha yapmamız gereklidir.

Durum 5: immutable sınıf oluşturmak için hem constructor’da hem de ilgili mutable alanın getter metodunda bazı değişiklikler yapılması gereklidir.

Yukarıdaki sınıfta hem constructor (11. satır) hem de getExtraInformationsAsMutable metodunda nesne new anahtar kelimesi kullanılarak oluşturuluyor (23. satır). Bu sayede ilgili sınıfın dışarıdaki nesnelerle referans ilişkisi kalmıyor. Test edebilmek için main metodu bulunan bir sınıf yazıyoruz.

PersonForCase5 sınıfına eklediğimiz kodlardan dolayı 9. ve 14. satırlardaki setAge metotları işlevsiz kalacaktır. PersonForCase5 immutable bir sınıftır, diyebiliriz.

Örneğin tamamına github adresimden ulaşabilirsiniz.

İyi günler,
Bol kodlamalar :)

--

--