switch 语句在日常开发中,常常用来根据不同的类型,执行不同的操作。如果类型很多,整个swtich代码会变得很臃肿,代码可扩展性、可阅读性都很差。针对这个问题,我们可以考虑使用多态来解决,将每个类型的行为封装到一个子类中。
下面以加减等计算类型的操作为例说明这个问题
public enum CalculateType {
ADD("add","加法"),SUB("sub","减法"),MUL("mul","乘法");
private String type;
private String desc;
CalculateType(String type,String desc) {
this.type = type;
this.desc = desc;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
public class Calculate {
public int calculate(int a, int b,CalculateType type) {
switch (type) {
case ADD:
return a + b;
case MUL:
return a * b;
case SUB:
return a - b;
default:
throw new UnsupportedOperationException("不支持的计算类型");
}
}
}
calculate()方法利用switch语句这样的写法,后面一旦不断新增计算类型,代码就会变得越来越庞大。我们可以把加、减、乘三种算法独立成一个类,将具体的计算方法封装到类中。
public interface NumCalculate {
int calculate(int a, int b);
}
public class AddCalculate implements NumCalculate{
@Override
public int calculate(int a, int b) {
return a + b;
}
}
public class MulCalculate implements NumCalculate {
@Override
public int calculate(int a, int b) {
return a * b;
}
}
public class SubCalculate implements NumCalculate {
@Override
public int calculate(int a, int b) {
return a - b;
}
}
这样当我们需要某项计算时,直接调用对应类的方法就可以了。
下面的问题就是如何获取对象,我们可以考虑使用反射根据类名来获取对象。
public class Calculate {
public static NumCalculate newInstance(String className) {
try {
Class action = Class.forName(className);
NumCalculate calculate = (NumCalculate) action.newInstance();
return calculate;
} catch (Exception e) {
return null;
}
}
public static void main(String[] args) throws Exception {
NumCalculate calculate = newInstance(AddCalculate.class.getName());
int result = calculate.calculate(1, 2);
System.out.printf(String.valueOf(result));
}
}
这样当我们需要进行某种类型的计算时,只需知道对应的类名就可以获取对象,进而执行计算,完全不再需要swtich语句。
其实在我们的实际开发中,常常会遇到switch的应用,如果类型很多,代码很容易变得臃肿不堪,可考虑这种方式来重构!
————————————————
原文链接:https://blog.csdn.net/song19890528/article/details/79722769