| Creación de un Televisor estándar |
| Paso 14: Operativa |
Este es el nuevo diagrama de Clases de diseño con el último cambio

- -canal: int
- en UML sabemos que una variable de Clase es static porque está subrayado
- +setCanal(valorCanal: int): void
- en UML sabemos que un método de Clase es static porque está subrayado
Así es como se ven reflejadas las variables de Clase canal y la variables de instancia volumen en la memoria de nuestro ordenador

- debido a que la variable de instancia volumen no es etática, cada que vez que se crea una instancia ya sea de tipo TelevisorVirtual o TelevisorPlasma se crea una copia de la variable de instancia en en montículo
- por el contrario, debido a que la variable de clase cansl es etática, cada que vez que se crea una instancia ya sea de tipo TelevisorVirtual o TelevisorPlasma no se crea una copia de la variable de instancia en en montículo
- es decir, el valor de la variable de Clase canal se modifica a nivel de Clase
- y debido a esto podemos asegurar que cuando se cambia el valor de la variable de Clase canal, éste se actualiza en todas las instancias de de tipo Televisor
Esta es la Clase Televisor modificada
package paqtvestandar;
public abstract class Televisor {
private static int canal;
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 int getVolumen() {
return volumen;
}
public abstract void usarMenu();
} |
- private static int canal;
- en Java anteponemos la palabra clave static al tipo de dato para indicar que es estático
- public static void setCanal(int valorCanal) {
- en Java anteponemos la palabra clave static a los métodos para indicar que estos son estáticos
Compilamos la Clase Televisor.
Ahora nos vamos a crear una Clase llamada Aplicacion5 que en vez de iterar los diferentes televisores con matrices o vectores para cambiar el canal de todos los televisores, lo hagamos realizando simplemente una llamando a un sólo método.
Este es parte del código fuente de la Clase Aplicacion5 perteneciente al paquete paqtienda
package paqtienda;
import paqtvestandar.Televisor;
import paqtvestandar.TelevisorVirtual;
import paqtvfabricante.TelevisorPlasma;
public class Aplicacion5 {
public static void main(String[] args) {
TelevisorVirtual tv1 = new TelevisorVirtual();
TelevisorVirtual tv2 = new TelevisorVirtual();
TelevisorPlasma tv3 = new TelevisorPlasma();
TelevisorPlasma tv4 = new TelevisorPlasma();
// Cambiar el canal de todas las instancias de tipo Televisor
Televisor....
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());
}
} |
- public static void main(String[] args) {
- la MVJ invoca al método main(...) para poder empezar a ejecutar una aplicación
- a partir de aquí se van creando los diferentes Objetos que interactuarán en la aplicación
- System.out.println("El canal del televisor tv1 es el: " + tv1.getCanal());
System.out.println("El canal del televisor tv3 es el: " + tv3.getCanal());
- comprobamos que dos de los televisores expuestos en el escaparate están sintonizados con el mismo canal
- tv1.subirCanal();
- al subir el canal del televisor virtual tv1, también estamos subiendo automáticamente el canal del resto de televisores
- System.out.println("El canal del televisor tv1 es el: " + tv1.getCanal());
System.out.println("El canal del televisor tv3 es el: " + tv3.getCanal());
- y otra vez comprobamos que dos de los televisores expuestos en el escaparate están sintonizados con el mismo canal
Con una sola invocación al método setCanal(5), todos los televisores estarán mostrando el canal 5 y con una invocación al método subirCanal todos los televisores mostrarán el canal 6 tal y como podemos ver al ejecutar la Clase Aplicacion5
Compara tu código con la solución propuesta
Cuando trabajemos con variables de Clase no nos podemos permitir que haya un solo método que interactúe con una variable de Clase y que este método no sea estático.
Si el mismo código que acabamos de escribir lo tuviéramos que releer de aquí a 6 meses ya sea debido a una amplicación de la aplicación o a un fallo de ésta la siguiente línea de código nos traicionaría
- viendo esta línea uno diría que está cambiando el canal de una instancia de tipo Televisor referenciada por la variable de referencia tv1
- pero nada más lejos de la realidad, de hecho lo que está haciendo este código es subir el canal de todas las instancias de tipo Televisor
Por tanto lo correcto sería que el método subirCanal(...) fuera estático y para dejar claro que estamos subiendo el canal de todos las instancias de tipo Televisor modificaríamos la invocación al método subirCanal(...) de la siguiente forma
- es decir, siempre que queramos modificar el valor de una variable de Clase es altamente aconsejable que invoquemos a los métodos correspondientes a través del nombre de la Clase, en este caso Televisor