我有一个超类来自多个不同的子类。然后,每个子类都具有其他子类可能不遵循的具体类的特定方法。即:
我通过检查字符串中的前几个字母然后在可能性之间切换来创建子类。
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());
}
}
我想知道他们是否有更好的方式来做这件事。
答案 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>