2 iefjovi iefjovi 于 2016.02.01 16:02 提问

这段java代码如何优雅的实现?
for(AbstractResponse resp : responseList) {
        if (resp instanceof AResponse) {
                AResponse areponse = (AResponse)resp;
                //1
                //2
                //3
        }else if (resp instanceof BResponse) {
                BResponse breponse = (BResponse)resp;
                //1
                //2
                //3
        }else if (resp instanceof CResponse) {
                CResponse creponse = (CResponse)resp;
                //1
                //2
                //3
        }
}

不好意思,刚才写错了,修改了一下

9个回答

caozhy
caozhy   Ds   Rxr 2016.02.02 08:31

要优雅,有两个办法,一个是
AbstractResponse定义一个方法,它的派生类重写这个方法。
你循环直接调用,它会调用对应的派生类重写的不同方法

另一个,你不能或者不想改变AbstractResponse的代码。
那么可以使用泛型+策略模式,为每个类型编写一个策略实现类,在你的for里面,调用泛型方法,那么它会自动找策略类。

Yiran8935
Yiran8935   2016.02.01 16:18

这代码有问题啊,for(AResponse resp : responseList) 这个地方初期化的resp一定是AResponse类,不可能走到else if里面的后面的代码都是多余的

iefjovi
iefjovi   2016.02.01 16:23

for(AResponse resp : responseList)
多谢关注,这个写错了,修改了一下

enpterexpress
enpterexpress   2016.02.01 16:26

已经很优雅了

fengxinziyangyang
fengxinziyangyang   2016.02.01 17:03

既然AResponse,BResponse,CResponse都是继承AbstractResponse,那直接在AbstractResponse 定义一个方法,让AResponse,BResponse,CResponse都实现这个方法,那在上面的程序调用时就不需要判断是否是AResponse,BResponse,CResponse了。
E.g.

abstract class AbstractResponse

{

abstract void print();

}

class AResponse extends AbstractResponse

{

public void print()

{

System.out.println("AResponse");

}

}

class BResponse extends AbstractResponse

{

public void print()

{

System.out.println("BResponse");

}

}

class CResponse extends AbstractResponse

{

public void print()

{

System.out.println("CResponse");

}

}

for(AbstractResponse resp : responseList) {
resp.print();
}

fengxinziyangyang
fengxinziyangyang   2016.02.01 17:03

应该就是java多态的表现方式啦!

Yiran8935
Yiran8935   2016.02.01 17:03
        Class<?> cClass = resp.getClass();
        Object temp = cClass.newInstance();
        temp = resp;
        直接使用java的反射机制 你可以试试效果
Yiran8935
Yiran8935   2016.02.01 17:47
    List<Object> abc = new ArrayList<Object>();
    Map<String,Object> d = new HashMap<String,Object>();
    d.put("abc", "abc");
    abc.add(d);

    Map<String,Object> e = new Hashtable<String,Object>();
    e.put("abc", "abc");
    abc.add(e);

    for(Object tempMap :abc){

        Class<?> cClass = tempMap.getClass();
        Object temp = cClass.newInstance();
        temp = tempMap;
        System.out.println("This is " + cClass);
        System.out.println(temp);
    }
91program
91program   Ds   Rxr 2016.02.01 16:45

这种结构已经很好了,易读。
如果想减少代码量,也是在 if else 分支特别多的情况下才有用,就这几个分支就不用考虑了。

如果一定要考虑,可以试试 for 循环。但前提是各分支中的处理要基本上相同,可以抽象出来。否则,也无法实现!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!