26. Java: tipo enumerado, método y clases abstractas e interfaz.
Tipo enumerado
El tipo enumerado es un tipo de dato en el que se definene una serie de valores constantes en su interior. Cuando declaramos una variable a partir de un tipo enumerado solo podrá albergar los valores predefinidos en el interior del tipo enumerado. La definición es muy parecida a la de una clase, pero se utiliza la palabra clave "enum" en vez de "class".Pero, ¿qué es un valor constante en programación?
Un valor constante es un valor que no cambia en el interior de la aplicación. Por ejemplo el valor del IVA (21%) puede ser definido como una constante. También el número PI (3,14) o la fuerza de la gravedad (9,8m/s2) son los típicos valores cuando se habla de constantes en programación.
Las constantes se escriben en MAYÚSCULAS.
Los dato constante es como si estuviese almacenado en una base datos, pero declarado directamente en el código nos ahorramos tener que escribir la consulta a la base de datos para recuperarlo.
Deberías saber: ahora que conoces el concepto de "valor constante", la palabra "variable" cobra significado: en una variable podemos cambiar el valor asociado, en una constante el valor no será necesario cambiarlo.
Prosigamos con el tipo de dato "enum" de Java:
El tipo enumerado, como hemos dicho previamente, permite declarar multiples valores constantes.
Los valores de un tipo enumerado podrían guardarse tambien en un base de datos.
Sintaxis:
enum <nombre_enumeración> { <CONSTANTE>, ..., <CONSTANTE> }
Ejemplo 1:
enum Estacion { PRIMAVERA, VERANO, OTOÑO, INVIERNO}
Ejemplo 2:
Como se puede apreciar, los atributos definidos en un tipo enumerado, se escriben en MAYÚSCULAS.
También se puede apreciar en el segundo ejemplo, que además de los valores constantes, un tipo enumerado puede también contener atributos y métodos al igual que una clase. En este caso:
- Los atributos son: texto y recurso. El atributo "texto" tiene como valor una cadena de texto asociada a cada valor, por ejemplo: EDUCACIÓN - "Educación". Y el atributo "recurso" tiene como valor un número entero que identifica un imagen que se asocia al valor, por ejemplo OTROS - 5.
- Los métodos son: TipoLugar() (constructor), getTexto() y getRecurso().
El métodos getTexto() nos permitirá recuperar el valor del atributo "texto" de cada uno de los valores: "Otros", "Restaurante", "Bar", etc. Y getRecurso() recupera el valor del atributo "recurso".
Una vez declarado el tipo enumerado, podemos acceder a sus valores constantes. Para ello, actuaremos del mismo modo que cuando accedemos a los atributos o a los métodos de un objeto, es decir, usaremos el punto (.).
Sintaxis:
nombre_tipo_enumerado.valor
Ejemplos:
Estacion estacion = estacion.VERANO;
TipoLugar tipoLugar = TipoLugar.BAR;
En estos ejemplos, hemos definido una variable de tipo "Estacion" y "TipoLugar" y le hemos asignado uno de los valores predefinidos en los tipos enumerados "Estacion" y "TipoLugar".
A continuación podriamos ejecutar lo siguiente por ejemplo:
String textoTipoLugar = tipoLugar.getTexto();//esto devuelv "Bar"
Métodos abstractos y clases abstractas
Hay ciertos métodos que no estan hechos para usarse en las clases donde se declaran. Son métodos que son una especie de simple plantilla.Las clases que contiene este tipo de métodos plantilla se convierte también en un especie de clase plantilla que no puede instanciarse.
Estos métodos (comportamientos) se declaran pensando esencialmente en que sean la clases hijas que deriven de las clase que los contiene, quienes los implementen y los usen. Son métodos o comportamientos que tan solo queremos que sean implementados en las clases hijas.
Estos métodos son los llamados métodos "abstractos", que convierten a la clase que lo contiene también en una clase "abstracta".
Un método declarado abstracto (abstract) no contiene código dentro. Ejemplo:
abstract void miMetodo();
Como se puede apreciar, cuando declaramos un método "abstract", no ponemos llaves, ya que el método no tiene contenido.
Una clase que contiene un método abstracto tiene que ser declarada explicitamente como una clase "abstract" también. Ejem.:
abstract class MiClase {
abstract void miMetodo();
}
Cuando una clase contiene un método abstracto, no se podrán crear objetos a partir de esta, es decir la clase no podrá ser instanciada.
Sin embargo, las clases que hereden de esta clase abstracta, SÍ podran crear objetos, pero con la condición de que escriban el código de los métodos abstractos que se heredan de la clase madre. Ejem.:
abstract class MiClaseHija extends MiClase {
void miMetodo() {
... // aquí implementamos el método
}
}
Cuando una clase hija no escribe el código de los métodos "abstract" de una clase madre, deberá de ser declarada también "abstract".
Como hemos dicho en un principio, los metodos "abstract" convierten a la clase que lo contiene en un especie de plantilla para clases hijas que quieran derivar de ella. Cuando creamos un método "abstract" y por tanto una clase "abstract", la clase está diciendo algo así como "mis clases hijas tiene que implementar este método".
Las clases abstractas las podemos encontrar en librerías de terceros. Pueden ser una manera de obligar a que la persona que estas usando la clase abstracta a que implemente los métodos abstractos que esta contiene, puesto que sin ellos una clase derivada no tendría sentido.
Ejemplo: imaginemos que tenemos que crear una aplicación informática para ESO sobre geometría. En la aplicación se podrán crear figuras geometricas y redimensionarlas, mostrando a un lado el area y el perimetro. Si hacemos una aplicación orientada a objetos, es probable que creemos la clase FiguraGeometrica (figura ge). De ella vamos a derivar otras clases del estilo Cuadrado, Triangulo, Circulo, etc.
Será necesario que las clases derivadas tengan un método que calcule el área de la figura, vamos por ello a crear método abstracto getArea() en la clase Shape (figura geométrica), que calcula y devuelve el area de una figura. De esta manera, el metodo getArea() no se implementa en la clase Shape, tan solo tendrá que ser implementado de manera obligatoría en las clases hijas (Cuadrado, Circulo, etc.).
Si creamos, un método "abstract", recuerda que tendrás que declarar la clase tambien "abstract".
Lo mismo ocurrirá con el método getPerimeter() que calcula el perimetro del a figura.
Interface (interfaz)
En Java se expande el concepto de métodos abstractos con las "interfaces". Una "interface" es como una clase cuyos métodos son todos abstractos, es decir ninguno de los métodos está implementados. Se dice que una "interface" es como una clase "abstract" pura. Veamos un ejemplo:interface Shape {
public double getArea();
public double getPerimeter();
}
Esta es la sintaxis de la definición de una "interface":
Como se puede ver, una "interface" es parecida a un clase, pero para definirla usamos la palabra clave "interface" en vez de "class".
La sola definición de una "interface" no aporta nada a nuestra aplicación. Para hacer uso de una "interface", la asociamos a una clase, decimos en ese caso que LA CLASE X IMPLEMENTA LA "INTERFACE" Y. Veamos cual es la sintaxis de la implementación de una interface:
Veamos aquí un ejemplo de implementación de una "interface":
class Circle implements Shape {
...
}
En este caso decimos que la clase "Circle" implementa la interface "Shape".
Si la clase "Circle" implementa la interface "Shape", la clase "Circle" deberá obligatoriamente implementar el cuerpo de los métodos declarados en "Shape", es decir, es aspecto de la clase "Circle" sería este:
class Circle implements Shape {
public double getArea() {
//aquí implementamos el método
}
public double getPerimeter() {
//aquí implementamos el método
}
}
Veamos otros ejemplos de "interface":
Como hemos visto en la sintaxis de la implementación de una "interface", en una clase es posible implementar más de una "interface".
Otras características de las "interfaces" son:
- No contiene atributos
- No se puede instanciar.
- Todos sus métodos son "public".
¿Cuando usaremos una "interface" o una clase "abstract"? Veamos un resumen con algunas diferencias:
- Una clase "abstract" puede contener atributos, una "interface" no.
- Una clase que implementa una "interface" tiene que implementar todos sus métodos obligatoriamente. En un clase "abstract" no es obligatorio implementar los métodos abstractos de la clase madre, aunque hay que recordar una clase que no implemente los métodos "abstract " de una clase madre, no podrá instanciarse.
- Una clase puede implementar multiples "interfaces", pero solo una clase "abstract".
Comentarios
Publicar un comentario