在我的情况下,实现者应该能够“更新”一个对象。
//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");
但是,在Class I中,我还没有弄清楚如何一次替换所有属性。这种方法不起作用,但也许还有其他机会来解决它:
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 for Android。未简化的版本是:
public void update(HashMap<String,String> params) {
SameClassResponse response = restTemplate.getForObject(ENDPOINT+"/{id}.json",SameClassResponse.class, params);
this = response.getSameClass();
}
答案 0 :(得分:4)
你不能替换'this',你可以替换它的内容(字段),或者用另一个替换对它的引用......
替换'this'引用的一种方法是使用包装器:
SameClassWrapper myObject = new SameClassWrapper(SameClass.find(123,params));
myObject.update(params);
方法SameClassWrapper.update类似于
{
sameClass = code to build the new SameClass instance...
}
答案 1 :(得分:2)
您无法设置“此”参考。
由于你不能设置“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;
...
但是,通过这样的优化,您必须注意对字段进行浅层复制是恰当的。