| Creación de un Televisor estándar |
| Paso 5: Operativa |
Encapsulación
A través de la Encapsulación se puede controlar que partes de un programa pueden acceder a los miembros (variables de instancia y métodos) de un Objeto
- controlando el acceso se pueden prevenir malas actuaciones sobre los datos
- la Encapsulación se basa en el control de acceso o ámbito.
- para empezar vamos a conocer los ámbitos private y public. Más adelante conoceremos los ámbitos friendly y protected
- public
- puede ser accedido por cualquier parte del programa
- private
- sólo puede ser accedido por otros miembros de su Clase
El hecho de que hasta ahora accediéramos al atributo canal de la instancia de tipo Televisor de esta forma tv.canal = 3; tiene varios inconvenientes. De momento vamos a ver uno de ellos
- no hay validación del valor asignado
- es decir si un usuario del televisor decide que el canal que quiere ver es el -4, no tenemos ningún mecanismo para defendernos y "ya nos han colado un gol"
A la Clase Televisor le tenemos que hacer las siguientes modificaciones
| package paqtvestandar;
public class Televisor {
private int canal;
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 valorCanal) {
if (valorCanal < 0){
canal = 0;
}
else {
canal = valorCanal;
}
}
} |
- private int canal;
- al indicar que el ámbito es private
estamos diciendo que sólo desde dentro de la Clase Televisor se puede acceder al atributo canal
- public Televisor(int valorCanal) {
- no tendríamos un código optimizado si tuviéramos que filtrar los datos en dos sitios distintos.
- por este motivo, en vez de filtrar el dato correspondiente al canal en el Constructor, lo haremos solamente en el método setCanal()
- setCanal(valorCanal);
- invocamos a este método por las razones expuestas anteriormente
- setCanal(canal + 1);
setCanal(canal - 1);
- cuando el usuario baja el canal, se podría dar el caso que llegara al canal 0 y si sigue bajando el canal llegaría al canal -1.
- para evitar esto invocamos al método setCanal(...) pasándole como argumento el resultado de la operación de bajar el canal.
- para seguir una coherencia de código realizamos lo mismo en el caso de que el usuario quisiera subir el canal
- si más adelante nos dijeran que por ejemplo el canal más alto no puede superar el número 99, simprlemente tendríamos que ampliar el filtro en el método setCanal(...)
- public void setCanal(int valorCanal) {
- al tener este método un ámbito public, este método podrá ser llamado
- tanto desde el Constructor de su Clase
- como desde cualquier otra parte del programa que estuviera interesada en conversar con una instancia de tipo Televisor para cambiarle el canal
Ahora compilamos la Clase Televisor y seguidamente abrimos la Clase Aplicacion. Como podemos observar el compilador nos da un error indicándonos que la variable de instancia canal tiene acceso privado y que por consiguiente la Clase Aplicacion no se puede compilar

Para evitar estos errores tenemos que realizar unos pequeños cambios en la Clase Aplicacion
Compara tu código con la solución propuesta