很多情况下都有类似的逻辑,唯一的不同在于一些细节,这时我们想到了abstract 方法,通过子类重载abstract 方法,但这样会增加很多小的class,通过直接new abstract class将abstract 方法作为参数可以避免创建很多小class。
public abstract class Hidden{
public void encodeEnd(FacesContext facesContext) throws IOException {
ResponseWriter writer = facesContext.getResponseWriter();
writer.startElement("input", this);
writer.writeAttribute("type", "hidden", null);
writer.writeAttribute("name", nameValue().get("name"), null);
writer.writeAttribute("value", nameValue().get("value"), null);
writer.endElement("input");
}
protected abstract Map nameValue();
}
相当于实例化一个AclHidden,但并没有定义AclHidden class
new Hidden() {
public Map nameValue() {
Map<String, String> deployMap = new HashMap<String, String>();
deployMap.put("name", AclUtil.OLDACLGROUP);
deployMap.put("value", AclUtil.getAclGroup());
return deployMap;
}
}
相当于实例化一个DeplyHidden,但并没有定义DeplyHidden class
new Hidden() {
public Map nameValue() {
Map<String, String> deployMap = new HashMap<String, String>();
deployMap.put("name", ProcessForm.BO_DEPLOYMENT_ID);
deployMap.put("value", bussinessObjectContex
.getDeployment().getId());
return deployMap;
}
}
注:当这些直接new的 abstract class在序列化的类中使用时会导致类不能被反序列化,报java.lang.InstantiationException异常,不明白是什么原因。