Üzerinde çalıştığım bir uygulama, bir veritabanından belleğe bir grup kalıcı nesneyi almak için yalnızca hazırda bekletme. Uygulama bu bellek içi anlık görüntüsünü veritabanından şimdi ve daha sonra yenilemek ve bu veritabanı ile tek iletişim olmalıdır.Hazırda bekletilen bir kümeyi değiştirilemeyen bir set olarak nasıl yüklerim?
Bellek içi nesneler daha sonra bir grup hesaplama için kullanılır. Hesaplamalar bu nesneleri değiştirmemelidir. Yanlışlıkla bir yerde bazı sınıflar hariç, ve ben de bir günü hatayı avlamak için harcamak zorunda kaldım. Şimdi tüm nesne ağacını değiştirmenin en iyi yolunun ne olduğunu merak ediyorum.
sınıf hiyerarşisi şöyle düşünelim: hevesle bütün varlıkları ve koleksiyonlarını işaretleme tüm varlıkları ve koleksiyonlarını- : Ben tarafından veritabanına erişmesini müşterilerine engellediyseniz
public class Building { // persistent entity private String name; // hibernate-mapped property private Set<Person> inhabitants; // hibernate-mapped collection // getters } public class Person { // persistent entity private String name; // hibernate-mapped property // getters }
Hazırda bekletme oturumlarında
mutable=false
ile birlikte Hazırda Bekletme oturumu veya durum değişkeninin hiçbir örneğini sağlamayan - g dao yöntemleri.
building.getInhabitants().clear();
gidiyor. Sonra geri, bir
Collections.unmodifiableSet()
çağrısında
getInhabitants
ilk wrap
inhabitants
olun:
Getter sarılması: Ben bu seçeneklerden düşünebiliriz.
- Artıları: Az iş, az ekstra kod
- Eksileri:
Building
,MutableBuilding
-Person
MutablePerson
yeniden adlandırın ve değişmez sınıflarıBuilding
vePerson
sağlar: hacky
Sarıcı sınıfları hisseder. Uygulamam net bir anlık görüntü noktasına sahip olduğundan, kayıtları (şimdi yaptığım gibi) değişebilir nesneler olarak getirebilir, çok değişmez kopyalar oluşturabilir ve nesne ağacını istemcilere sunabilirim.
- Artıları: Düz java, hayır Hazırda bekleyen sihir. Favori anahtar kelimemi kullanıyorum:
final
- Eksiler: Yazmak ve korumak için daha fazla kod. Ayrıca, Hazırda kalan değişkenleri bellekte saklayacak mı?
- Artıları: Düz java, hayır Hazırda bekleyen sihir. Favori anahtar kelimemi kullanıyorum:
hazırda haritalama sihirli: Bir sihirli kelime
Collections.unmodifiableSet()
veya eşdeğeri benim varlık nesneler üzerinde bu ayarlar koleksiyonları sarmak için Hibernate talimat vermek olduğunu kullanın.(Not: Ben bir xml eşleme dosyası kullanın)- Artıları: Şık, hiçbir ekstra kod
- Eksileri: Böyle kelime olmayabilir
Hazırda uzantısı: kullan biri Hazırda uzantısı olduğunu kendi nesne başlatıcımı yazmak için işaretleyin ve orada geri dönmeden önce kümeyi
Collections.unmodifiableSet()
içine sarın.- Artıları: benim getters
- Eksileri hack daha fazla zarif: Böyle genişletme noktası Şu anda bilmiyorum çünkü çoğunlukla, 2. doğru eğilim
olmayabilir 3 ve 4 mümkün olup olmadığını bilmek.
En iyi yol nedir?
+1 neden hatırlattığımız için alıcılar ve ayarlayıcılar :-) – KarlP
Bu en iyi çözüm gibi görünmüyor. Değişken sınıfların bazen iyi olduğu gerçeğini ifade etmek zorundayım. :) – oksayt