我有一个设计问题。 我有一个读取 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/