Java: изменить ссылку на объект в куче? - PullRequest
0 голосов
/ 24 августа 2010

Интересно, есть ли способ изменить объект в куче, на который ссылаются другие объекты.

Что я специально пытаюсь сделать, это управлять моей переходной конфигурацией.То, что я делаю, загружает «связанную» конфигурацию из JAXB или JPA.У меня есть менеджер, который поддерживает некоторые потоки, чтобы проверить, если эти конфигурации хранятся изменения.Если они это сделают, я хочу снова загрузить конфигурацию из хранилища (создает новый экземпляр конфигурации) и ЗАМЕНИТЬ «устаревший» экземпляр конфигурации с новым в куче, поэтому любые объекты, ссылающиеся на данные конфигурации, получат последнюю версию..

Я понимаю, что, скорее всего, столкнусь с кошмаром, связанным с иерархическими ссылками на объекты, - но я просто хочу узнать о различных потенциальных подходах, прежде чем я решу просто документально не создавать локальную ссылкуи всегда звоните из менеджера конфигурации, если вы ожидаете самое последнее =)

Есть идеи, как это сделать?Я не слишком знаком с АОП ... но из того, что я знаю об этом ... Я думаю, что это может обеспечить путь для достижения этого.

Любые другие идеи приветствуются, конечно =)

Стив

Ответы [ 2 ]

3 голосов
/ 24 августа 2010

Я ничего не знаю о 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 голосов
/ 24 августа 2010

Вы можете проверить Spring Framework .Если моя память не изменяет, она поддерживает что-то подобное (возможно this ?)

...