2012-06-17 79 views
2

我需要用這種方法有三個不同的類別:訂單,客戶,供應商泛型方法的Java

public void saveObjectKey(String filename, Long start) { 
    Query<Orders> query = datastore.createQuery(Orders.class) 
      .field("O_ORDERKEY").greaterThan(start); 
    for (Orders orders : query.fetch()) { 
     Util.writeFile(orders.getPrimaryKey().toString(), filename); 
    } 
} 

我曾在一個醜陋的解決方案認爲,一個如果否則,如果解決方案:

如果(的instanceof訂單).... else if(instanceof Customers)..... else if(instanceof Suppliers)....

現在我需要一個通用的解決方案,我該怎麼做呢?

+0

出了什麼問題'別的if'? – gobernador

+0

這種方法應該做什麼?它與這些類如何交互? – cheeken

+8

你是對的,一堆instanceof的建議是一個糟糕的設計。爲什麼不讓所有三個類都實現相同的接口,然後在此方法中調用接口方法? –

回答

4

可以在你的應用中,這是有意義的:

public <T> void saveObjectKey(String filename, Long start, Class<T> clazz, String keyName) { 
    Query<T> query = datastore.createQuery(clazz).field(keyName).greaterThan(start); 
    for (T o : query.fetch()) { 
     Util.writeFile(o.getPrimaryKey().toString(), filename); 
    } 
} 

然後你可以使用它像:

saveObjectKey(filename, start, Customers.class, customersKeyName); 
saveObjectKey(filename, start, Suppliers.class, suppliersKeyName); 
saveObjectKey(filename, start, Orders.class, ordersKeyName); 
+0

感謝nobeh,它正在尋找。 還有一個疑問, o.getPrimaryKey()沒有重新調整。給我一些小費? – ulima69

+0

我相信'query.fetch()'給你一個'Collection ',其中'SOMETHING'具有'getPrimaryKey()'方法。你應該把'T o'在循環內部轉換爲'SOMETHING'來接收這個方法。 – nobeh