Bienvenidos sean a este post, hoy veremos dos nuevos casos en java, primero hablaremos el tipo ENUM y luego veremos colecciones en Java, para poder trabajar con ellos utilizaremos la app creada en el post anterior, si no lo hiciste te recomiendo visitarla y crearla para poder seguir con los utilizados en este post, sin mas preambulos pongamos manos a la obra y hablemos sobre el enumerado en Java.

Anuncios

Primero abramos nuestro proyecto

android38

Una vez abierto crearemos una nueva clase de Java, sobre el contenedor de todas nuestras clases hacemos click con el boton derecho y elegimos New->Java class

android39

Una vez hecho esto nos aparecera el siguiente cuadro

android40

Vamos a usar como nombre TipoLugar, la unica diferencia con respecto a como veniamos trabajando es en Kind, donde buscaremos y seleccionaremos Enum, despues pulsamos Ok y nos va a quedar de la siguiente forma

android41
Anuncios

Ahora procederemos a ingresarle el codigo fuente para esta clase:

package org.example.mislugares;

public enum TipoLugar {
    OTROS ("Otros", 5),
    RESTAURANTE ("Restaurante", 2),
    BAR ("Bar", 6),
    COPAS ("Copas", 0),
    ESPECTACULO ("Espectaculo", 0),
    HOTEL ("Hotel", 0),
    COMPRAS ("Compras", 0),
    EDUCACION ("Educacion", 0),
    DEPORTE ("Deporte", 0),
    NATURALEZA ("Naturaleza", 0),
    GASOLINERA ("Gasolinera", 0);

    private final String texto;
    private final int recurso;

    TipoLugar (String texto, int recurso){
        this.texto = texto;
        this.recurso = recurso;
    }

    public String getTexto() { return texto; }
    public int getRecurso() { return recurso; }
}


Analicemos el codigo fuente, en lugar de ser el tipo class (clase) ahora va a ser enum (enumerado) aca vamos a definir una serie de constantes (OTROS, RESTAURANTE, BAR, etc) y cada constante le vamos a definir dos atributos, uno de tipo String donde almacenaremos una descripcion y otro de tipo entero, el cual utilizaremos mas adelante, observen como cada constante es separado por una coma (,), esto es para crear la lista salvo el ultimo donde pondremos el punto y coma (;). Luego crearemos dos atributos de tipo constante (final), uno tipo cadena (String) y otro de tipo entero (int), despues crearemos el constructor donde sera utilizado para asignar los valores en los atributos en la clase por medio del apuntador this, como hemos visto anteriormente y por ultimo crearemos dos metodos, uno para devolver el valor almacenado en el atributo texto y otro para devolver el valor almacenado en el atributo recurso. Con esto finalizado vamos ahora a la clase Lugar, en esta vamos a hacer dos modificaciones. Primero, agregaremos la siguiente linea entre la declaracion de los atributos:

private TipoLugar tipo;

Luego, modificaremos al constructor para aceptar ahora a tipo:

public Lugar(String nombre, String direccion, double longitud, 
		double latitud, TipoLugar tipo, int telefono, 
		String url, String comentario, int valoracion) {

En la linea del constructor resalte la nueva porcion agregada en el constructor, una vez modificada debemos agregar la ultima linea dentro del constructor:

this.tipo = tipo;

Despues de realizado esto, vamos a hacer click con el boton derecho sobre el codigo de la clase y elegiremos Generate

android42

Luego elegiremos la opcion Getter and Setter

android43

Una vez seleccionado nos aparecera el siguiente cuadro

android44
Anuncios

Seleccionan a la unica opcion disponible, luego pulsan Ok y volveremos al codigo fuente de la clase, volvemos a apretar nuevamente Generate

android42

Pero ahora en este caso seleccionamos toString()

android45

Despues de seleccionado nos aparecera el siguiente cuadro

android46

Deben seleccionar todos los atributos mostrados y pulsan Ok, despues de apretado Ok nos aparecera el siguiente cuadro

android47

Esto es debido a la previa existencia de este metodo, en este caso seleccionamos Si (Yes) y esto nos reemplazara el metodo con el nuevo atributo (tipo). Con esto finalizamos la modificacion en la clase Lugar, el codigo fuente nos deberia quedar de la siguiente forma:

package org.example.mislugares;

public class Lugar {
    private String nombre;
    private String direccion;
    private GeoPunto posicion;
    private String foto;
    private int telefono;
    private String url;
    private String comentario;
    private long fecha;
    private float valoracion;
    private TipoLugar tipo;

    @Override
    public String toString() {
        return "Lugar{" +
                "nombre='" + nombre + '\'' +
                ", direccion='" + direccion + '\'' +
                ", posicion=" + posicion +
                ", foto='" + foto + '\'' +
                ", telefono=" + telefono +
                ", url='" + url + '\'' +
                ", comentario='" + comentario + '\'' +
                ", fecha=" + fecha +
                ", valoracion=" + valoracion +
                ", tipo=" + tipo +
                "}";
    }

    public TipoLugar getTipo() {
        return tipo;
    }

    public void setTipo(TipoLugar tipo) {
        this.tipo = tipo;
    }

    public Lugar(String nombre, String direccion, double longitud, 
                 double latitud, TipoLugar tipo, int telefono, 
                 String url, String comentario, int valoracion) {
        this.tipo = tipo;
        fecha = System.currentTimeMillis();
        posicion = new GeoPunto(longitud, latitud);
        this.nombre = nombre;
        this.direccion = direccion;
        this.telefono = telefono;
        this.url = url;
        this.comentario = comentario;
        this.valoracion = valoracion;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getDireccion() {
        return direccion;
    }

    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    public GeoPunto getPosicion() {
        return posicion;
    }

    public void setPosicion(GeoPunto posicion) {
        this.posicion = posicion;
    }

    public String getFoto() {
        return foto;
    }

    public void setFoto(String foto) {
        this.foto = foto;
    }

    public int getTelefono() {
        return telefono;
    }

    public void setTelefono(int telefono) {
        this.telefono = telefono;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getComentario() {
        return comentario;
    }

    public void setComentario(String comentario) {
        this.comentario = comentario;
    }

    public long getFecha() {
        return fecha;
    }

    public void setFecha(long fecha) {
        this.fecha = fecha;
    }

    public float getValoracion() {
        return valoracion;
    }

    public void setValoracion(float valoracion) {
        this.valoracion = valoracion;
    }

}
Anuncios

Con esto finalizado, pasemos a la siguiente modificacion en este caso va a ser la clase Principal, en esta clase vamos a agregar la siguiente linea inmediatamente despues de la primera linea:

import static com.tinchicus.mislugares.TipoLugar.EDUCACION;

Esta linea nos permitira acceder a la clase enumeradora sin necesidad de especificar todo su nombre, como hablamos en este post. Por ultimo, modificaremos al objeto utilizado para configurar la clase Lugar, veamos la linea:

Lugar lugar = new Lugar("La cueva de Tinchicus","Mercedes Sosa S/N",
			-64.5750594,-32.0728125,EDUCACION,1155556666,
			"https://tinchicus.com","Un gran lugar para aprender",
			4);

Ahora agregamos el nuevo valor de tipo en la declaracion de la creacion del objeto lugar, una vez hecho estas dos modificaciones el codigo fuente debera quedar algo asi:

package org.example.mislugares;

import static com.tinchicus.mislugares.TipoLugar.EDUCACION;

public class Principal {
    public static void main(String[] main){
       Lugar lugar = new Lugar("La cueva de Tinchicus","Mercedes Sosa S/N",
                               -64.5750594,-32.0728125, EDUCACION,
                               1155556666,"https://tinchicus.com",
                               "Un gran lugar para aprender",4);
       System.out.println("Lugar " + lugar.toString());
    }
}

Si todo salio bien, ahora al ejecutar el programa deberiamos obtener una salida de este estilo

android48

Y recuerden, siempre el codigo de error debe ser cero, es decir Process finished with exit code 0. Si lograron esto, felicitaciones!!! Ahora pasemos al segundo ejemplo, en este caso vamos a ver Colecciones en Java. Hablemos un poco sobre las colecciones antes del ejemplo, estas nos permiten guardar series de objetos de cualquier clase. Estas no forman parte del lenguaje pero son implementadas por el paquete java.util. Tenemos tres tipos:

  • list, estructura secuencial donde cada elemento tiene una posicion similar a un array
  • set, los elementos no tienen orden y no permiten duplicados
  • map, los elementos tienen una clave asociada utilizada para recobrarlo

Una vez visto de una manera muy superficial veamos un ejemplo del tipo list, empecemos con el mismo, con nuestro proyecto MisLugaresJava abierto vamos al contenedor donde estan ubicadas todas nuestras clases java, hacemos click con el boton derecho sobre el mismo, elegimos New->Java Class, una vez seleccionado aparecera el siguiente cuadro

android49

En nombre pondremos Lugar, una vez hecho esto pulsamos Ok y se creara nuestra nueva clase, ahora le agregaremos el siguiente codigo:

Anuncios
package org.example.mislugares;

import java.util.ArrayList;
import java.util.List;

public class Lugares {
    protected static List< Lugar > vectorLugares = ejemploLugares();

    public Lugares(){
        vectorLugares = ejemploLugares();
    }

    static Lugar elemento(int id){
        return vectorLugares.get(id);
    }

    static void anyade(Lugar lugar){
        vectorLugares.add(lugar);
    }

    static int nuevo(){
        Lugar lugar = new Lugar();
        vectorLugares.add(lugar);
        return vectorLugares.size() - 1;
    }

    static void borrar(int id){
        vectorLugares.remove(id);
    }

    public static int size() {
        return vectorLugares.size();
    }

    public static ArrayList< Lugar > ejemploLugares(){
        ArrayList < Lugar > lugares = new ArrayList < Lugar >();
        lugares.add(new Lugar("El bunker de Tinchicus","Mercedes Sosa S/N",-64.5750594,-32.0728125,TipoLugar.EDUCACION,1155556666,"https://tinchicus.com","Un gran lugar para aprender",4));
        lugares.add(new Lugar("El Chañar","Ruta Prov. 228",-64.5404009,-32.0672181,TipoLugar.RESTAURANTE,515273,"https://www.elchanar.com.ar","Un gran lugar para comer",3));
        lugares.add(new Lugar("Moea Moeea","Liberta 400",-64.5750594,-32.0728125,TipoLugar.BAR,429992,"https://www.moemoeea.com.ar","Un gran lugar para tomar algo",3));
        lugares.add(new Lugar("Reserva Cascada Escondida","Camino Rural S/N",-64.5162106,-32.0725274,TipoLugar.NATURALEZA,555666,"https://www.starosadecalamuchita.com.ar","Pedazo de paraiso en la tierra",4));
        return lugares;
    }
}

Analicemos este codigo fuente, primero vamos a tener dos lineas:

import java.util.ArrayList;
import java.util.List;

Si no agregan estas lineas, a medida que vayan escribiendo el codigo fuente la IDE se encargara de notificarles que si presionan Alt+Enter para agregar automaticamente la linea para corregir errores, nuestra primera linea en la clase creara la coleccion List llamada vectorLugares y aqui le vamos a asignar el valor almacenado en ejemploLugares(), luego lo veremos, despues definimos el constructor donde al igual al caso anterior se asignara el valor de ejemploLugares() a la coleccion creada (vectorLugares). Ahora declararemos algunos metodos empecemos con elemento(), el cual se encargara de devolver el valor de la posicion del elemento informado entre los atributos, luego tenemos el metodo anyade()  para agregar un nuevo elemento dentro de la coleccion, el siguiente metodo es nuevo(), este se encargara de crear un nuevo elemento en la coleccion y agregarlo al final de mismo, luego esta la funcion borrar(), para eliminar el elemento informado en la posicion y por ultimo, tenemos un metodo llamado size() para obtener el tamaño de la coleccion. Ahora crearemos un nueva coleccion llamada ejemploLugares(), esta vez del tipo ArrayList, luego volveremos a definir otro ArrayList llamado lugares y estos van a ser de la clase Lugar, en esta coleccion si nos encargaremos de almacenar toda la informacion de nuestros lugares, veamos una linea de ejemplo:

lugares.add(new Lugar("El bunker de Tinchicus","Mercedes Sosa S/N",
			-64.5750594,-32.0728125,TipoLugar.EDUCACION,
			1155556666,"https://tinchicus.com",
			"Un gran lugar para aprender",4));

Observen como utilizamos el metodo add() para agregarlo en la coleccion, luego utilizamos new Lugar para generar un nuevo objeto del tipo Lugar y le pasamos toda la inforamcion necesaria al constructor, en este caso lo hacemos con cuatro ejemplos distintos, observen como cambio a TipoLugar dependiendo del tipo del local informado para el ingreso, si quieren ustedes pueden usar otros ejemplos pero esto es simplemente para probarlo, luego de agregado todos los lugares utilizamos return lugares; para devolver el valor almacenado en la coleccion. Con esto acabamos la clase Lugares, ahora vamos a la clase Lugar para agregar la siguiente funcion y sobrecargarla:

public Lugar()
{
 	fecha = System.currentTimeMillis();
 	posicion = new GeoPunto(0,0);
 	tipo = TipoLugar.OTROS;
}

Es una redefinicion del constructor, esto lo hacemos para poder utilizarlo sin necesidad de tener que enviar nuevamente toda la informacion, una vez agregado la nueva funcion debera quedar asi el nuevo codigo de la clase Lugar:

Anuncios
package org.example.mislugares;

public class Lugar {
    private String nombre;
    private String direccion;
    private GeoPunto posicion;
    private String foto;
    private int telefono;
    private String url;
    private String comentario;
    private long fecha;
    private float valoracion;
    private TipoLugar tipo;

    @Override
    public String toString() {
        return "Lugar{" +
                "nombre='" + nombre + '\'' +
                ", direccion='" + direccion + '\'' +
                ", posicion=" + posicion +
                ", foto='" + foto + '\'' +
                ", telefono=" + telefono +
                ", url='" + url + '\'' +
                ", comentario='" + comentario + '\'' +
                ", fecha=" + fecha +
                ", valoracion=" + valoracion +
                ", tipo=" + tipo +
                "}";
    }

    public TipoLugar getTipo() {
        return tipo;
    }

    public void setTipo(TipoLugar tipo) {
        this.tipo = tipo;
    }

    public Lugar(String nombre, String direccion, double longitud, 
                 double latitud, TipoLugar tipo, int telefono, 
                 String url, String comentario, int valoracion) {
        this.tipo = tipo;
        fecha = System.currentTimeMillis();
        posicion = new GeoPunto(longitud, latitud);
        this.nombre = nombre;
        this.direccion = direccion;
        this.telefono = telefono;
        this.url = url;
        this.comentario = comentario;
        this.valoracion = valoracion;
    }

    public Lugar(){
        fecha = System.currentTimeMillis();
        posicion = new GeoPunto(0,0);
        tipo = TipoLugar.OTROS;
    }
    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getDireccion() {
        return direccion;
    }

    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    public GeoPunto getPosicion() {
        return posicion;
    }

    public void setPosicion(GeoPunto posicion) {
        this.posicion = posicion;
    }

    public String getFoto() {
        return foto;
    }

    public void setFoto(String foto) {
        this.foto = foto;
    }

    public int getTelefono() {
        return telefono;
    }

    public void setTelefono(int telefono) {
        this.telefono = telefono;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getComentario() {
        return comentario;
    }

    public void setComentario(String comentario) {
        this.comentario = comentario;
    }

    public long getFecha() {
        return fecha;
    }

    public void setFecha(long fecha) {
        this.fecha = fecha;
    }

    public float getValoracion() {
        return valoracion;
    }

    public void setValoracion(float valoracion) {
        this.valoracion = valoracion;
    }

}

Una vez hecho todo esto, procederemos a modificar nuestra ultima clase. Esta va a ser la clase Principal, les muestro el codigo fuente para ver como debe quedar y se los explico:

package org.example.mislugares;

import static org.example.TipoLugar.EDUCACION;

public class Principal {
    public static void main(String[] main){
        for(Lugar l : Lugares.vectorLugares) {
            System.out.println(l);
        }
    }
}

La linea import ahora pierde validez, pueden borrarla o dejarla pero no va a tener injerencia en nuestra app, la modificacion va a estar dentro de main() donde agregaremos las siguiente dos lineas:

for(Lugar l : Lugares.vectorLugares) 
{
 	System.out.println(l);
}

Donde utilizaremos un bucle for() donde crearemos un objeto de la clase Lugar llamado l, el cual sera el comienzo o lo mismo que decir es la posicion cero, y luego de los dos puntos estara el valor final, en general se usan arrays y estableceria como ultimo valor a la ultima posicion del array, esto equivaldria a los metodos foreach() utilizados en otros lenguajes, pero a su vez asignara cada posicion del array al objeto l creado para este bucle, luego en el bloque mostraremos el contenido de cada uno de las posiciones de la coleccion por medio del println(), una vez ejecutado y funcionando correctamente deberan tener una salida de este estilo:

android50
Anuncios

Si lograron la salida de la imagen anterior, han logrado ejecutar el programa correctamente. Hasta aqui hemos visto dos tipos mas de clases de Java, la primera fue el tipo ENUM (Enumerado) para almacenar unos tipos de constantes, los cuales estaran relacionados a algun tipo de informacion para este caso una descripcion y un valor para mostrar un tipo de icono, en el segundo caso hemos hablado y visto como trabajar con colecciones, las cuales equivaldrian a un tipo de array pero orientado a objetos y es util para almacenar mas informacion de objetos para luego poder obtenerlo de una mejor forma, espero les haya gustado y les sea util, sigueme en Twitter, Facebook o Google+ para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.