Referencias A Métodos Y Constructores

Referencias a métodos y constructores

Una referencia a método es una forma de referirse a un método sin ejecutarlo directamente. Las referencias a métodos son una característica de Java 8 y pueden ser usadas como una forma abreviada de las expresiones lambda cuando ya existe un método que puede ser llamado directamente.

Tipo Descripción Ejemplo
Referencia a un método estático Referencia a un método estático de una clase. ClassName::staticMethod
Referencia a un método de instancia Referencia a un método de instancia de un objeto específico. object::instanceMethod
Referencia a un método de instancia de una clase Referencia a un método no estático de una clase sin necesidad de un objeto específico. ClassName::instanceMethod
Referencia a un constructor Referencia al constructor de una clase para crear instancias. ClassName::new

Las referencias a métodos se pueden utilizar en lugar de las expresiones lambda y tienen la siguiente sintaxis general:

ClassName::methodName

Las referencias a métodos pueden ser de cuatro tipos:

  1. Referencia a un método estático: Se refiere a un método estático de una clase.

    Ejemplo:

    class MathOperations {
        public static int add(int a, int b) {
            return a + b;
        }
    }
    
    // Usando referencia a método estático
    Function<Integer, Integer> add = MathOperations::add;
    System.out.println(add.apply(5, 3));  // Imprime: 8
  2. Referencia a un método de instancia de un objeto particular: Se refiere a un método no estático de un objeto específico.

    Ejemplo:

    class Printer {
        public void print(String message) {
            System.out.println(message);
        }
    }
    
    Printer printer = new Printer();
    Consumer<String> printerRef = printer::print;
    printerRef.accept("Hello, World!");  // Imprime: Hello, World!
  3. Referencia a un método de instancia de una clase: Se refiere a un método no estático de una clase, pero no a un objeto específico. Se usa un objeto de tipo ClassName.

    Ejemplo:

    class Printer {
        public void print(String message) {
            System.out.println(message);
        }
    }
    
    BiConsumer<Printer, String> printerRef = Printer::print;
    printerRef.accept(new Printer(), "Hello!");  // Imprime: Hello!
  4. Referencia al constructor de una clase: Se refiere a un constructor y permite crear nuevas instancias de una clase.

    Ejemplo:

    class Person {
        String name;
    
        public Person(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    }
    
    // Usando referencia al constructor
    Function<String, Person> personFactory = Person::new;
    Person person = personFactory.apply("John");
    System.out.println(person.getName());  // Imprime: John

Referencias a Constructores

Las referencias a constructores son una forma de utilizar un constructor directamente, sin necesidad de escribir explícitamente el código de creación de la instancia. Esto se usa cuando tienes una interfaz funcional que toma un argumento y devuelve una instancia de una clase.

La sintaxis para una referencia a constructor es:

ClassName::new

Ejemplo de referencia a constructor:

class Car {
    private String model;

    public Car(String model) {
        this.model = model;
    }

    public String getModel() {
        return model;
    }
}

// Usando referencia al constructor
Function<String, Car> carFactory = Car::new;
Car myCar = carFactory.apply("Tesla");
System.out.println(myCar.getModel());  // Imprime: Tesla

Diferencias entre Expresiones Lambda y Referencias a Métodos

  • Expresiones Lambda: Permiten escribir un código más genérico para la implementación de un método. La sintaxis es más flexible y puede incluir varios parámetros y bloques de código.

    Ejemplo:

    (a, b) -> a + b
  • Referencias a Métodos: Son una forma más compacta de referirse a un método ya existente. Es útil cuando el comportamiento de la expresión lambda se puede reemplazar por una llamada directa a un método.

    Ejemplo:

    MathOperations::add

Ventajas de las Referencias a Métodos

  1. Simplicidad: Si el método ya está implementado, las referencias a métodos pueden hacer que el código sea más limpio y fácil de leer.
  2. Reducción de código: Ayuda a reducir la verbosidad, ya que elimina la necesidad de escribir una expresión lambda cuando ya existe un método adecuado.
  3. Mayor legibilidad: Facilita la comprensión del código, al indicar claramente que se está llamando a un método existente.