| Creación de un Televisor estándar |
| Paso 15: Operativa |
La palabra reservada final aplicada a un atributo
Un operador de televisión por cable en sus instalaciones comerciales en una calle céntrica de una gran ciudad ha decidido emplazar varios televisores en su escaparate para que los viandantes puedan ver los programas que ofrece este operador durante las 24 horas del día.
- este operador sólo quiere que se retransmita su canal en todos los televisores expuestos
En el mundo de los Objetos esto se puede realizar utilizando la palabra reservada final.
Este es el Diagrama de Clases de diseño que enfoca este planteamiento

- <<final>> -CANAL: int=15
- en UML se sabe que un atributo es final porque
- anteponemos el estereotipo <<final>> delante del atributo
- el atributo está subrayado y
- el nombre del atributo se escribe con letras mayúsculas
- una variable de Clase final siempre tiene que ser inicializada cuando se declara
- en este caso decimos que siempre queremos que el valor de canal sea el 15
- Hemos eliminado los métodos:
+setCanal(...): void
+subirCanal(): void
+bajarCanal(): void
- debido a que un atributo final pasa a ser una variable constante tal y como las conocemos en otros lenguajes de programación
- es decir su valor no puede ser modificado bajo ningún concepto. Por tanto estos tres métodos los hemos eliminados por que ya no tienen razón de existir.
Para ver en nuestro caso como el compilador se queja cuando intentamos modificar la variable de instancia CANAL, tenemos que descomentar las interacciones que intentan modificar el valor de CANAL. Este es el código una vez más modificado correspondiente a la Clase Televisor
| package paqtvestandar;
public abstract class Televisor {
private static final int CANAL=15;
private int volumen = 5;
public Televisor() {
}
public Televisor(int canal) {
setCanal(canal);
}
public void subirCanal() {
// setCanal(CANAL + 1);
}
public void bajarCanal() {
// setCanal(CANAL - 1;
}
public int getCanal() {
return CANAL;
}
public static void setCanal(int valorCanal) {
if (valorCanal < 0){
// CANAL = 0;
}
else {
// CANAL = valorCanal;
}
}
public void subirColor(){
System.out.println("Televisor - subirColor(): estoy subiendo el color");
subirColorAyuda();
}
protected void subirColorAyuda() {
System.out.println("Televisor - subirColorAyuda(): sigo subiendo el color");
}
public void bajarColor(){
System.out.println("Televisor - subirColor(): estoy bajando el color");
bajarColorAyuda();
}
protected void bajarColorAyuda() {
System.out.println("Televisor - bajarColorAyuda(): sigo bajando el color");
}
public void subirVolumen() {
volumen = volumen + 1;
}
public void bajarVolumen() {
volumen = volumen - 1;
}
public void setVolumen(int volumen) {
if (volumen < 0){
this.volumen = 0;
}
else {
this.volumen = volumen;
}
}
public int getVolumen() {
return volumen;
}
public abstract void usarMenu();
} |
- private static final int CANAL=15;
- una variable de Clase final a su vez también es static porque sólo existe una copia de su valor en la zona de memoria estática
Compilamos la Clase Televisor.
Ahora vamos a quitar los comentarios del método setCanal(...) de la Clase Televisor
public static void setCanal(int valorCanal) {
if (valorCanal < 0){
CANAL = 0;
}
else {
CANAL = valorCanal;
}
} |
Como podemos ver el compilador nos indica que a una variable de tipo final no se le puede reasignar su valor

Volvemos a comentar las dos líneas que utilizan la variable de clase CANAL del método setCanal(...) de la Clase Televisor.
Ahora nos creamos un nuevo paquete llamado paqoperadorcable y una Clase llamada Aplicacion.
Este es el código correspondiente a la Clase Aplicacion del paquete paqoperadorcable
package paqoperadorcable;
import paqtvestandar.Televisor;
import paqtvestandar.TelevisorVirtual;
import paqtvfabricante.TelevisorPlasma;
public class Aplicacion {
public static void main(String[] args) {
TelevisorVirtual tv1 = new TelevisorVirtual();
TelevisorVirtual tv2 = new TelevisorVirtual();
TelevisorPlasma tv3 = new TelevisorPlasma();
TelevisorPlasma tv4 = new TelevisorPlasma();
// Televisor.setCanal(5);
System.out.println("El canal del televisor tv1 es el: " + tv1.getCanal());
System.out.println("El canal del televisor tv3 es el: " + tv3.getCanal());
// tv1.subirCanal();
System.out.println("El canal del televisor tv1 es el: " + tv1.getCanal());
System.out.println("El canal del televisor tv3 es el: " + tv3.getCanal());
}
} |
Como podemos ver todos los televisores expuestos en el escaparate están sintonizados con el canal 15