java - java接口(interface)中静态的替代品是什么

标签 java

我有一个设计问题。 我有一个读取 XML 的接口(interface)。每个实现者类读取不同的 XML,我想要一种方法来识别应该为我获得的 xml 类型动态创建哪个实现者。 问题是java接口(interface)不能有静态成员。最好的方法是什么?

示例:

public interface MyXML{
    public void readXML(String xml);
    public final static String getType();
}

用法:

func(String xml, String type)
    {
       MyXML obj;

       switch(type)
       {
          case MyImpl.getType():
             obj = new MyImpl();
             break;
         case MyImpl2.getType():
             obj = new MyImpl2();
             break;
      }
      obj.readXML(xml);
   }

编辑: 我会尽力更好地解释我想要的: 我需要知道哪个实现可以读取哪个 xml,并且我寻找一种方法来强制实现 MyXML 的任何人告诉它可以读取哪个 xml,这样我就不需要在另一个列表或工厂中维护外部翻译。

最佳答案

Java 只允许在接口(interface)中使用静态常量。在 Java 8 中,您还可以拥有默认实现,但这是另一回事。

解决这个问题的一种方法是使 getType 成为普通实例方法,与 readXML 相同,并提前实例化实现,如下所示

// somewhere in the constructor or main
List<MyXML> readers = Arrays.asList(new MyImpl1(), new MyImpl2());

public MyXML findReaderForType(String type) {
  for (MyXML reader : readers) {
    if (reader.getType().equals(type)) {
      return reader;
    }
  }
}

但是,您需要小心地设计实现,以便可以重用它们。

另一种选择是创建某种静态工厂,其中包含与 findReaderForType 方法等效的内容。那么类型和实现之间的映射就包含在这个工厂类中。

关于java - java接口(interface)中静态的替代品是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28671763/

相关文章:

java - .jar 执行时出现 "Could not find main class"

java - 如何决定方法应该进入数据定义类 (DDC) 还是实现类

java - Dropbox api 获取以前的文件版本预览 url

java - 需要一些解释才能真正理解 for 循环/二进制在这个特定示例中是如何工作的(JAVA)

java - 将二维数组中的每个元素相除

java - android 如何添加具有不同 Activity 的相同 fragment

java - 如何使用 Cucumber 和 Java 在 BDD 场景之间共享任何变量/对象?

Java极小极大鲍鱼实现

java - 如何在离开方法之前等待回调(Java)

java - 浏览器仅针对受限页面发送授权 header - 它是如何知道的?