El encapsulamiento y la visibilidad en Java

En software hay dos aspectos muy importantes: el interface y la implementación.

En el interface, se nos indica cómo se va a acceder nuestro software y cómo será utilizado. En Java, el interface está compuesto por los elemento de una clase que van a ser visibles desde fuera de ésta.

Por otro lado tenemos la implementación, que se compone del código exacto que se ha utilizado en desarrollar los diferentes algoritmos. En Java se compone de atributos y de métodos.

El término encapsulamiento en Java, consiste en ocultar atributos de un objeto de manera que solo se pueda cambiar mediante operaciones definidas en ese objeto. Está estrechamente relacionado con la visibilidad. 

Para definir la visibilidad en Java, se dispone de palabras reservadas:

  • public: nos indica que es accesible desde cualquier clase [interface].
  • private: solo es accesible desde a clase actual.
  • protected: accesible desde la clase actual, sus descendientes o el paquete del que forma parte.
  • sin ninguna palabra: accesible desde cualquier clase del paquete.

Los atributos en Java, deben tener visibilidad private. Entonces, ¿cómo accedemos a los atributos? La respuesta está en los métodos Getters y Setters. Veamos un ejemplo de código de estos métodos.

class Punto {

private double puntox, puntoy;

public double getPuntox() {

return puntox;

}

public void setPuntox (double puntox) {

this.puntox = puntox;

}

...

 

Creación de clases

¿Cómo definimos una clase en Java?

Para definir una clase en Java debemos crear un fichero que se llamará igual que la clase y con extensión .jav

Debemos tener en cuenta que una clase implica un fichero y que debe estar formado por :

  • atributos ( nos define el estado del objeto)
  • constructor ( nos permite iniciar el objeto)
  • métodos ( nos permite modificar el comportamiento del objeto)

La estructura es la siguiente:

class <Clase> {

// declaración de atributos

[visibilidad][modificadores] <tipo><atributo> [=valor];

// declaración del constructor

public <Clase> (<argumentos>){

<instrucciones>;

}

// declaración de métodos

[visibilidad][modificadores] <tipo><método>(<argumentos>){

<instrucciones>;

}

….

}

Pilas

Las pilas es un conjunto de datos organizados de una forma lineal, ya que cada elemento tiene dos vecinos, uno encima y otro debajo, excepto el primero y el último.

Hay dos operaciones especialmente importantes en las pilas: push y pop.

La operación denominada push añade un elemento en la parte superior de la pila y la denominada pop elimina el elemento situado en la parte superior (solo tenemos acceso a ese elemento).

Tanto  push como pop tienen sus limitaciones y pueden provocar errores.

El orden de extracción es: el último en entrar es el primero en salir. 

La API de Java proporciona la clase Stack en el paquete java.util

Podemos definir un interfaz para pilas:

public interface Stack {

public void push (Object o);

public Object pop()

}

¿cómo podemos implementar pilas basadas en arrays?

Hay muchas posibles estrategias que podemos usar; tenemos que recordar que el array permite el acceso a cualquiere elemento del mismo, situación que no ocurre con las pilas.

El primer elemento que nos dan lo podemos guardar en la posición cero, el siguiente en la posición uno, y así sucesivamente; el elemento de la cima (top), el último introducido es el primero en salir. Para recordar esta posición, definiremos un atributo entero al que le daremos el nombre de top, el último insertado. Cada vez que insertemos un elemento incrementamos ese entero, y cuando hagamos pop lo decrementaremos en una unidad.

De la misma forma se podría implementar mediante listas enlazadas.

Arrays

En ocasiones podemos necesitar almacenar una secuencia de valores, un array en inglés, como puede ser los valores de temperatura de un recinto.

En Java, los valores contenidos en el array deben ser del mismo tipo.

Aquí tenemos varios cuatro ejemplos de arrays:

[1,3,6,7,9]    [‘hola’, ‘gato’,’estoy’]    []     [true,true,true,false]

Un array, al igual que hacemos con las variables, se le asigna un nombre(identificador). Los elementos del array se identifican con el nombre del array seguido de un corchete en donde se encuentra el índice del array. 

Si tenemos un array denominado a, los elementos de este array son los que se muestran en la figura:

Descripción array
Descripción array

Resaltar que el índice de un array comienza por el cero. Una propiedad importante en los array es la longitud; el concepto de longitud queda perfectamente aclarado en la figura anterior.

¿cómo declaramos un array?

Escribimos el tipo de elemento y después abrimos y cerramos corchetes; a continuación el nombre que hemos elegido para nuestro array.

int [] unArrayDeEnteros

¿cómo creamos un array?

Para crear un array, por ejemplo de longitud 4, utilizaremos la siguiente orden:

nombreDelArray = new int [4]

y conseguiríamos reservar espacio de memoria.

¿cómo declaramos y creamos a la vez un array?

Uniendo las dos conceptos anteriores, tenemos: 

int [] nombreDelArray = new int[4]

Por último, para acceder a un elemento, tendremos que poner el nombre del array seguido del índice entre corchetes.