9 Ağustos 2015 Pazar

Immutable Nesneler

Giriş
Immutable veriyapıları, functional programlama ile iyice popüler olmaya başladılar. Java'da Immutable arayüzler ve veriyapıları yok. Bu gibi şeyler için genellikle harici kütüphanaler kullanılıyor. Eğer Java'da bu yapılar olsaydı muhtemelen şöyle bir hiyerarşimiz olurdu.
                  ImmutableIterable
     ____________/       |
    /                    |
Iterable        ImmutableCollection
   |    _______/    /          \   \___________
   |   /           /            \              \
 Collection  ImmutableList  ImmutableSet  ImmutableMap  ...
    \  \  \_________|______________|__________   |
     \  \___________|____________  |          \  |
      \___________  |            \ |           \ |
                  List            Set           Map ...
Immutable nesneler derleyici açısından state değiştirse bile kullanıcıya görünmez olduğu müddetçe sorun olmaz.

Immutable Nesneler State Paylaşımında Faydalıdır
Açıklaması şöyle. Burada immutable nesne constant gibi düşünülüyor. 
The most obvious example is a configuration. You don't want to change it at runtime, but it's often needed by different parts of your code. Something like the current user. You don't want to change it, but will want to share it with different modules.
State paylaşımı concurrent (eş zamanlı) uygulamalarda daha da önemli hale geliyor. Açıklaması şöyle
That, of course, is much more significant when talking about a multithreaded environment. With immutable objects, you don't have to worry if another thread mutated them, while this thread was using it between such and such lines of code. That makes threading code - again - much easier to reason about.
Java'daki Immutable String ve Integer
State paylaşımındaki benzer açıklamalar geçerli. Açıklaması şöyle
Immutability is good because it prevents you from making a change to an object and having that change affect a completely different part of the code which wasn't written with the possibility in mind that the objects it operates on could be changed somewhere else (very little code is really written to cope with that).

This is particularly useful with multithreaded code (where a change done by a different thread could happen in between the operations of a single line of code), but even single-threaded code is much easier to understand when methods you call can't change the objects you pass into them.

Immutable ve Builder
Nesneye yönelik programlamada immutable nesneleri yaratmak için Builder örüntüsü sıkça kullanılır.

Strong Immutable
Şöyle tanımlanıyor.
Ensure that methods can't be overridden by either making the class final (Strong Immutability) or making your methods final (Weak immutability).
Java'da Immutable ve Unmodifiable Farkı
Java Collections Framework'te şöyle bir yazı var.
Collections that do not support any modification operations (such as addremove and clear) are referred to as unmodifiable. [...] Collections that additionally guarantee that no change in the Collection object will ever be visible are referred to as immutable.
Eğer şöyle kodlarsak
Collections.unmodifiableList(java.util.List<? extends T>)
Sadece ilk listemize unmodifiable bir view elde ederiz. Her ne kadar view bizim için salt okunur olsa da altta kullanılan liste değişirse bizim view da değişir.






Hiç yorum yok:

Yorum Gönder