2015-06-15 20 views
9

sto cercando di migrare verso Java 8 e hanno un certo numero di metodi nelle mie classi DAO che fanno il seguenteMetodo di passaggio come parametro - È possibile?

@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; 
} 

Qui la stessa piastra della caldaia sessionFactory.open e session.close si ripete per tutti i metodi.

E 'possibile in Java 8 per avere un metodo che fa la aprono e si chiudono e prende una funzione che è il resto del mio codice ed eseguirlo inbetween?

Se è così - che cosa è il nome di questo processo, o chiunque in grado di fornire un aiuto su come questo potrebbe essere raggiunto

+1

Credo che tu stia parlando di aspetti (AOP) Qui. :) –

+2

Non si tratta di metodi che verranno analizzati come argomenti ma come esempi di interfacce funzionali. A patto che tu crei la tua interfaccia funzionale e assicuri che tutti i tuoi metodi corrispondano alla sua firma allora sì, puoi farlo. – fge

risposta

14

Dal momento che si vuole esprimere il codice che funziona su un'istanza Session (così si può astrarre la creazione e la rimozione di esso) e potrebbe restituire un risultato arbitrario, un Function<Session,T> sarebbe il tipo giusto per incapsulare tale codice:

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

quindi è possibile utilizzarlo come:

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

Questa non è una speciale tecnica di Java 8. Puoi fare lo stesso nella precedente versione di Java, vedi anche What is the “execute around” idiom (Grazie a gustafc per il collegamento). Quello che rende più semplice è che Java 8 ti fornisce uno Function esistente interface e che puoi implementare quell'interfaccia usando un lambda expression invece di dover ricorrere a classi interne anonime o simili.

Se il funzionamento desiderato è costituito da un singolo metodo invocazione e non richiede un tipo di getto, è possibile implementare come riferimento metodo come doWithSession(Session::methodName), vedere Method References in the tutorial

+2

Corretto: [Qual è l'espressione "esegui intorno"?] (Http://stackoverflow.com/questions/341971/what-is-the-execute-around-idiom) – gustafc

+0

grazie per una risposta così rapida e utile – Biscuit128

Problemi correlati