替换java对象中的自己的实例

时间:2011-02-15 15:48:56

标签: java instance instance-variables

在我的情况下,实现者应该能够“更新”一个对象。

//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();
}

2 个答案:

答案 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;
    ...

但是,通过这样的优化,您必须注意对字段进行浅层复制是恰当的。