我知道如何通过多态替换switch语句,就像在here实例中解释的那样。

但就我而言,我有两个枚举:

public enum EleType {
    INTEGER,
    CHARACTER
}




public enum SorterType {
    BUBBLE,
    INSERTION
}


和开关/如果我想重构具有以下结构:

if ( eleType == EleType.INTEGER ) {
    switch ( sorterType ) {
        case BUBBLE:
             composition = new SorterComposition<Integer>(new BubbleSort<Integer>(), randomList);
             break;
        case INSERTION:
             composition = new SorterComposition<Integer>(new InsertionSort<Integer>(), randomList);
             break;
    }
} else if ( eleType == EleType.CHARACTER ) {
    switch ( sorterType ) {
        case BUBBLE:
             composition = new SorterComposition<Character>(new BubbleSort<Character>(), randomList);
             break;
        case INSERTION:
             composition = new SorterComposition<Character>(new InsertionSort<Character>(), randomList);
             break;
    }
}


由于两个枚举同时出现并且都影响SorterComposition部分,因此我不确定如何重构此结构。另外,我不确定如何在不使用条件语句的情况下分别从EleType.INTEGER或EleType.CHARACTER获取“整数” /“字符”泛型类型。

最佳答案

您是说要实现这样的代码吗?

public static <T> SorterComposition<T> createComposition(SorterType type, <Type of randomList>) {
    switch (type) {
        case BUBBLE:
            return new SorterComposition<T>(new BubbleSort<T>(), randomList);
        case INSERTION:
            return new SorterComposition<T>(new InsertionSort<T>(), randomList);
        default:
            throw <Exception>
    }
}




或者,您可以稍微更改EleType类。

public enum EleType {
    INTEGER(Integer.class), CHARACTER(Character.class);
    private EleType(Class cl) { this.classType = cl; }
    public Class getClassType() { return classType; }
    private final Class classType;
}


并使用此代码代替上面的createComposition

public static <T> SorterComposition<T> createComposition(Class<T> eleType, SorterType type, <Type of randomList>) {
    switch (type) {
        case BUBBLE:
            return new SorterComposition<T>(new BubbleSort<T>(), randomList);
        case INSERTION:
            return new SorterComposition<T>(new InsertionSort<T>(), randomList);
        default:
            throw <Exception>
    }
}


使用时,请使用composition = createComposition(eleType.getClassType(), sorterType, randomList);



为了避免出现switch中的SorterType的问题,也许可以在Supplier中添加SorterType字段。

public enum SorterType {
    BUBBLE(() -> new BubbleSort()),
    INSERTION(() -> new InsertionSort());

    private SorterType(Supplier<Sort> supplier) {
        this.supplier = supplier;
    }

    public Sort getSort() {
        return supplier.get();
    }

    private final Supplier<Sort> supplier;
}

08-04 04:16