| Creación de un Televisor estándar |
| Paso 16: Operativa |
La palabra reservada final aplicada a un método
El televisor estándar funciona perfectamente, pero nos hemos olvidado de dos funcionalidades importantes en todo televisor. Estas son el poder encenderlo y apagarlo
- para evitar posibles perdidas de tiempo en el soporte postventa que realizamos a nuestros clientes cuyas aplicaciones heredan de nuestro televisor estándar, hemos creído conveniente que la forma de encender y apagar el televisor sea la misma para todos los televisores que hereden del televisor estándar
- consideramos que la implementación que le hemos dado a estos métodos es más que satisfactoria y equiparable a todos los televisores, y por tanto no nos interesa que otros fabricantes de televisores intenten sobrescribir estos métodos y nos realicen consultas en el supuesto de que sus métodos sobrescritos fallaran
- en el mundo del software hay un patrón de conducta generalizado en los equipos de trabajo cuando algo falla
- " nosotros no hemos tocado nada y estamos seguros que el fallo proviene de las Clases que hemos adquirido de otros departamentos o empresas"
Este es el Diagrama de Clases de diseño con los dos nuevos métodos

- << final >>+encender(): void
- en UML se sabe que un método es final porque añadimos el estereotipo <<final>> delante del método
Esta es la Clase Televisor nuevamente modificada
- añadimos losmétodos encender() y apagar()
- y la variable canal deja de ser static y final
| package paqtvestandar;
public abstract class Televisor {
private int canal;
private int volumen = 5;
public Televisor() {
}
public Televisor(int valorCanal) {
setCanal(valorCanal);
}
public void subirCanal() {
setCanal(canal + 1);
}
public void bajarCanal() {
setCanal(canal - 1);
}
public int getCanal() {
return canal;
}
public void setCanal(int canal) {
if (canal < 0){
this.canal = 0;
}
else {
this.canal = canal;
}
}
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 int getVolumen() {
return volumen;
}
public abstract void usarMenu();
public final void encender(){
System.out.println("Televisor - encender(): estoy encendiendo el televisor");
}
public final void apagar(){
System.out.println("Televisor - apagar(): estoy apagando el televisor");
}
} |
- public final void encender(){
- en Java se sabe que un método es final porque le añadimos la palabra clave final delante de éste
Compilamos la Clase Televisor.
Ahora vamos a forzar un error intentando sobrescribir el método encender() en la Clase TelevisorVirtual. Descomenta dicho método y verás como el compilador se queja
package paqtvestandar;
public class TelevisorVirtual extends Televisor {
private boolean sonido = true;
public void setSonido(boolean valorSonido){
sonido = valorSonido;
}
public boolean isSonido(){
return sonido;
}
public void subirVolumen() {
super.subirVolumen();
if (this.isSonido() == false){
setSonido(true);
}
}
public void bajarVolumen() {
super.bajarVolumen();
if (isSonido() == false){
setSonido(true);
}
}
public void usarMenu(){
System.out.println("TelevisorVirtual - usarMenu(): utilizo el menu");
}
public void encender(){
System.out.println("TelevisorVirtual - encender(): estoy encendiendo el tv");
}
} |
Como podemos ver el compilador se queja diciéndonos que no podemos sobreescribir el método encender() porque éste ya está declarado como final en la Clase Televisor

Ahora comentamos el método encender() de la Clase TelevisorVirtual y compilamos la mencionada Clase.
Y finalmente añadimos la invocación a los métodos encencer() y apagar() en la Clase Aplicacion del paquete paqtvestandar
package paqtvestandar;
public class Aplicacion {
public static void main(String[] args) {
TelevisorVirtual tv = new TelevisorVirtual();
tv.encender();
tv.setCanal(3);
System.out.println("El canal seleccionado es el: " + tv.getCanal());
tv.subirColor();
tv.setSonido(false);
System.out.println("El televisor tiene el sonido: " + tv.isSonido());
tv.subirVolumen();
System.out.println("La posición del volumen es: " + tv.getVolumen());
System.out.println("El televisor tiene el sonido: " + tv.isSonido());
tv.usarMenu();
tv.apagar();
}
} |
Al ejecutar la Clase Aplicacion nos encontramos con la siguiente salida