我想实现一个应用程序,其中我有各种可以解释为 XML 字符串的对象。首先我想到制作一个接口(interface),让每个对象实现两个方法:
public abstract Element toXML();
public abstract void fromXML(Element element);
第一个将对象信息转换为 DOM 元素,第二个将信息从 DOM 元素加载到对象。 我最终在每个包含元素 TAG 的子类中定义了一个静态字符串,因此我决定将接口(interface)变成一个抽象类并赋予它更多功能:
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);
}
在 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();
}
这会强制子类自己定义一个静态变量,并通过抽象的 getTag() 方法将其返回给抽象类。我担心的一件事是,据我所知,elementGenerator 不是线程安全的,因为它在 XmlElement 的所有子类的所有实例之间共享,这可能是一个问题。
您正在做的事情似乎还有其他设计问题,因为您只能有一个父类,具有执行繁重工作的实用程序类的接口(interface)可能是更好的解决方案。另外,我不确定您打算如何使用 TAG 变量。
关于java - 如何巧妙地克服静态属性不能被覆盖的事实?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1867798/