使用多个对象类型访问ArrayList的方法

时间:2017-01-21 01:04:54

标签: java arraylist

我有一个超类来自多个不同的子类。然后,每个子类都具有其他子类可能不遵循的具体类的特定方法。即:

  • 公共类NMEA ...所有子类持有的方法
  • 公共类GPGGASentence扩展了NMEA ..对此类型有一些具体方法
  • 公共类GPGPSSentence扩展了NMEA ..对此类型有一些具体方法

我通过检查字符串中的前几个字母然后在可能性之间切换来创建子类。

ArrayList<NMEA> sentences = new ArrayList<>();

switch (s.split(",")[0]){
     case "$GPGGA":
          sentences.add(new GPGGASentence(s));
          break;
     case "$GPGPS":
          sentences.add(new GPGPSSentence(s));
          break;
}

我现在想要遍历这个ArrayList。目前我正在做以下事情:

for(NMEA nmea : sentences){
     if(nmea instanceof GPGGASentence){
          system.out.println((GPGGASentence) nmea).someSpecificMethod());
     }
 }

我想知道他们是否有更好的方式来做这件事。

2 个答案:

答案 0 :(得分:0)

我对此问题的解决方案是建议将NMEA类更改为抽象类,并列出该类中的所有方法,然后覆盖它们。

答案 1 :(得分:-1)

除了编写abstract class / interface并声明所有方法之外,您可以采取以下措施来提高代码的可重复性:

  • 创建所有可能类类型的enum
  • 编写一个返回对象
  • 的枚举值的方法
  • 在不同情况下使用switch

这是一个例子。如下所示声明枚举:

private enum ClassType {
    NMEA,
    GPGGASentence,
    SomeOtherType,
    Unknown;
}

现在,返回type的方法:

private ClassType getClassType(NMEA object){
    ClassType type = null;
    try{
        type = ClassType.valueOf(object.getClass().getSimpleName());
    }catch(IllegalArgumentException e){
        type = ClassType.Unknown;
    }
    return type;
}

现在,在switch循环中使用for

for(NMEA nmea : sentences){
    switch(getClassType(nmea)){
    case ClassType.NMEA :
        //do something
        break;
    }
}

如果将来添加新的Impl类(或更改任何类的名称),您只需添加enum值和switch case。< / p>