No java 8 existem duas interfaces que ajudam na programação funcional com o java e elas fazem parte do pacote java.util.function. Uma lista completa das classes deste pacote pode ser vista
aqui.
Supplier
A interface supplier representa uma função que não contem nenhum argumento e produz um resultado de um tipo arbitrário. Uma implementação de Supplier pode referenciar um construtor.
Supplier referenciado por um construtor
Neste tipo de utilizacao, o supplier irá chamar direto um construtor da classe Usuario para instanciá-la.
Supplier<Endereco> supplierEndereco = Endereco::new;
Endereco endereco = supplierEndereco.get();
O :: new indica que o construtor da classe Endereco devera ser chamado. Neste caso estamos chamando o construtor sem argumentos da classe Endereco e o método get retornara o resultado da chamada a este construtor.
Supplier referenciado por um método estático
Neste tipo de utilização, o supplier utiliza uma instancia de uma fábrica de enderecos para instanciá-lo.
Supplier<Endereco> supplierEndereco = FabricaEndereco::fabricaEndereco;
Endereco endereco = enderecoSupplier.get();
class FabricaEndereco {
public static Endereco fabricaEndereco() {
return new Endereco();
}
}
Aqui basta indicarmos a classe da fábrica e o método que será utilizado para construir o endereço, separados pelo ::. FabricaEndereco é a classe da fábrica de endereços e fabricaEndereco é o método que será utilizado para construir a instância do endereço que será retornada pelo método get().
Supplier referenciando uma instancia
Esta é a forma de utilizar um método local para instanciar a classe endereço
Supplier<Endereco> enderecoSupplier = this::produtorDeEndereco;
Endereco endereco = enderecoSupplier.get();
private Endereco produtorDeEndereco(){
return new Endereco();
}
Assim como estamos acostumados a usar no java, o this neste caso indica que utilizaremos um método da instância corrente para construir uma nova instancia do Endereço, que neste caso é o método produtorDeEndereco. Para utilizar este tipo de criação do Supplier, a classe onde ele for utilizado, deverá ter um método produtorDeEndereco que retorne uma instância do endereço.
Nenhum comentário:
Postar um comentário