En Java 8 se han introducido importantes cambios como lambdas, interfaces funcionales y métodos por referencia.
Veamos ahora cómo hacer uso de constructores por referencia.
Si no has leido el articulo sobre métodos por referencia te recomiendo que le des un vistazo porque tiene mucho en común con el artículo a continuación. La diferencia es que aquí llamas al “new” en vez de llamar a un método.
Partamos de un ejemplo para que se vea claramente.
Tenemos este User con tres constructores, uno por default, otro que recibe el “name” y el último que recibe “name” y “password”. Deseamos crear varios user partiendo de una lista de nombres.
public class User {
private String name;
private String password;
public User() {
}
public User(String name) {
this.name = name;
}
public User(String name, String pass) {
this.name = name;
this.password = pass;
}
}
La lista de nombres predefinidos que queremos utilizar para crear los User.
List<String> userNames = new ArrayList<>();
userNames.add("jose");
userNames.add("luis");
userNames.add("lucas");
Como llamar al constructor por referencia
Para este ejemplo nos valdremos de stream().map() que nos permite convertir un objeto en algo diferente. En nuestro “mapeamos” un String en un User.
Luego usaremos stream.collect para recoger todos los elementos en una lista de Users.
Por último los iteramos para mostrar el resultado.
Lo importante aquí es observar que estamos llamando al constructor por referencia cuando escribimos User::new.
¿Pero cuál constructor llamará .map(..) si tenemos varios constructores en la clase User.
Aquí el compilador elige por inferencia el constructor que tenga un solo parámetro String porque es el único que aplica.
Stream<User> userStream = userNames.stream().map(User::new);
List<User> userList = userStream.collect(Collectors.toList());
userList.forEach(System.out::println);
//.. output..
User{name='jose'}
User{name='luis'}
User{name='lucas'}
…
En conclusión vemos que así como usamos métodos por referencia tambien podemos hacerlo para constructores del modo User::new.
Además el compilador elige el constructor correspondiente por inferencia.
Código de ejemplo:
Referencias: Lambdas Interfaces funcionales Métodos por referencia