ProgramlamaJava Geliştirici

Java'da immutable nesneler nedir, değerleri nedir ve kendi immutable sınıfınızı doğru bir şekilde nasıl gerçekleştirebilirsiniz?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Immutable nesneler — oluşturulduktan sonra durumu değiştirilemeyen nesnelerdir. Temel özellikleri:

  • Tüm alanlar final;
  • Setter içermemektedir;
  • İçindeki nesnelere (örneğin, koleksiyonlara) değiştirilebilir referans alınamaz.

Immutable nesnelerin avantajları:

  • Çoklu iş parçacığı erişimi için güvenlidir (thread-safe);
  • Kolayca önbelleğe alınabilir ve koleksiyonlarda anahtar olarak yeniden kullanılabilir;
  • Hata ayıklamayı ve testi kolaylaştırır;
  • Beklenmedik durum değişiklikleri nedeniyle daha az hata.

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 }

Kandırmaca sorusu.

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.

Konunun inceliklerinden dolayı gerçek hata örnekleri.


Hikaye

Büyük bir bankacılık projesinde, iç koleksiyonlar (işlem listesi) normal bir getter ile aktarılıyordu. Sonuç olarak, dışarıdan liste değiştirilebilir hale geldi ve invarianları ihlal etti (örneğin, geçersiz bir tarihe sahip bir işlem eklemek). Bu, verilerin kaybına yol açtı, ta ki Collections.unmodifiableList döndürmeye başlayana kadar.

Hikaye

Kök konfigürasyon sınıfında korumasız alan nesneleri (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.