我使用decorator模式来描述操作,我希望在rpc调用中使用这些操作。
public abstract class Action implement Serializable
{
boolean isDecorated = false;
public Action() {} // default constructor for Serialization
}
public abstract class ActionDecorator extends Action
{
private Action _decoratedAction;
public ActionDecorator() // default constructor for Serialization
{}
public ActionDecorator(Action action)
{
_decoratedAction = action;
_decoratedAction.isDecorated = true;
}
}
在事务之后,我确实收到一个decoratoraction,其中包含一个操作,但是decoratedaction的isdecorated成员被设置为false。
由于调用默认(零参数)构造函数来重新构造我的对象,所以我的decorator和我的decorated操作都将获得isdecorated(false)的默认值。
我无法复制ActionDecorator的零arg构造函数中的“\u decoratedAction.isDecorated=true;”,因为此时未初始化(null)。
当然,我可以在每个事务之后手动设置布尔值,但是最好避免每次我的同事想要使用action对象时额外的对象初始化(可能会忘记)。
最佳答案
我已经试过你的代码了,它的工作和预期的一样。
我使用了你发布的action和actiondecorator,但是我将decoratedaction公开了,这样我就可以检查它的值了。
然后我对这两个类进行了子类划分:
class MyAction extends Action {
public MyAction() {}
}
class MyActionDecorator extends ActionDecorator {
public MyActionDecorator() {}
public MyActionDecorator(Action a) {
super(a);
}
}
并声明了将返回操作的服务方法。这是它的实现:
public Action getAction() {
return new MyActionDecorator(new MyAction());
}
从客户端调用服务后,我打印操作的状态:
System.out.println(action.isDecorated); // false
System.out.println(((ActionDecorator) action)._decoratedAction.isDecorated); // true
一切如期而至:actiondecorator的is decorated为false,由它修饰的action的isdecorated为true。希望这有助于识别你的问题。如果没有,请提供更多细节。