Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Duda sobre creación de objetos

Hola, qué tal? Ante todo, estoy recién empezando con esto de la programación, como se habrán dado cuenta por el título de la pregunta, así que les pido que por favor tengan paciencia.

Hasta ahora conocía una sola forma de declarar e inicializar una instancia de un tipo de referencia a objetos, por ejemplo:

Dummy dy = new Dummy ();

Bueno, ya un par de veces me he topado con otra forma de inicializarlas que mi profesor no me ha logrado explicar satisfactoriamente. Por ejemplo:

Properties props = System.getProperties();
Enumeration propNames = props.propertyNames();

En la primera linea se crea un objeto de tipo Properties llamado props, pero al inicializarlo en lugar de hacer "new Properties ();" se llama al método getProperties() de la clase System. Algo similar pasa con el objeto de tipo Enumeration de la línea de abajo: se lo inicializa mediante el método propertyNames() de la clase Properties.

Por qué es que se puede hacer esto? Siguiendo el ejemplo de la primera línea, en algún lugar de ese método se devuelve un "new Properties()" para inicializar el objeto o no? Y qué implicancias tiene inicializarlo de esa manera en lugar de poner un "new Properties()" del otro lado del signo "="?

Espero que se entienda mi pregunta. Desde ya muchas gracias.

julio 17, 2015 | Registered Commenterhelmut83

Hola ,

Es muy sencillo, la forma que tienes tú de hacerlo, es instanciar un Objeto de una clase (MiClase objeto = new MiClase();) con esto se crea un objeto de la clase MiClase, el cuál podrá tener acceso a todas las variables / funciones instanciadas en dicha clase.

La otra forma de hacerlo que comentas : "Properties props = System.getProperties();", lo que hace es crear un Objeto de la Clase Properties. En vez de instanciarlo con el new, lo que hace es llamar al método getProperties() de la Clase System, que devolverá la instancia de un objeto que será asignado a props.

Si vas a la clase System ( dejando el ratón encima de System y puslando ctrl, te aparece un desplegable en que que puedes ver Open Declaration, en el IDE Eclipse), podrás ver el contenido de sus funciones y de la función getProperties();

Son dos formas diferentes de instanciarlos, en la primera creas un objeto vacío y en la segunda dependiendo de como se implemente el metodo get*(); se creará el objeto vacio o no.

Espero haberte ayudado. Si no, te aconsejo empezar a programar mirándote algunos tutoriales o libros de JAVA donde te explican todos los conceptos de la POO(Programación Orientada a Objetos) detalladamente.

Un saludo.

julio 17, 2015 | Unregistered Commenterruben

Muchas gracias, Rubén, me has ayudado y entendí lo que me dijiste. Igualmente me quedan un par de dudas:

1) Suponiendo que el método getProperties() no esté vacío sino que tenga alguna funcionalidad, qué implica eso para mi objeto llamado props? O sea, en qué forma quedan vinculados ese objeto y el método con el que se inicializó?

2) Al crear un objeto de tal tipo (en el ejemplo, "Properties") cómo se con qué método de qué clase puedo inicializarlo?

Desde ya gracias.

julio 18, 2015 | Unregistered Commenterhelmut83

Holaaa, intentare resolver tus cuestiones a ver si no me voy por las ramas, jeje.

1) Es que el método System.getProperties() no esta vacío, dentro tiene su funcionalidad.
Que implicación tiene esto para tu objeto props, pues lo que hace es inicializarte tu objeto con una serie de propiedades, en este caso las del sistema. Como por ejemplo... nombre del SO, versión de So, versión de java, zona horaria,..... Es decir con todas las propiedades del sistema donde se esta ejecutando la aplicación.

Ahora te pondré un ejemplo de un método similar a ese metodo System.getPropierties();

/*clase que tendra un metodo que inicializa un objeto properties con una serie de opciones y lo devuelve*/
public class EjemploProperties {
public static Properties getMisProperties(){
Properties p=new Properties();
p.setProperty("saludo", "Hola! ¿¿ke ase??");
p.setProperty("hora", "¿Que hora es?");
p.setProperty("despedida", "Hasta luego lucas que la palmo.");
return p;
}
}

/*Clase de testeo de la clase anterior*/
public class TestMisProperties {
public static void main(String[] arg){
Properties props=EjemploProperties.getMisProperties();
System.out.println(props.get("saludo"));
System.out.println(props.get("hora"));
System.out.println(props.get("despedida"));
}
}

Si te fijas en el ejemplo en el metodo getMisProperties, lo que hacemos es crear un objeto Properties iniciarlo con una serie de propiedades dentro y devolverlo(return). Entonces en nuestra clase con el método main, lo que hacemos es declarar un objeto Propierties, y usar el método getMisProperties, para inicializar ese objeto. Por lo tanto el objeto props queda inicializado según el método que estés usando.

En tu caso, usas el método System.getPropierties, que lo que hace es inicializar un objeto properties con las propiedades del sistema.

Esta forma de inicializar objetos en java se usa muchísimo, y incluso tu acabaras usándolo por ti mismo, igual que creamos un metodo que nos devuelve un objeto Properties, puedes crear un método que te devuelva un objeto de tipo String, o un tipo Date, o un tipo Persona, .....

2) Sobre lo de como localizar los métodos... Bueno ahi infinidad de métodos que hacen estas cosas. Como te han dicho cuando sale el completition en eclipse, o netbeans, hay sale una explicación de los métodos que se pueden invocar a traves de un objeto o clase.
imagen

Si te fijas a la derecha donde pone... getProperties() Properties

Eso significa que ese método devuelve un objeto de tipo Propierties con lo cual tu puedes crear un objeto Properties y asignarle el valor que devuelve ese método. De esa manera el objeto se inicializaría o no(null), dependiendo de la implementación del método.

El como aprender estos métodos bueno, con el tiempo iras conociendo la api de java, y iras conociendo nuevos objetos con nuevos métodos y te iras dando cuenta que esto de usar un método para iniciar un objeto es muy común.

Por otro lado si quieres aprender un poco de teoría sobre la creación de objetos a través de métodos y demás, te recomiendo eches un ojo al patrón de diseño llamado Factory. Este patrón, precisamente lo que hace es eso, es un patrón para crear objetos a través de un método.

Otro sitio donde puedes ver algo parecido es con el objeto Calendar. Para crear un objeto de tipo calendar, debemos proceder de la siguiente manera.


Calendar c=Calendar.getInstance();

Como ves en este caso el método se llama getInstance() y esta en la clase Calendar, y eso nos crearía un objeto de tipo Calendar.

Y nada espero que toda esta morralla te sea útil y practicar, practicar practicar... hasta no poder mas.. XDD

julio 18, 2015 | Registered Commenterloderain