sábado, 16 de febrero de 2013

CONCEPTOS BÁSICOS DE JAVA (II)


MÉTODOS GETTER Y SETTER
Debido a que las clases pueden ser muy complejas y que necesitamos algún mecanismo que nos asegure que no se accederá de forma incorrecta a los atributos, se ha establecido un convenio para acceder a los atributos de un objeto. Este convenio indica que se debe crear un método getX() y setX() por cada atributo que queramos que sea accesible desde fuera de nuestra clase. Dónde X se sustituye por el nombre del atributo referenciado.
- getX(): devuelve el valor del atributo X.
- setX(): establece el valor del atributo X.

Por ejemplo en nuestro ejemplo tenemos varios métodos de este tipo:
// Getter y setter
public String getMatricula() {
return matricula;
}
public void setMatricula(String matricula) {
this.matricula = matricula;
}
public String getMarca() {
return marca;
}
public void setMarca(String marca) {
this.marca = marca;
}



PASO DE MENSAJES
Es la forma utilizada en la Programación Orientada a Objetos proporcionada para poder comunicar objetos entre sí. Por ejemplo si quiero preguntarle a un objeto Coche por su información, debería de hacer algo similar a esto:
// Mostramos sus caracteristicas
coche1.mostrarCaracteristicas();
// Cambiamos algunos datos del coche1
coche1.setMarca("Porsche");
coche1.setModelo("Gt");
coche1.setTipoCombustible("Gasolina");
En el ejemplo la clase Main.java utiliza los métodos de la clase Coche.java para mostrar sus características y modificar sus datos (métodos setter).


VISIBILIDAD DE VARIABLES Y MÉTODOS
Cuando creamos una clase podemos determinar quién puede ver y utilizar cada uno de las características de nuestra clase. Para esto existen varios modificadores de acceso o visibilidad llamados prívate, protected, public y default. Cada uno de estos establece una restricción sobre qué clases externas pueden acceder a una propiedad.
- Private: sólo la propia clase puede acceder a un atributo o método definido como privado.
- Protected: puede acceder la propia clase, las clases hijas (heredadas o derivadas) y las clases que se encuentren en el mismo paquete.
- Default (sin modificador): puede acceder la propia clase y las clases que se encuentren en el mismo paquete.
- Public: puede acceder cualquier clase.

De estos modificadores los más importantes son public y prívate. El resto son una versión refinada de los dos anteriores. Por ejemplo en la clase Vehículo el atributo matrícula es privado y esto hace que desde otra clase (por ejemplo Main.java) no se pueda acceder directamente a él. Por este motivo dentro de la clase Vehículo se definió los métodos getMatricula() y setMatricula() como públicos, para permitir que otra clase pueda acceder a este atributo de una manera segura.
public class Vehiculo {
/* ATRIBUTOS */
// Atributos de instancia
private String matricula;
.
.
.
// Getter y setter
public String getMatricula() {
return matricula;
}
public void setMatricula(String matricula) {
this.matricula = matricula;
}
}
public class Main {
public static void main(String[] args) {
.
.
.
Vehiculo vehiculo1 = new Vehiculo("1600RM", "Audi", "A5", "Diesel");
// Funciona correctamente, pues el método setMatricula() es público
vehiculo1.setMatricula("43534UM");
// Falla, pues el atributo es privado
vehiculo1.matricula = "43534UM";
.
.
.
}
}
En una clase normalmente los atributos se crean privados y luego se definen métodos getter y setter para permitir acceso a estos atributos.


MODIFICADORES STATIC Y FINAL
Estos modificadores nos permiten refinar el comportamiento de los atributos y métodos de una clase.
- Static: nos indica que un atributo o método pertenece a la clase en lugar de a una instancia (objeto) concreta de esa clase. Los atributos que hemos visto hasta ahora son todos de instancia, lo cual significa que cuando creamos un objeto nuevo, dentro del objeto se crea una variable y por tanto cada objeto tiene su propia variable. Si indicamos que un atributo es static le estaremos indicando al compilador que sólo queremos crear una única variable y que ésta variable será compartida por todos los objetos que creemos de esta clase.
- Final: nos indica que una clase o método no se puede modificar o heredar. Esto se utiliza básicamente por razones de seguridad (para que una clase no pueda ser reemplazada por otra que la herede).

Un miembro static es único para todos los objetos que se crean. Se puede decir que esta variable siempre está creada. Se puede acceder a él sin necesidad de un crear un objeto. Un miembro no estático (o de instancia) pertenece a cada objeto individual. Se puede decir que se crea junto con el objeto.
Un ejemplo de uso de static sería mantener una variable de clase que nos indique la cantidad de Vehículos creados en nuestra aplicación. Si no dispusiéramos del modificador static tendríamos que implementar esto con una variable global.
public class Vehiculo {
/* ATRIBUTOS */
// Atributos de instancia
private String matricula;
.
.
private int vehiculoNumero;
private static final int VELOCIDAD_MAX = 320;
// Atributos de clase
private static int numeroVehiculo = 0;
/* MÉTODOS */
// Constructor de clase
public Vehiculo(String matricula, String marca, String modelo,
String tipoCombustible)
{
this.matricula = matricula;
this.marca = marca;
this.modelo = modelo;
this.tipoCombustible = tipoCombustible;
vehiculoNumero = ++numeroVehiculo;
}
}
public class Main {
public static void main(String[] args) {
// Mostramos el número de vehículos creados actualmente
System.out.print("Número de vehículos creados: ");
Vehiculo.mostrarNumeroVehiculos();
// Creamos un coche
Vehiculo vehiculo1 = new Vehiculo("1600RM", "Audi", "A5",
"Diesel");
Vehiculo vehiculo2 = new Vehiculo("9094BC", "Porsche", "Gt",
"Gasolina");
// Mostramos el número de vehículos creados actualmente
System.out.print("Número de vehículos creados: ");
Vehiculo.mostrarNumeroVehiculos();
}
La salida del anterior código sería:
Número de vehículos creados: 0
Número de vehículos creados: 2
Otra función importante de estos dos modificadores la posibilidad de definir constantes en Java. En Java a diferencia de otros lenguajes no tiene una palabra específica para definir constantes. Por ejemplo en la clase Vehículo podríamos definir la velocidad máxima para todos los vehículos. Por tanto si queremos crear una variable que se comporte como una constante se haría de la forma es la siguiente:
public static final int VELOCIDAD_MAX = 320;