1

我需要从文件中加载对象。我不知道如何设计支持这个操作的类的接口。

public interface TestComponent {
    TestComponent loadFromXML(Element _xmlElement); 
}

我不能将方法 loadFromXML 设为静态,也不能声明(不定义!)构造函数 - 但是创建一个仅用于调用 loadFromXML 的类非常难看。在一个实用程序类中分离这些机制也很丑陋,该实用程序类在 switch-case 中调用指定的构造函数。

在这种情况下,您如何设计界面?我应该使用抽象类吗?

4

2 回答 2

2

我同意您问题中的版本看起来有点不自然。

以下是一些替代方案:

  1. 您可以向接口添加一个void load(...),该TestComponent接口将使用 XML 中的状态加载“this”对象。(这类似于 上的loadandloadXML方法java.util.Properties。)
  2. 您可以在每个解析 XML 的实现类中定义一个构造函数TestComponent以获取对象的初始状态。
  3. 您可以创建一个静态辅助方法。
  4. 您可以创建一个TestComponentFactory接口,该接口具有TestComponent load(...)返回加载对象的方法。

不同的方法各有利弊。例如,工厂对象方法 (4.) 将解析/加载逻辑与TestComponent类分离,但需要额外的类和接口。另一方面,如果您有多个主界面的实现,其他三种方法往往会很麻烦。主要问题是您不能使用 Java 中的构造函数进行多态性。

最后,如果我正在设计这个,我会让该load(...)方法以流或阅读器作为参数,并自己进行 XML 解析(通过调用相关的库代码)。这样,您可以在一个地方(每个TestComponent实现类)处理所有这些。

于 2012-06-01T15:30:05.877 回答
1

Schifty 一种方法是更改​​ to 的返回loadFromXMLvoid。此方法不会返回 的新实例,而是TestComponent使用 XML 文档中的数据更新当前对象的内部内容。

提示:接口方法的访问修饰符是可选的。这是因为接口方法必须始终定义为public.

public interface TestComponent {
    Element saveAsXML() throws ParserConfigurationException;
    TestComponent loadFromXML(Element _xmlElement);  
}
于 2012-06-01T15:04:14.747 回答