Resultados 1 al 3 de 3

Tema: instanciar objeto dentro de un método de la misma clase

  1. #1

    Predeterminado instanciar objeto dentro de un método de la misma clase

    Buenas, estoy aprendiendo a programar con Java, y me preguntaba si dentro de un método de una clase puedo instanciar un objeto del mismo tipo de la clase, porque el IDE no se lamenta, así que supongo que no hay problema, sin embargo, quisiera saber si hay algún potencial riesgo en hacer esto (undefined behavior o cosas por el estilo)

  2. #2

    Predeterminado Re: instanciar objeto dentro de un método de la misma clase

    No hay problema en hacerlo, pero, ¿por qué querrías hacerlo?

  3. #3

    Predeterminado Re: instanciar objeto dentro de un método de la misma clase

    Por poder, puedes declarar esa misma clase como atributo de sí misma, tipo:

    Código:
    public class MiClase {
    
        MiClase mc = new MiClase();
    
        public MiClase() {
            //Constructor
        }
         
        //Metodos...
    
    }
    Esto es útil en casos muy específicos de recursividad, como por ejemplo al querer crear "árboles de nodos"

    Esta es una clase Nodo que escribí hace algún tiempo, que como veis, dos de sus atributos son objetos de ella misma:




    Esta clase es atributo de la clase Arbol, quien aparentemente tiene solo un Nodo, pero en realidad va a tener montones, ya que ese Nodo, tiene a su vez dos Nodos(izquierdo y derecho), los cuáles a su vez cada uno tiene también otros dos nodos.... y así recursivamente el Arbol puede llegar tener miles de nodos, aunque solo hemos declarado uno como atributo:



    Con este test se hace una prueba simple.
    Al Arbol le voy pasando valores numéricos desordenados, y estos valores se van distribuyendo ordenadamente por el arbol creándose nuevos Nodos y ramificaciones.




    Lo de instanciarse una clase a sí misma dentro de uno de sus métodos, no es tan raro y en ocasiones si tiene sentido y utilidad.

    Al crear interfaces gráficas con la librería Swing, hay muchas forma de hacerlo, pero es habitual que la clase principal herede de JFrame (la que crea el marco principal de la ventana) y para ponerse en marcha todo, se instancia a sí misma dentro de su método main().

    Tampoco hace falta irse a un caso tan concreto. En cualquier momento puede venirnos bien que una clase se instancie dentro de sí misma uno o varias veces.
    Aquí abajo pongo un ejemplo que me acabo de inventar, una clase Libreria que guarda títulos de libros.

    Lo correcto sería escribir esta clase en un archivo .java separado, y en otra clase con método main() usarla para crear objetos.
    Pero no es necesario y quizás en algún momento preferiremos hacerlo todo en un solo archivo .java, y se puede hacer sin problemas.

    En este ejemplo hago las instancias en el método main(), pero podrían hacerse en cualquier otro método si nuestras necesidades lo requieren

    Código:
    public class Libreria {
    	
    	//Atributos
    	private String tipologia;
    	private ArrayList<String> titulos = new ArrayList<String>();
    	
    	//Constructor
    	public Libreria(String tipologia) {
    		this.tipologia = tipologia;
    	}
    	
    	//Metodos
    	public void insertarTitulo(String titulo) {
    		titulos.add(titulo);
    	}
    	
    	public void listarTitulos() {
    		System.out.println("\n\t\tLibros de " + tipologia);
    		if (titulos.isEmpty())
    			System.out.println("No hay libros registrados.");
    		else
    			for (String t: titulos)
    				System.out.println("- " + t);
    	}
    	
    	//Aqui irian más metodos...
    
    	public static void main(String[] args) {
    		
    		Libreria[] libros = new Libreria[4];
    		libros[0] = new Libreria("Ciencia");
    		libros[1] = new Libreria("Historia");
    		libros[2] = new Libreria("Matemáticas");
    		libros[3] = new Libreria("Informática");
    		
    		libros[0].insertarTitulo("Enigmas del Cosmos: ¿A que huelen los agujeros negros?");
    		libros[1].insertarTitulo("Los Reyes Godos y sus ridículos nombres: Chindasvinto.., ja ja.., el \"chindas\" le decían...");
    		libros[2].insertarTitulo("Dos y dos son cuatro, cuatro y dos son seis. Seis y dos son ocho, y ocho dieciséis");
    		libros[3].insertarTitulo("El arte de trollear en foros: Todo niño-rata puede llegar a ser un fanboy cultivado");
    				
    		for (Libreria lib: libros)
    			lib.listarTitulos();
    
    	}
    
    }
    Dentro de esa clase, se instancia 4 objetos de la misma clase. Y cada uno tiene sus datos propios sin problema. Este es el resultado por consola al ejecutarlo:
    Código:
    		Libros de Ciencia
    - Enigmas del Cosmos: ¿A que huelen los agujeros negros?
    
    		Libros de Historia
    - Los Reyes Godos y sus ridículos nombres: Chindasvinto.., ja ja.., el "chindas" le decían...
    
    		Libros de Matemáticas
    - Dos y dos son cuatro, cuatro y dos son seis. Seis y dos son ocho, y ocho dieciséis
    
    		Libros de Informática
    - El arte de trollear en foros: Todo niño-rata puede llegar a ser un fanboy cultivado

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •