gpt4 book ai didi

java - 如何巧妙地克服静态属性不能被覆盖的事实?

转载 作者:搜寻专家 更新时间:2023-11-01 01:39:08 25 4
gpt4 key购买 nike

我想实现一个应用程序,其中我有各种可以解释为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com