我知道如何通过多态替换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;
}