2012-06-05 24 views
0

如何減少這種usiong反射減少的if else,以確定具體的數據類型

private static Object determineDataType(final String value, String dataType) 
{ 
    System.out.println("Name--->>" + dataType); 
    if(dataType.equals(Boolean.class.getName())) 
    { 
     return new Boolean(value); 
    } 
    else if(dataType.equals(String.class.getName())) 
    { 
     return new String(value); 
    } 
    else if(dataType.equals(Character.class.getName())) 
    { 
     return new String(value); 
    } 
    else if(dataType.equals(Byte.class.getName())) 
    { 
     return new Byte(value); 
    } 
    else if(dataType.equals(Short.class.getName())) 
    { 
     return new Short(value); 
    } 
    else if(dataType.equals(Integer.class.getName())) 
    { 
     return new Integer(value); 
    } 
    else if(dataType.equals(Long.class.getName())) 
    { 
     return new Long(value); 
    } 
    else if(dataType.equals(Float.class.getName())) 
    { 
     return new Float(value); 
    } 
    else if(dataType.equals(Double.class.getName())) 
    { 
     return new Double(value); 
    } 
    //defualt return the String value, Lets' AOPI do the Validation 
    return new String(value); 
} 
+0

誰在調用此方法?爲什麼調用者不知道類型? – Kai

回答

1

您可以使用Class.forName和方法getConstructorhere就是一個例子):

Object instance = Class.forName(dataType) 
     .getConstructor(new Class[] {String.class}) 
     .newInstance(new Object[]{value}); 

通過它不會工作方式字符和布爾值,因爲你對它們進行了特殊處理。

1

我也想知道爲什麼在世界上,你會做到這一點。但是,設定的是,除了一分鐘,這裏的一些未經測試的代碼:

List<Class<?>> types = Arrays.asList(Long.class, Integer.class, ...); 
for (Class<?> type : types) { 
    if (type.getName().equals(dataType)) 
     return type.getConstructor(String.class).newInstance(value); 
    // TODO: catch exceptions and probably re-throw wrapped 
} 
return new String(value); 
0

我不認爲你可以在這裏減少反射代碼的數量。首先,反射API非常詳細。其次,在一些街區你做的事情略有不同。特別是,布爾塊不僅僅是調用構造函數。