2015-06-15 112 views
9

我想遷移到Java 8,並有多種方法在我的DAO類裏面做以下作爲參數傳遞方法 - 這可能嗎?

@Override 
@SuppressWarnings("unchecked") 
public List<Group> getGroups() 
{ 
    Session session = sessionFactory.openSession(); 
    List<Group> allGroups = (List<Group>)session.createQuery("from Group").list(); 
    session.close(); 
    return allGroups; 
} 

這裏同樣鍋爐板sessionFactory.opensession.close重複的所有方法。

是否有可能在Java 8中有一個方法,它執行打開和關閉,並採用一個函數,這是我的代碼的其餘部分,並執行它之間?

如果是這樣的 - 這是什麼進程的名稱,或任何人都可以提供關於如何實現這一提議

+1

我想你在談論的方面(AOP)這裏。 :) –

+2

這不是您將作爲參數解析的方法,而是函數接口的實例。如果您創建了自己的功能界面並確保您的所有方法都符合其簽名,那麼可以。 – fge

回答

14

既然你想表達的代碼,在Session實例作品(所以你可以抽象創作一些幫助和清理它),可能會返回任意結果,Function<Session,T>將是正確的類型封裝這樣的代碼:

public <T> T doWithSession(Function<Session,T> f) { 
    Session session = sessionFactory.openSession(); 
    try { 
     return f.apply(session); 
    } 
    finally { 
     session.close(); 
    } 
} 

那麼你可以使用它像:

@Override 
@SuppressWarnings("unchecked") 
public List<Group> getGroups() 
{ 
    return doWithSession(session -> (List<Group>)session.createQuery("from Group").list()); 
} 

這不是一種特殊的Java 8技術。您可以在早期的Java版本中執行相同的操作,另請參閱What is the 「execute around」 idiom(感謝gustafc獲取鏈接)。更簡單的是,Java 8爲您提供了一個現有的Functioninterface,並且您可以使用lambda expression實現該接口,而不必使用匿名內部類或類似方法。

如果你想要的操作由一個單一的方法調用,並且不需要一個類型轉換,你可以實現它像doWithSession(Session::methodName)的方法參考,請參閱Method References in the tutorial

+2

相關:[什麼是「執行周圍」成語?](http://stackoverflow.com/questions/341971/what-is-the-execute-around-idiom) – gustafc

+0

謝謝你這麼快速和有用的答案 – Biscuit128