eli*_*ocs 4 java static overriding design-patterns
我想实现一个应用程序,其中我有各种可以解释为XML字符串的对象.首先,我想到创建一个接口,使每个对象实现两个方法:
public abstract Element toXML();
public abstract void fromXML(Element element);
Run Code Online (Sandbox Code Playgroud)
第一个将对象信息转换为DOM元素,第二个将信息从DOM元素加载到对象.我最终在每个子类中定义了一个静态String,其中包含元素的TAG,因此我决定将接口转换为抽象类并为其提供更多功能:
public abstract class XmlElement implements Serializable {
protected static Document elementGenerator;
public String TAG = "undefined";
static {
try {
elementGenerator = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
} catch (ParserConfigurationException e) {
StateController.getInstance().addLog(
new Log(Log.Type.ERROR, "Couldn't load XML parser: " + e));
System.exit(1);
}
}
public abstract Element toXML();
public abstract void fromXML(Element element);
}
Run Code Online (Sandbox Code Playgroud)
元素生成器在toXML方法中用于生成元素.我无法克服的这个设计的错误是TAG属性不能像我希望的那样变成静态,主要是因为我不想实例化每个子类的对象只是为了知道TAG它使用.Java不允许覆盖静态属性或方法,这是解决这个问题的正确方法吗?
重构你的抽象类可能会更好,如下所示:
public abstract class XmlElement implements Serializable {
protected static Document elementGenerator = createElementGenerator();
protected static Document createElementGenerator() {
try {
elementGenerator = documentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
} catch (ParserConfigurationException e) {
StateController.getInstance().addLog(new Log(Log.Type.ERROR, "Couldn't load XML parser: " + e));
System.exit(1);
}
}
public abstract Element toXML();
public abstract void fromXML(Element element);
protected abstract String getTag();
}
Run Code Online (Sandbox Code Playgroud)
这会强制子类自己定义静态变量,并通过抽象getTag()方法将其返回到抽象类.我担心的一件事是,就我看来,elementGenerator不是线程安全的,因为它在XmlElement的所有子类的所有实例之间共享,这可能是个问题.
由于您只能拥有一个父类,因此执行繁重的实用程序类的接口可能是更好的解决方案,因此您正在执行的操作似乎存在其他设计问题.另外,我不确定您打算如何使用TAG变量.