2011-01-13 21 views
6

Ü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ı
  • getirilirken

    • : 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.

  • Şimdi önlemek istiyorum hata, birisi yanlışlıkla building.getInhabitants().clear(); gidiyor. Sonra geri, bir Collections.unmodifiableSet() çağrısında getInhabitants ilk wrap inhabitants olun:

    1. Getter sarılması: Ben bu seçeneklerden düşünebiliriz.

      • Artıları: Az iş, az ekstra kod
      • Eksileri: Building, MutableBuilding-PersonMutablePerson yeniden adlandırın ve değişmez sınıfları Building ve Person sağlar: hacky
    2. 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ı?
    3. 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
    4. 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?

    cevap

    6

    Seçenek 1, kesin. Bu "hacky" değil, ve bu yüzden ilk etapta metotlara metotların erişimini soyutlamanızın sebebi de budur. :-) Sadece "method" yerine "field access" ile "field access" kullanmanız gerektiğini unutmayın. Hazırda bekletilmeyen bir koleksiyon sağlama riski.

    Ne yazık ki, Hazırda Bekletme, değiştirilemeyen koleksiyonlar yerleştirmenin bir yolunu sağlamaz, ancak nesne yüklendikten sonra tüm koleksiyonları değiştirmek için bir @PostLoad olay dinleyicisi yapabileceğinizi düşünüyorum.

    +0

    +1 neden hatırlattığımız için alıcılar ve ayarlayıcılar :-) – KarlP

    +0

    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

    İlgili konular