2010-08-24 71 views
0

想知道是否有辦法改變其他對象引用的堆上的對象。Java:更改堆上的對象引用?

我特別想做的是管理我的瞬態配置。我正在做的是從JAXB或JPA加載「綁定」配置。我有一個管理器,維護一些線程來檢查這些配置存儲是否改變。如果他們這樣做,我希望再次從存儲中加載配置(創建配置的新實例),並用堆中的新配置實例替換「陳舊」配置實例,以便引用配置數據的任何對象都將獲得最新。

我知道我可能會遇到一個噩夢,不得不處理分層對象引用 - 但我只是想了解各種可能的方法,然後才決定僅創建文檔而不創建本地引用並始終調用從配置管理器,如果你期望最新=)

任何想法如何做到這一點?我對AOP不太熟悉......但從我所瞭解的情況來看...我認爲這可能爲實現這一目標提供了一條途徑。

任何其他的想法是值得歡迎的,當然=)

史蒂夫

回答

3

我不知道JAXB或者JPA任何東西,但在這裏就是我想要做的。給你的各種對象引用一個包裝的配置。然後,你可以無需改變這些引用更新配置(以同步的方式):

interface Config { String getSomeProperty(); } 

class ConcreteConfig implements Config{ 
    public String getSomeProperty() { 
     return "some value"; 
    } 
} 

class ConfigWrapper implements Config { 
    private Config backing; 
    private ReadWriteLock lock = new ReentrantReadWriteLock(); 

    public void setBacking(ConfigBacking backing) { 
     try { 
      lock.writeLock().lock(); 
      this.backing = backing; 
     } finally { 
      lock.writeLock().unlock(); 
     } 
    } 

    @Override 
    public String getSomeProperty() { 
     try { 
      lock.readLock().lock(); 
      return backing.getSomeProperty(); 
     } finally { 
      lock.readLock().unlock(); 
     } 
    } 
} 

那麼只分發ConfigWrapper的實例,只要你想可以自由地重新分配的支持對象。

+0

+1馬克擊敗了我的拳頭,但這也正是我如何去了解它。與本例中的簡單包裝對象相比,AOP會過度殺傷。 – rancidfishbreath 2010-08-24 14:38:53

+0

謝謝馬克。我想到了這一點,但問題涉及到JAXB/JPA綁定對象。這些將創建一個分層對象結構,支持繼承和聚合。雖然「清理」一個集合並重新添加這些項目並不難,但我想找到一個更優雅的解決方案。我也考慮過鎖定來處理同步,但我擔心那些可能相關的配置,但不在同一個對象內,更不用說同一個getter/setter了。在這種情況下,它幾乎需要一個交易。 – 2010-08-24 14:42:10

0

您可以查看Spring framework。如果我的記憶服務,它支持這樣的東西(也許this?)。

+0

@LBT首先 - 真棒名字=)第二,我沒有。我將使用此管理器作爲OSGi服務/捆綁軟件,並將它用於標準SE和EJB容器中。實際上,這最終會成爲我自己的「分佈式應用程序」容器的一部分 - 我會看看Spring,如果他們這樣做了,看看他們是如何做到的......但我當然不希望依靠Spring。謝謝你的提示!! – 2010-08-24 14:51:55