2015-03-20 27 views
5

Quando si definisce Predicate 's o Function' s, ho usato per creare loro come static finalmodo corretto definire predicati e funzioni

private static final Predicate<SomeDto> SOME_PREDICATE = 
       new Predicate<SomeDto>() { 
        @Override 
        public boolean apply(SomeDto input) { 
         return input.isValid(); 
        } 
       } 

Tuttavia ho notato che c'è un sacco di utilizzo anche con enum versione, per esempio

private enum SomePredicate implements Predicate<SomeDto> { 
     INSTANCE; 

     @Override 
     public boolean apply(SomeDto input) { 
      return input.isValid(); 
     } 
    } 

sono consapevole circa le enum vs static final argomenti, ma c'è un reale vantaggio di utilizzare enum di sopra statica finale con predicati o funzioni?

+1

Non sono sicuro dei vantaggi ma c'è uno svantaggio dal punto di vista della leggibilità, 'SOME_PREDICATE.apply (input)' è più pulito di 'SomePredicate.INSTANCE.apply (input)'. Di nuovo, sono solo io e non tutti troveranno un problema con la leggibilità dell'approccio enum. – CKing

risposta

5

Il principale vantaggio dell'approccio singleton enum in questo caso è che il Predicate/Function è automaticamente Serializable.

Guava stesso utilizza enum s per alcune delle sue implementazioni Predicate e Function per questo motivo, tra gli altri. Josh Bloch consiglia l'uso di enum s quando si desidera un singleton in Efficace Java 2nd Ed., Item 3. Per citare:

Questo approccio è funzionalmente equivalente al metodo campo pubblico, se non che è più conciso, fornisce il meccanismo di serializzazione gratuitamente, e fornisce una garanzia corazzata contro istanziazione multipla, anche a fronte di sofisticati serializzazione o attacchi di riflessione. Sebbene questo approccio debba ancora essere ampiamente adottato, un tipo di enum a elemento singolo è il modo migliore per implementare un singleton.

Guava espone questi singletons attraverso metodi statici nella sua API però, evitando la bruttezza SomePredicate.INSTANCE nel codice utente.

0

Nessuno dei due modi è più corretto dell'altro.

Se leggi la risposta precedente allo What's the advantage of a Java enum versus a class with public static final fields? vedrai che l'approccio enum ha il vantaggio che è facile scorrere tutti i possibili valori dell'enum. Tuttavia, nel tuo caso hai un solo valore possibile, quindi questo non è un vantaggio.

Un vantaggio dell'approccio basato su enumerazione è che la classe avrà un nome più grazioso e un nome che è possibile scegliere. Nel caso in cui desideri stampare il nome della classe, questo potrebbe essere un fattore decisivo.