繁体   English   中英

Java接口中静态的替代方法是什么

[英]What is the alternative to static in java interface

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

例:

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,所以我不需要在其他列表或工厂之外维护翻译。

我建议您围绕实例设计系统,而不要自己输入类型。

该应用程序将实例化所有XML读取器类型,并将向每个实例查询其负责的类型。 您可以使用它来将XML阅读器组织到一个映射中,并且无需切换或if语句即可检索它们。

如果当前设计中有一些与实例相关的重量级资源,请更改该设计,以使所有资源获取都在对象的生命周期中进行,而不是在构造时。

如果一次(例如,在并发设置中)需要同一阅读器的多个实例,请使用java.util.regex.Pattern及其对应的Matcher举例说明的想法。 模式是单线程,一次性匹配器的线程安全工厂。

看一看工厂设计模式。 客户端应通过传递Type来调用工厂,然后工厂返回正确类的实例:

public class MyFactory {
    public MyXML createMyXML(Type type) {
        return ...
    }
}

这样,客户无需承担责任就知道需要提供哪个具体类。

在接口中存储实现类型没有意义。 该接口不应该了解实现。 相反,您可以将XML类型存储在Enum中。

enum Type{
TYPE1,
TYPE2;
}

然后,您可以创建一个Map<Type, MyXML>变量,并在其中添加具有相应Type的实现。

然后,Factory可以像这样:

public MyXml getImplementation(String type){
   Type type = Type.valueOf(type);
   MyXml impl= implementations.get(type);
   if(impl == null){
       throw new UnsupportedOperationException();//or whatever ex you see fit
   }
   return impl;
}

Java仅在接口中允许使用静态常量。 在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方法等效的方法。 然后,该工厂类中包含类型和实现之间的映射。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM