TransWikia.com

¿Cómo funciona un new Objeto() dentro del parámetro, en la Inyeccion de Dependencias?

Stack Overflow en español Asked by Gabriel Godoy Osses on August 27, 2021

No logro entender cuando dentro de la invocación de un método a través de un objeto se envía un new Objeto(), por ejemplo Controlador controlador = new Controlador(new Perro());.

No logro entender qué es lo que se está enviando en este caso al parámetro del constructor. ¿Cómo se está enviando un new? Normalmente uno envía datos, un objeto ya instanciado, una variable, un String pero un new Objeto(), y como se comporta dentro del constructor cuando ya llega ese new Objeto(), esa asignación this._animal = animal, ¿o esto se puede hacer solamente cuando hay una interfaz como parámetro?

Ejemplo inventado por mí:

public interface Animal {
    
    void comer();
}
public class Perro implements Animal {

    @Override
    public void comer() {
        System.out.println("Estoy comiendo como un Canino");

    }

}
public class Gato implements Animal {

    @Override
    public void comer() {
        System.out.println("Estoy comiendo como un Felino");

    }

}
public class Controlador {
    
    private Animal _animal;
    
    public Controlador(Animal animal) {  // Como llegaría al Parametro ??
        
        this._animal = animal;  // Sería lo mismo que decir  _animal = new Perro();  ??
    }

    public void comerImpl() {
        
        _animal.comer();
    }
}
public class Principal {

    public static void main(String[] args) {
        
        Controlador controlador = new Controlador(new Perro());
        
        controlador.comerImpl();

    }

}

2 Answers

Según la documentación de Java:

The new operator returns a reference to the object it created. This reference is usually assigned to a variable of the appropriate type, like:

Point originOne = new Point(23, 94);

Traducido al español:

El operador new devuelve una referencia al objeto que creó. Esta referencia generalmente se asigna a una variable del tipo apropiado.

Esto significa que la variable originOne guarda una referencia devuelta por new Point(23, 94), en la cual servirá para referirnos al objeto o llegar hacia el.

Sabiendo esto, podemos responder esta duda:

No logro entender qué es lo que se está enviando en este caso al parámetro del constructor. ¿Cómo se está enviando un new?

El parámetro (que también es una variable) del constructor lo que recibe es la referencia. Una referencia no es más que un identificador para poder identificar al objeto.

Por lo tanto cuando haces esta asignación:

this._animal = animal;

Lo que sucede es que estás asignando la referencia que tiene guardada la variable animal en _animal. Por lo tanto, la variable _animal y animal hacen referencia al mismo objeto.

Sería lo mismo que decir _animal = new Perro();

No es lo mismo. Ya que ahí estarías asignando una nueva referencia a _animal y eso hace que _animal y animal no se refieran al mismo objeto.

¿o esto se puede hacer solamente cuando hay una interfaz como parámetro?

Nada que ver. El tipo del parámetro podría ser una clase también.

Observación:

Los nombres de las variables no deben empezar con guion bajo..

Answered by MrDave1999 on August 27, 2021

Java, en su funcionalidad, tiene dos localidades de memoria: el stack y el heap.

En el stack se encuentran la declaracion de las variables que guardan el valor (en caso de los primitivos como int, long, boolean) o la dirección de los objetos en el heap.

Cuando estas pasando un new Objeto() como parametro, estas creando una locacion de memoria en el heap para almacenar este objeto, pero este objeto no tiene una referencia directa en el stack, si no que dentro del objeto donde lo pasaste como parametro esta la referencia.

En tu ejemplo, la variable controlador esta en el stack y hace referencia al heap con new Controlador(), dentro del heap donde se guardo new Controlador() hay una referencia a new Animal().

Básicamente, lo unico que te estas ahorrando es una localidad de memoria en el stack al no declarar una variable para almacenar la referencia de new Animal().

Eue esto te puede ayudar a entender el heap y el stack.

http://www.javahispano.org/certificacion/2011/9/27/stack-y-heap.html

Answered by faxterol on August 27, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP