Programación orientada a objetos: niveles de acceso

Programación orientada a objetos: niveles de acceso

Seguimos con nuestro curso de programación, en este artículo vamos a implementar los niveles de acceso de nuestra aplicación. Antes de profundizar más en como programar nos tenemos que fijar si lo que hemos hecho hasta ahora está bien o mal. Lo que hemos hecho hasta ahora no está mal, pero tampoco se puede decir que este bien, y no está bien porque no esté bien programado, sino porque no hemos definido correctamente los niveles de acceso que tiene cada campo de la aplicación. Recordemos que partimos de un ejemplo inicial, al que le hemos añadido métodos.

niveles_acceso

Para empezar tenemos que definir que son los niveles de acceso de Java. Los niveles de acceso son las restricciones que tiene un dato para ser accedido. Estos niveles de acceso se dan tanto en las propias clases, como en los objetos instanciados de ellas, como sus métodos y atributos.

Un resumen de los niveles de acceso que presenta Java puede ser:niveles_acceso

Por norma general definiremos los métodos que sean accedidos desde otra clase como public y los métodos que sean usados dentro de la propia clase como private. Por ahora no utilizaremos el nivel de acceso protected.

Las clases se declaran public y los atributos como private. Es muy importante, y algo extremadamente básico, declarar los atributos como private siempre, bajo cualquier circunstancia. Aunque tenemos que darnos cuenta que no podremos acceder a ellos desde otra clase, pero podremos acceder a ellos desde la propia clase, y desde otra clase a través de métodos que devuelvan o modifiquen el atributo, getters y setters.

Por tanto lo primero que tenemos que hacer es modificar las clases que forman nuestra aplicación, en este caso las clases Granja y Animal, para que cumplan estas condiciones.

Primero vamos a redefinir los métodos y atributos añadiéndole el nivel de acceso adecuado.

La clase Granja quedará definida como:

import java.util.ArrayList;public class Granja {    private String nombre;    private int numeroAnimales;    private boolean estaEnVenta;    private ArrayList<Animal> animales = new ArrayList<Animal>();    public Granja(String nombre) {        this.nombre = nombre;    }    public void imprimirNombre() {        System.out.println("El nombre de la granja es: " + nombre);    }    public void añadirAnimal(Animal animal) {        animales.add(animal);    }    public void muestraAnimales() {        for (int i = 0; i < animales.size(); i++)            System.out.println(animales.get(i).nombre + " con peso "                    + animales.get(i).edad);    }}

La clase Animal como:

public class Animal {    private String nombre;    private int edad;    private double peso;}

Una vez refactorizados los niveles de acceso vamos a generar los setters y getters para los atributos, para que puedan ser accedidos desde la clase lanzador. Tenemos que darnos cuenta que en la gran mayoría de los casos no es necesario generar todos getters y setters para todos los atributos de la clase ya que igual no son utilizados fuera de la clase y por ello solo estaríamos implementando de más, estaríamos generando código inútil. En este caso los generamos todos, ya pensaremos luego si son útiles o no. Otra opción sería, solo añadirlos cuando utilicemos los atributos desde otra clase.

Para generar los setters y getters Eclipse lo hace prácticamente de manera automática simplemente tenemos que ir a:

  1. Source -> Generate Getter and Setters y aquí marcamos los atributos que queramos que generen los getters y setters. Nosotros los marcaremos todos.
  2. El Access modifier lo marcamos como public (en otras ocasiones será protected).

Al aceptar ya deberíamos generados todos los getters y setters para los atributos de nuestra clase. Repetimos el proceso con la otra clase.

Si nos fijamos aunque hallamos generado los setters y getters tendremos unos errores en el código:errores_niveles_acceso

Para solucionarlo tendremos que sustituir los métodos donde se accede directamente a un atributo por su llamada getter si es de lectura o setter si es de escritura. El error lo localizamos en el método muestraAnimales(), debemos modificarlo de forma que quede algo así:

void muestraAnimales() {    for (int i = 0; i < animales.size(); i++)        System.out.println(animales.get(i).getNombre() + " con peso "                + animales.get(i).getEdad());}

Si no queremos modificarlos escribiéndolo nosotros mismos podemos pasar por encima del error y Eclipse nos mostrara las posibles soluciones.

modifcar_atributo_con_getter

Tenemos que tener en cuenta que no en todos los lenguajes se usan getters y setters, en muchos destacando C#, y posiblemente Java lo haga, se hace mediante el uso de propiedades que facilitan el llamado azúcar sintáctico, pero eso por ahora no nos interesa.

Para probarlo vosotros mismos podéis usar el código fuente que hemos utilizado para la ocasión.

Para ti
Queremos saber tu opinión. ¡Comenta!