@Noortvel

Можно ли заменить объект на новый, вместе с заменой ссылок?

Можно ли заменить объект на новый, вместе с заменой ссылок?Т.е что бы ссылки ссылались на новый объект.
  • Вопрос задан
  • 149 просмотров
Решения вопроса 1
Vamp
@Vamp
Такое возможно если использовать прокси объект. То есть все ссылки в программе будут смотреть на прокси-объект, который инкапсулирует в себе ссылку непосредственно на тот объект, который вам хочется заменить.

// MyClass - тип объекта, который хотим подменить
// унаследоваться необходимо, чтобы не сломать совместимость типов
class MyProxy extends MyClass {

  // наш спрятанный объект, который будем заменять в будущем
  private MyClass hidden;

  @Override
  public int hashCode() {
    return hidden.hashCode();
  }

  @Override
  public boolean equals(Object o) {
    return hidden.equals(o);
  }
  // и так далее заоверрайдить все-все публичные
  // методы наследуемого класса

  // правда, с публичными свойствами будет проблема - для
  // их замены необходима более сложная логика:
  @Override
  public int calculate() {
    hidden.var = var; // на случай если поле было изменено извне
    int result = hidden.calculate();
    var = hidden.var; // а это если поле было изменено изнутри
    return result;
  }

  public int var;

  // а вот и главный заменщик
  void setObject(MyClass new_o) {
    hidden = new_o;
    var = new_o.var;
  }
}

Потом останется только найти все места, где создаётся объект и заменить его на прокси объект. Далее настоящий объект подменяется вызовом setObject().

Если у проксируемого объекта есть final поля или методы, то придётся отказаться от наследования MyClass и заменить во всём проекте тип ссылок MyClass на MyProxy.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@FoxInSox
Конечно:
Object objectA = new Object();
Object objectB = new Object();
objectA = objectB;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы