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

标签 java design-patterns static overriding

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

相关文章:

javascript - 谁能为大型 Web 应用程序推荐一个好的客户端架构和结构?

java - Java中for循环不中断才执行代码的方法有哪些?

java - MOXy 仅编码集合中的基类成员

java - 我应该在哪里存储第三方库以包含在 IntelliJ IDEA 项目中?

Flink 中的 java.lang.NoSuchMethodError

c# - 禁用事件处理的设计模式

WCF 对象设计 - OOP 与 SOA

c++ - 尽管可见,但未设置静态变量

grails - 在 Grails 1.4 中,静态不返回任何 css 或 js 资源

c++ - 从 GCC 4.6 更改为 4.7 时 undefined reference