有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中多对象类型ArrayList的访问方法

我有一个超类,多个不同的子类从中扩展。然后,每个子类都有其他子类可能无法遵循的具体类的特定方法。例如:

  • 公共课NMEA。。。所有子类都持有的方法
  • 公共类GPGGASENTE扩展了NMEA。。对这种类型有一些特定的方法
  • 公共类GPGPS内容扩展了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) 个答案

  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

  2. # 2 楼答案

    我解决这个问题的方法是按照建议将NMEA类更改为抽象类,列出该类中的所有方法,然后重写它们