2010-08-24 41 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