Quale sarebbe la migliore pratica per dichiarare lambda nel codice Java8? Com'è stato progettato per essere usato?
Ad esempio, supponiamo che abbiamo un metodo che accetta Function
. Voglio fornire l'implementazione della funzione che può essere riusabile. Quindi posso fare questo:
[A] Implementa un'interfaccia Function
:
public class Foo implements Function<A,B> {
public B apply(A a) {...}
}
...
useFunction(new Foo());
[B] dichiara Function
come lambda in un campo static
:
public interface Foo {
Function<A,B> bar = it -> { ....}
}
...
useFunction(Foo.bar);
[C] Usa riferimento al metodo:
public class Foo {
public static B bar(A a) {...}
}
...
useFunction(Foo::bar);
Fino alla programmazione funzionale in java8, ho provato a non inquinare il codice con static
s. Tuttavia, ora sono in qualche modo "obbligato" a usare la statica (o singleton globali) per archiviare i lambda riutilizzabili.
Modifica
Ho un codice che restituisce quanto segue in diversi punti:
return CompletableFuture.supplyAsync(() -> {
...
}
.exceptionally(FooExceptionWrapper::wrap);
Come vedi, voglio condividere le istanze del wrapper (che è un Function
), e ancora rimanere fluente con il codice. Ci sono molti modi in cui possiamo condividere questo.
Se creo nuove istanze ogni volta (come in A ), creeremo nuove istanze per ogni chiamata, che va bene; eppure GC verrà chiamato più frequentemente. Posso invece creare un singleton e dato che questo è un Function
, la condivisione attraverso i thread non sarà un problema. Quindi potrei memorizzarlo in alcune variabili. Ora, vorrei mettere il codice di gestione fuori da questa classe (semplice per ridurre le dimensioni e la responsabilità della classe). Quindi uso l'approccio A - ma voglio ancora vedere se c'è un modo più "corretto" per questo. Non ci sono molti progetti java8 e molte persone usano i campi statici (come in B ); Sto solo mettendo in discussione tutto ciò.