Merhaba değerli Java dostları, bu kısa yazımda basit ama bir o kadar net anlaşılmayıp sadece terim olarak bilinen bir konuya değinmek istiyorum. Konumuz immutable nesne yani değişmez nesneler. Immutable nesne bir defa oluşturulduktan sonra değeri veya içerisindeki alanların değerleri değiştirilemeyen nesnedir. Peki böyle bir duruma niçin ihtiyacımız olur diye bir soru sorarsak, cevabı thread safe konusudur. Immutable nesnelerin değerleri değişmeyeceği için üzerinde kaç tane thread çalışırsa çalışsın hep aynı değerler üzerinden işlem yapılacaktır. Immutable nesnelerin dezavantajı ise, değerin değişmesini istiyorsak yeni bir nesne oluşturmamız gerekiyor. Bu da zaman, bellek ve garbage collector anlamında maliyet demektir. Şimdi örnek kodlarımızı inceleyelim. Sırası ile mutable yani değişen, immutable sınıflar ve Java içerisinden bir örnek.

package anajavatica.object;

public class MutableObject {

private int aField = 0;

public MutableObject(int aField) {
this.aField = aField;
}

public int getaField() {
return aField;
}

public void setaField(int aField) {
this.aField = aField;
}

}

package anajavatica.object;

public class ImmutableObject {

private int aField = 0;

public ImmutableObject(int aField) {
this.aField = aField;
}

public int getaField() {
return aField;
}

}

package anajavatica.object;

public class MutableMain {

private static final int LOOP = 100000;

public static void main(String[] args) {

String immutable = “”;

long start = System.currentTimeMillis();
for (int i = 0; i < LOOP; i++)
immutable += “a”;
System.out.println(System.currentTimeMillis() – start);
System.out.println(immutable.length());

StringBuffer mutable = new StringBuffer();
start = System.currentTimeMillis();
for (int i = 0; i < LOOP; i++)
mutable.append(“a”);

System.out.println(System.currentTimeMillis() – start);

}

}

 

Alanların set metotlarını kaldırarak kendi immutable sınıflarımızı yazabiliriz. Main sınıfımıza bakarsak, String bir immutable bir sınıftır. Dolayısıyla her yeni atamada yeni nesne oluşturulmaktadır ve bu işlem 100000 tekrar etmektedir. StringBuffer ise mutable bir sınıftır. Maini çalıştırdıktan sonra bende çıkan ms sonuçları 4000 – 3. Bin kattan daha fazla bir fark var.

Bol Java’ lı günler dileğiyle… 😀

Categories:

No responses yet

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.