[英]How to make my loops more generic?
下面是我的代碼。 如您所見,這里有2個幾乎相同的代碼塊。 唯一不同的是對象的類型。 我正在尋找一種使其更通用的方法。 要獲得一個代碼塊,只需在我的方法中將類型(車主,汽車)設置為參數。 有什么提示嗎? 我嘗試使用反射,但由於無法遍歷集合而無法使其動態化
if(queryResult.get(0) instanceof Owner) {
classFields = Owner.class.getDeclaredFields();
data = new Object[queryResult.size()][classFields.length];
for(Owner owner : (List<Owner>)(Object)queryResult) {
int rCounter = 0;
for(Field field : owner.getClass().getDeclaredFields()) {
field.setAccessible(true);
try {
data[lCounter][rCounter] = field.get(owner);
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (IllegalAccessException e1) {
e1.printStackTrace();
}
rCounter++;
}
lCounter++;
}
} else if(queryResult.get(0) instanceof Car) {
classFields = Car.class.getDeclaredFields();
data = new Object[queryResult.size()][classFields.length];
for(Car car : (List<Car>)(Object)queryResult) {
int rCounter = 0;
for(Field field : car.getClass().getDeclaredFields()) {
field.setAccessible(true);
try {
data[lCounter][rCounter] = field.get(car);
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (IllegalAccessException e1) {
e1.printStackTrace();
}
rCounter++;
}
lCounter++;
}
}
您應該可以將整個代碼塊折疊為:
Class clazz = queryResult.get(0).getClass();
classFields = clazz.getDeclaredFields();
data = new Object[queryResult.size()][classFields.length];
for(Object result : queryResult) {
int rCounter = 0;
for(Field field : clazzFields) {
field.setAccessible(true);
try {
data[lCounter][rCounter] = field.get(result);
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (IllegalAccessException e1) {
e1.printStackTrace();
}
rCounter++;
}
lCounter++;
}
警告:我沒有編譯並運行此程序進行檢查
您不需要此代碼重復。 只是car
和owner
作為Object
實例。 您不使用“ Car
和“ Owner
”類型
以任何不同/有意義的方式。 因此您的代碼將繼續正常運行
因為兩種情況都以相同的方式處理。 似乎唯一
您需要更改的是:
Car.class.getDeclaredFields();
和
Owner.class.getDeclaredFields();
對此:
queryResult.get(0).getClass().getDeclaredFields();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.