Immutable nesneler — oluşturulduktan sonra durumu değiştirilemeyen nesnelerdir. Temel özellikleri:
Immutable nesnelerin avantajları:
Immutable sınıfın uygulanmasına örnek:
public final class Person { private final String name; private final int age; private final List<String> phones; public Person(String name, int age, List<String> phones) { this.name = name; this.age = age; // Geçerli listeyi değişimden koruma this.phones = Collections.unmodifiableList(new ArrayList<>(phones)); } public String getName() { return name; } public int getAge() { return age; } public List<String> getPhones() { return phones; } // Read-only liste döndür }
Java'da String neden immutable ve eğer böyle olmasaydı ne olurdu? Birçok kişi "güvenlik için" yanıt veriyor, ancak bu pratikte ne anlama geliyor?
Cevap:
String birçok yerde kullanılmaktadır: koleksiyonlar içinde anahtar olarak, güvenlik mantığında (örneğin, parolalar). Eğer bir string bir referans üzerinden değiştirilebilseydi, bu aynı nesneye sahip diğer tüm referansları etkilerdi ki bu, koleksiyonların doğru çalışmasını imkansız hale getirirdi (örneğin, HashMap — hashCode hesaplanırken) ve güvenlik açıklarına yol açabilirdi.
Hikaye
Collections.unmodifiableList döndürmeye başlayana kadar.Hikaye
Date, List) tutuluyordu. Bir iş parçacığında konfigürasyon değiştirildi, diğerinde ise eski veya tutarsız verileri alındı, bu da iş algoritmasının yanlış çalışmasına neden oldu.Hikaye
Giriş sisteminde parolalar değiştirilebilir bir nesnede tutuluyordu. Güvensiz bir erişimle bir kullanıcının parolası aniden sızdı çünkü aynı nesne örneği birden fazla iş parçacığı tarafından kullanılıyordu.