sábado, 8 de julio de 2017

Derechos de acceso en Java

Acceso
El estado de un objeto está dado por el conjunto de valores de sus atributos. Una modificación arbitraria, intencionada o no, puede provocar inconsistencias o comportamientos no deseados de un objeto. Es por este motivo que se debe controlar el acceso a los atributos de los objetos. 
Java proporciona mecanismos de acceso a los elementos de una clase, de forma que se puede determinar el derecho de acceso de cada elemento según las necesidades de los objetos.

Acceso privado: Los elementos privados solo se pueden utilizar dentro de la clase que los define. Para indicar el acceso privado se utiliza private.

Acceso de paquete: El acceso a estos componentes es libre dentro del paquete en el que se define la clase. El acceso de paquete no se indica expresamente.

Acceso protegido: Los elementos protegidos solo se pueden utilizar dentro de la clase que los define, aquellas clases que la extiendan y cualquier clase definida en el mismo paquete. Para indicar el acceso protegido se utiliza protected.

Acceso público: Los elementos públicos se pueden utilizar libremente. Para indicar expresamente el acceso público se utiliza public. No es necesario, el acceso público se utiliza como valor por defecto mientras no se indique private o protected.

Para limitar el acceso a los atributos de la clase Vehiculo se utiliza private. Al utilizar este tipo de acceso, solo los métodos "get" y "set" de la clase pueden acceder a ellos.

public class Vehiculo {
private String matricula;
private String marca;
private String modelo;
private String color;
private double tarifa;
private boolean disponible;
}

Con esta declaración, todos los atributos de la clase tienen acceso private y el diagrama de clases muestra un signo menos delante del identificador del atributo para indicar que es privado.

La clase Vehiculo con sus métodos "get" y "set".

public class Vehiculo {
private String matricula;
private String marca;
private String modelo;
private String color;
private double tarifa;
private boolean disponible;
public String getMatricula() {
return this.matricula;
}
public String getMarca() {
return this.marca;
}
public String getModelo() {
return this.modelo;
}
public String getColor() {
return this.color;
}
public double getTarifa() {
return this.tarifa;
}
public boolean getDisponible() {
return this.disponible;
}
public void setTarifa(double tarifa) {
this.tarifa = tarifa;
}
public void setDisponible(boolean disponible) {
this.disponible = disponible;
}
}


La clase Vehiculo define métodos "get" para los atributos matrícula, marca, modelo, color, tarifa y disponible. Los métodos "set" solo son aplicables a los atributos tarifa y disponible porque se considera que el resto de atributos de la clase no pueden modificar su valor una vez que se ha creado el objeto.

La responsabilidad de modificar los atributos de los objetos es de los métodos "set". Estos métodos deben verificar que el valor que se desea asignar a un atributo es válido y cumple con las restricciones de diseño de la clase.

Elementos de clase (Static) en Java

Clase (Static) en Java
Los atributos y métodos de una clase precedidos con la palabra static se denominan elementos de clase. Solo existe un elemento estático para todos los objetos de una misma clase. 
Esto significa que los elementos de clase son compartidos por todas las instancias de la clase. Cuando se modifica un elemento de clase todas las instancias de la clase ven dicha modificación.

Los atributos de clase deben tener un valor inicial aunque no exista ninguna instancia de la clase. Si el elemento de clase es un valor constante, entonces se debe indicar la palabra final.


Por ejemplo, se puede definir la constante PI para calcular el perímetro y el área de la clase Circulo.

public class Circulo {
public static final double PI = 3.1415926536;
private double radio;
public Circulo(double radio) {
this.radio = radio;
}
public double getRadio() {
return this.radio;
}
public double calcularPerimetro() {
return 2 * PI * this.radio;
}
public double calcularArea() {
return PI * this.radio * this.radio;
}
}


El acceso al elemento estático PI, la instanciación del objeto miCirculo y las invocaciones a los métodos calcularPerimetro() y calcularArea().

// Este programa calcula el perímetro y el área de una circunferencia
public class PerimetroAreaCircunferencia {
public static void main (String[] args) {
System.out.println("El valor de PI es " + Circulo.PI);
Circulo miCirculo = new Circulo(10.0);
System.out.println("El radio del circulo es " +
miCirculo.getRadio() +
" su perimetro es " +
miCirculo.calcularPerimetro() +
" y su área es " +
miCirculo.calcularArea());
}
}