Modularidad en Java Tema 2 Modularidad en Java Programación Orientada a Objetos Modularidad en Java En Java la unidad modular es la clase Una clase es la abstracción de un conjunto de objetos (instancias) Una clase ofrece unos servicios y oculta otros recursos Modularidad en Java Java no separa la especificación y la implementación de los módulos como lo hace Ada. Java permite organizar las clases en paquetes y subpaquetes de forma jerárquica En Java es posible definir objetos interfaz que contengan la declaración de un conjunto de operaciones públicas de una clase. Esta jerarquía se refleja en la forma de almacenamiento en disco a través de directorios Esta interfaz agruparía la especificación de los métodos que exporta un módulo. Es posible definir varias interfaces para una clase. En la interfaz NO se incluyen los métodos estáticos ni el método constructor de la clase. Implementación: definición de una clase Java. Ocultaremos los detalles Ocultación de la información Principio conservador : “A menos que exista una razón importante para que un miembro sea accesible, será declarado privado” java java.lang java.io java.awt Java.awt.peer Ocultación de la información La ocultación de la información en Java se realiza a través de los modificadores de visibilidad Los modificadores de visibilidad se aplican a nivel de clase y a nivel de miembro (atributo o método) 1 Modificadores de Visibilidad (clase) Una clase puede declararse: public: en este caso todas las otras clases la pueden utilizar con la visibilidad a nivel de paquete, esto es, no se puede utilizar fuera del paquete si en un fichero se declara más de una clase, sólo una será pública siendo el resto privadas Modificadores de Visibilidad (atributos y métodos) La visibilidad de las variables miembro (atributos) y los métodos (operaciones) de una clase puede ser: Modificadores de Visibilidad Acceso X Predeterminado protected X X X X public X X X Ocultación de la información El objetivo es ocultar en lo posible los detalles de implementación de las clases permitiendo el acceso sólo a través de los métodos públicos X X Ocultación de la información En Java para conseguir esto: paquete (no se puede acceder desde sus subpaquetes) public: accesibles desde todas las clases private: sólo accesibles desde los métodos de la clase protected: el miembro es accesible desde las clases de su paquete y desde las subclases Clase Subclase Paquete Universal private package (por defecto): sólo accesibles desde su Las variables miembro (atributos) se deben declarar como privadas El acceso a las variables miembro se realizará SÓLO a través de las operaciones públicas Ocultación de la información Usando los modificadores de visibilidad conseguimos: Operaciones públicas de creación, consulta y modificación evitar accesos directos controlar los accesos simplificar el trabajo del programador no tener problemas al cambiar la implementación del paquete mientras no se cambie la interfaz 2 Importación de clases y paquetes Para especificar las clases e incluso paquetes enteros que se utilizan desde una clase se utiliza la cláusula import import import <nombre-paquete> <nombre-paquete> [[ {* {* || <nombre-clase>}] <nombre-clase>}] ;; *: *: se se importan importan todas todas las las clases clases del del paquete paquete <nombre-clase>: <nombre-clase>: sólo sólo se se importa importa la la clase clase referenciada referenciada Una clase puede utilizar las clases públicas de todos los paquetes que se hayan referenciado al principio del fichero Tipos de Módulos (Java) a) b) c) d) Módulos de definición Módulos de servicio Tipos Abstractos de Datos Máquinas Abstractas de Estado b) Módulos de Servicio Ofrecen un servicio Agrupan un conjunto de operaciones Las operaciones de la interfaz se declaran sobre clases no instanciables (abstract y final) Las operaciones son declaradas estáticas (static) Importación de clases y paquetes Para importar una clase: import java.net.URL; public class Ejemplo {...} Para importar todas las clases públicas de un paquete import java.awt.*; Esto no importa las clases incluidas en subpaquetes (por ejemplo , java.awt.event) El paquete java.lang no es necesario importarlo a) Módulos de Definición Declaración de constantes y variables Se declaran sobre clases abstractas (abstract) Se declaran como estáticas (static) Definiciones de constantes (final) abstract static static static static static } class ConfiguracionSistema{ boolean VersionEvaluacion; int diasUtilización; final int maxDias; String ubicacion; String paginaInicial; Ejemplo abstract class UtilidadesString { static String aMayusculas(String S) {...} static String eliminarBlancos(String S) {...} static Boolean esPrefijo (String P, String S) {...} private static int interna(String P, String S) {...} } 3 c) Módulos de Abstracción de Datos Ejemplo public class Coche { private String matricula; Representan TADs private double velocidad; // atributos privados private double velocidadMax; Se definen el tipo de datos y sus operaciones // Método constructor public Coche(String pMatricula, double pVelMax) { La implementación se realiza como una clase Java this.matricula= pMatricula; this.velocidad = 0.0; if (velocidadMax >= 0.0) { this.velocidadMax = pVelMax; } else { velocidadMax = 0.0; } } // (continúa...) Ejemplo d) Máquinas Abstractas de Estado (MAE) // Métodos de consulta public String getMatricula() { return this.matricula; } … // Métodos de asignación public void setMatricula(String pMatric) { this.matricula = pMatric; } … // Otros métodos public void Acelerar(double pVel) { this.velocidad = this.velocidadd + pVel; if (this.velocidad > this.velocidadMax) { this.velocidad = this.velocidadMax; } if (this.velocidad < 0.0) { this.velocidad= 0.0; } A diferencia de los TADs, las operaciones de una MAE se efectúan sobre un único objeto (la clase), no se pueden generar diferentes objetos del mismo tipo En Java definiremos MAEs a través de clases que cumplan los siguientes requisitos: No pueden admitir tener varias instancias Los métodos se aplican sobre el único objeto de la clase Patrón SINGLETON } …} Ejemplo public class Pila { // Atributos private static final int CAPACIDAD=1000; private static int elementos[]; private int tope; // índice de la primera posición libre private static Pila unaPila = new Pila(); // única instancia de la clase // Constructora private Pila() { elementos = new int[CAPACIDAD]; tope = 0; } // Operación de acceso public static Pila obtPila (){ return unaPila; } Librería de clases El lenguaje Java tiene una librería muy amplia La librería se organiza en paquetes En Java los paquetes se utilizan para agrupar clases que tienen “algo” en común Antes de implementar una clase en Java comprobar si ya está hecha Un paquete declara: clases, interfaces, excepciones y errores java.appletjava.awt java.lang Un paquete se puede organizar en subpaquetes (que a su vez son paquetes) java.lang.reflect java.lang 4