Immutable (değişmez), nesneler bir kez oluşturulduktan sonra içeriği değiştirilemeyen sınıflardır. Tam tersi olarak, değiştirilebilen sınıflar da Mutable (değişebilir) sınıflardır. Kısacası Immutable nesneler değişmeyen nesnelerdir. Onları oluşturursun, fakat onları değiştiremezsin. Bunun yerine, değişmez bir nesneyi değiştirmek isterseniz, onu klonlamanız ve oluştururken klonu değiştirmeniz gerekir.
Immutable nesneler, çok iş parçacıklı(multi-threaded) ortamlarda ve streamlerde kullanışlıdır. Değişmeyen nesnelere güvenmek harikadır. Başka bir thread’in nesnesini değiştiren bir iş parçacığının neden olduğu hatalar olabilir. Immutable nesneler, bu sorunların tümünü çözmüş olacaktır.
Brian Goetz ” Java Concurrency in Practice ” kitabında bunu daha ayrıntılı olarak açıklamıştır.
Java’da yaygın olanlarından örnek verecek olursak String ve tüm ilkel sarmalayıcılar (Integer, Long, Double, Byte….), BigDecimal, BigInteger immutable sınıflardır. Date, StringBuilder mutable sınıflardandır.
Aşağıdaki örnekle String’in değerinin değişmediğini göreceksiniz.
1 2 3 |
String str = new String("Koray"); str.toUpperCase(); System.out.println(str); |
Date sınıfını hepimiz aktif olarak kullandık ve mutable olmasından dolayı sıkıntılar yaşamışızdır. Bu sebeple Java 8 ile beraber immutable olan LocalDate sınıfı gelmiştir. Aşağıdaki örneği inceleyiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public static void main(String[] args) { Date date = new Date(); System.out.println(date); date.setDate(5); System.out.println(date); LocalDate localDate = LocalDate.now(); System.out.println(localDate); localDate.plusDays(1); System.out.println(localDate); } |
Java’da değişmez sınıf yapmak için aşağıdaki adımları uygulamanız gerekir.
- Sınıfı, final anahtarı ile işaretlemek gerekir, böylece genişletilemez (extend edilemez).
- Sınıfın tüm alanlarını private yapın, böylece doğrudan erişime izin verilmez.
- Değişkenler için setter yöntemleri sağlamayın.
- Tüm değiştirilebilen alanları final yapın, böylece yalnızca bir kez atanabilir.
- Tüm alanların, contructor aracılığıyla ilk değerlerini atamasını sağla.
- Değiştirebilir olan tüm alanların dışarıya nesnelerin klonlanarak dönmesini gerçekleştirin.
1 2 3 4 5 6 7 8 9 10 11 12 |
public final class ImmutablePerson { private final String name; public ImmutablePerson(String name) { this.name = name; } public String getName() { return name; } } |
Effective Java’da, Joshua Bloch bu etkileyici tavsiyeyi yapar:
“Classes should be immutable unless there’s a very good reason to make them mutable….If a class cannot be made immutable, limit its mutability as much as possible.”
tesekkürler cok faydalı bir yazı olmus ellerinize sağlıkkk 🙂
Mervee çok teşekkür ederimmmm 🙂
Bir çok iş görüşmesinde karşımıza çıkan konulardan birisi, ve immutable-mutable nesneleri anlamak için faydalı bir yazı olmuş, elinize sağlık. 🙂
Yazılarınızı çok faydalı buluyorum.