Задать вопрос
Ответы пользователя по тегу Программирование
  • Можно ли заменить объект на новый, вместе с заменой ссылок?

    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.
    Ответ написан
    Комментировать