switch代替if与 instanceof 结合的使用(switch的case语句判断Class类型)
switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。
思路:从switch支持的变量类型中,我们可以看到,switch还不支持java的抽象出来的Class类型。但是switch已经支持String类型了,对我们而言已经很灵活了。我们可以转变思路,提取出java中每种对象的和String有关的Class类型的区别。那就是抽象Class对象的name名字,不同的抽象Class的name名字是不一样的。
我应用中的例子:(应用的是利用poi生成excel,为每个cell赋值,通用的赋值方法,需要对新类型进行扩展)
if与 instanceof 的实现
public static void setIfCellValue(Cell cell, Object object){
if(object instanceof String){
cell.setCellValue((String) object);
}else if(object instanceof Integer){
cell.setCellValue((Integer) object);
}else if(object instanceof Long){
cell.setCellValue((Integer) object);
}else if(object instanceof Float){
cell.setCellValue((Float) object);
}else if (object instanceof Double) {
cell.setCellValue((Double) object);
}else if (object instanceof Boolean) {
cell.setCellValue((Boolean) object);
}else if(object instanceof Date){
cell.setCellValue((Date) object);
}else if(object instanceof Calendar){
cell.setCellValue((Calendar) object);
}else if(object instanceof XSSFRichTextString){
cell.setCellValue((XSSFRichTextString) object);
}
}
switch的实现
public static void setCellValue(Cell cell, Object object){
if(object == null){
return;
}
switch(object.getClass().getName()){
case "java.lang.Integer":
cell.setCellValue((Integer) object);
break;
case "java.lang.Long":
cell.setCellValue((Long) object);
break;
case "java.lang.Float":
cell.setCellValue((Float) object);
break;
case "java.lang.Double":
cell.setCellValue((Double) object);
break;
case "java.lang.Boolean":
cell.setCellValue((Boolean) object);
break;
case "java.util.Date":
cell.setCellValue((Date) object);
break;
case "java.util.GregorianCalendar":
cell.setCellValue((Calendar) object);
break;
case "org.apache.poi.xssf.usermodel.XSSFRichTextString":
cell.setCellValue((XSSFRichTextString) object);
break;
default:
cell.setCellValue((String) object);
}