用于迭代/取消引用混合对象类型列表的instanceof和if-else语句的替代方法

use*_*644 2 java casting

我有一个非原始对象的arraylist,其中每个对象是10个不同类之一的实例.

我想迭代列表,并为列表中的每个对象调用基于对象类的方法.

通过帖子后,我看到了使用cast的建议; if/else; 和有效的instanceof.然而,我有很多课程,我想知道是否有更优雅和简洁的解决方案.

任何输入赞赏.

Chr*_*jer 8

我确实避免了这样的链条instanceof.事实上,我会避免if/ elseswitch一般情况下的链(例外情况适用).

我们经常拥有的,如果我们有一连串的instanceof检查,那就是错误的责任和缺乏多态性.

想象一下以下代码:

class Type1 {}
class Type2 {}
class Type3 {}

class TypeProcessor {
    public void processObjets() {
        final List<Object> objects = getObjectList();
        for (final Object o : objects) {
            if (o instanceof Type1) {
                processType1((Type1) o);
            } else if (o instanceof Type2) {
                processType2((Type2) o);
            } else if (o instanceof Type2) {
                processType2((Type2) o);
            }
        }
    }
    public void processType1(final Type1 o) {
        /* Process for Type 1. */
    }
    public void processType2(final Type2 o) {
        /* Process for Type 2. */
    }
    public void processType3(final Type3 o) {
        /* Process for Type 3. */
    }
}
Run Code Online (Sandbox Code Playgroud)

这可以像这样重构:

interface Type {
    void process();
}

class Type1 implements Type {
    public void process() {
        /* Process for Type 1. */
    }
}

class Type2 implements Type {
    public void process() {
        /* Process for Type 2. */
    }
}

class Type3 implements Type {
    public void process() {
        /* Process for Type 3. */
    }
}

class TypeProcessor {
    public void processObjects() {
        final List<Type> objects = getObjectList();
        for (final Type o : objects) {
            o.process();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)