Заменить собственный экземпляр внутри Java-объекта - PullRequest
5 голосов
/ 15 февраля 2011

В моем случае разработчик должен иметь возможность «обновить» объект.

//creating an instance (follows the active record pattern)
    SameClass myObject = SameClass.find(123,params); 

//myObject gets replaced by the output of the web api inside, but it feels like an update for the implementator
    myObject.update("ask the web api to paint it black"); 

Однако внутри класса я не понял, как заменить все атрибуты одновременно. Этот подход не работает, но, возможно, есть еще один шанс решить его:

    public void update(String newParams) {
//Can't replace "this" (that call returns an instance of "SameClass")
       this = ConnectionFramework.getForObject(SameClass.class,"some url",newParams); 
    }

"ConnectionFramework" на самом деле Spring RestTemplate для Android . Не упрощенная версия:

    public void update(HashMap<String,String> params) {
SameClassResponse response = restTemplate.getForObject(ENDPOINT+"/{id}.json",SameClassResponse.class, params);
    this = response.getSameClass();
}

Ответы [ 2 ]

5 голосов
/ 15 февраля 2011

Вы не можете заменить 'this', вы можете заменить содержимое (поля) этого или заменить ссылку на это другим ...

Один из способов заменить ссылку "this" - этоиметь обертку:

SameClassWrapper myObject = new SameClassWrapper(SameClass.find(123,params));
myObject.update(params);

метод SameClassWrapper.update будет выглядеть примерно так:

{
  sameClass = code to build the new SameClass instance...
}
2 голосов
/ 15 февраля 2011

Вы не можете установить ссылку "this".

Поскольку вы не можете установить ссылку "this", лучшее, что вы можете сделать, - это извлечь объект, например, так

public void update(String newParams) {
    //Can't replace "this" (that call returns an instance of "SameClass")
    SameClass fetchedObject = ConnectionFramework.getForObject(SameClass.class,"some url",newParams); 

и затем установите все "состояние" класса, который он должен был заменить

    this.setValue1(fetchedObject.getValue1());
    this.setvalue2(fetchedObject.getValue2());
    ...

Оптимизация заключается в непосредственной установке полей.

    this.field1 = fetchedObject.field1;
    this.field2 = fetchedObject.field2;
    ...

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

...