[英]Accessing & determining elements & its type of an object (not array/list) dynamically in java
我常見的主要領域模型是扁平化的,並且沒有一種對象的列表/數組。
在處理過程中,我需要放入某種提取邏輯-將所有相同類型的元素合並到主模型的某些臨時對象/模型的列表/數組中。 由於主模型正在增長,因此我不想使用getter方法調用和check實例手動檢查每個元素類型,因此,每當添加現有類型的新元素時,都需要在提取邏輯中為新添加的節點更新代碼。
示例-主模型-
Class MainModel{
Customer buyer;
Customer coBuyer;
Money price;
....
}
//Extraction logic in some code which have a populated MainModel object from some service call
// create a list of <Customer> Type
List<Customer> custList = new ArrayList<Customer>();
// populate it without calling getBuyer() and checking its type,
任何想法 ?
您可以創建一個接口並將其放在相同的列表中,而不會出現類型問題,然后在接口中放入方法getBuyer()
public Class MainModel implements HasBuyer{
Customer buyer;
Customer coBuyer;
Money price;
....
}
public class Customer implements HasBuyer{ ... }
public interface HasBuyer{
public Customer hasBuyer();
}
之后,您可以執行以下操作:
List<HasBuyer> custList = new ArrayList<HasBuyer>();
聽起來您需要一些反射性代碼。 有一些庫也可以幫助解決此類問題,但是可以執行以下操作的簡單方法如下。
public class ReflectiveGrabber {
public static <T> List<T> grabMembers(Class<T> clas, Object object) {
List<T> list = new ArrayList<>();
try {
for (Field field : object.getClass().getDeclaredFields()) {
if (clas.equals(field.getType())) {
field.setAccessible(true);
T value = (T) field.get(object);
if (value != null) {
list.add(value);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
public static void main(String... none) throws Exception {
System.out.println(grabMembers(String.class, new MainModel("foo", "bah", 10)));
System.out.println(grabMembers(Integer.class, new MainModel("foo", "bah", 10)));
}
}
class MainModel {
MainModel(String buyer, String coBuyer, Integer money) {
this.buyer = buyer;
this.coBuyer = coBuyer;
this.money = money;
}
String buyer;
String coBuyer;
Integer money;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.