şükela:  tümü | bugün
  • ing. asla değişmeyen, sabit.
  • smashing pumpkinsin machines of god albumundeki stand inside your love sarkısında gecen kelime.
    -you and me meant to be immutable, impossible..
  • javada, degeri degi$tirilemeyen nesneler icin kullanilan niteleme. wrapper nesneleri ya da string nesneleri, ornek olarak verilebilir.

    ornek:
    string x = "obafemi";
    x.concat(" martins");
    system.out.println("x = " + x);

    yukaridaki kodun ciktisi; x = obafemi olur. cunku string nesneleri, tanim geregi, immutabledir, degerleri degi$tirilemez, bu durumda ikinci satirda cagrilan concatenation method'u, x'in mevcut degerini degi$tirmez, sadece yeni bir string nesnesinin yaratilmasina sebep olur, ama yaratilan bu nesne, herhangi bir referans degi$kenine atanmadigi icin, memory'de eri$ilemez bir $ekilde durmaya mahkumdur.

    ote yandan, immutable taniminin biraz kafa kari$tiran bir yani daha vardir: immutable bir nesnenin atandigi referans degi$keni immutable degildir.

    yukaridaki string orneginden devam edersek:
    string x = "obafemi";
    x = x.concat(" martins");
    system.out.println("x = " + x);

    bu kez cikti; x = obafemi martins olur. cunku x'e atanan string degerinin pe$ine yeni bir string daha yapi$tirilmi$tir ve bu yeni string de, referans degi$kenleri immutable olamayacagi icin, tekrar x'e atanabilmi$tir.
  • yazilim tasariminda onemli bir kavramdir immutable types.

    genis bir codebase uzerinde calisiyorsaniz, immutable tiplerin faydasini anlamayanlarin saldirilarina mutemadiyen maruz kalabilirsiniz.

    konusma icerisinde kullanalim:

    tangut: ben o nesnenin sadece o degerini degistirmek istiyorum degistiremiyorum ne bicim kutuphane yaziyorsunuz!
    kuzu: degistiremiyorsan degistirmemen gerekiyordur minik bizon.

    fonksiyonel programlama dillerinde (haskell, lisp) tum veri tipleri dogasi itibariyle zaten immutable'dir.
  • objective-c code yazarken kullanilan nsarray'in de yarrattigi array object'i immutable'dir. icinde hole olmasina izin vermez. bu array'e inject edilen butun item'lar olmalari zorunlu oldugu icin ordadir. ilginc dil bu objective-c
  • bunun ne anlama geldiğini anlamak için, immutable bir class olan string class'inin implementasyonuna bakmak gerekir. string class'ının touppercase() method'una bakarsanız, return ettiği ifade şu şekildedir;

    return new string(result, 0, len + resultoffset);

    yani touppercase() metodu, string'in 3 parametreli constructor'ını kullanıyor. string(char[], int, int), yani yeni bir string.

    bu constructor ise;

    this.value = arrays.copyofrange(value, offset, offset+count);

    ifadesini geri donuyor, sonuç olarak touppercase method'u, önce bir char array olarak işlemini yapıyor, sonra bu char array'i 0'dan offset'e kadar olan kısmını yeni bir string'e atıyor ve ilk olarak kullanılan string'den farklı bir string tahsis etmiş oluyor. yani siz bu method'u her çağırdığınızda yeni bir string yaratılıyor, böylelikle class'ın "immutable" özelliği bozulmamış oluyor.

    immutable bir class, kendi tipinden bir obje geri dönüyorsa, her şekilde bu geri dönülecek olan obje tekrar yaratılmış olmak zorundadır. dolayısıyla o class'ın bir method'unu çağırmanız, o class'ın instance'ını değiştiremeyeceğinizin garantisi kabulüyle olur.

    eğer string immutable olmasaydı, touppercase method'u string'in içindeki veriyi değiştirir, geri döneceği değer de (illa ki dönecekse ki buna gerek yok), this pointer'ı ile sağlanırdı. yani tabi bu farazi oldu, immutable'ı değilse data update edilir, referans değişmezdi demek istiyorum.

    kabaca immutable olan bir class'ın içeriği değiştiren her method'u yeni bir referans döner.
  • ayrıca basitçe şu şekilde bir string class'ının immutable olduğu görülebilir;

    yukaridaki örneğe temel alırsak;

    s = s.touppercase();

    herhangi bir string objesini yaratıp, bunun referansını, object.tostring() metodundan esinlenerek ekrana basılır, sonra string.touppercase() metodu çağırıldıktan sonraki referansı ekrana basılır. iki referans, method çağırıldığında yeni bir obje yaratılıyorsa farklı olur.

    örnek kod;
    https://github.com/…/immutable/stringreference.java

    edit: referans dedim halbuki basılan şey hashcode. hashcode ise referans değil tam olarak. java'da bir objenin hafıza adresini, yani referans adresini öğrenmek mümkün müdür bilmiyorum, yani garbage collector'ın herhangi bir zamanda bunu değiştirme yetkisi bulunmakta. fakat yeni yeni java öğrenen birisi için (gerçi ben de yeni öğreniyorum, c'den gelen insanlar için daha kolay olur referans kelimesini kullanmak) basit olması açısından referans yazmışım, yoksa object.tostring kesinlikle referans değil, sadece hashcode return ediyor.

    edit: burada duzeltilecek bir sey var hashcode'la ilgili.
  • bir objenin immutable olmasi demek, o objenin state'inin o obje yaratildiktan sonra asla degismemesi demektir. bu tip objelerin state'leri, disariya bagimli oldugu icin state'in obje yaratildiktan sonra degistirilememesi, thread-safe uygulamalar icin gereklidir.