Académique Documents
Professionnel Documents
Culture Documents
Capítulo 8:
El constructor predeterminado
Cuando una clase no tiene un método constructor declarado tendrá uno por defecto y le
asigna a cada atributo un valor predeterminado. Las variables de instancia pueden
inicializarse en el momento en el momento en que sean declaradas dentro del cuerpo de
la clase, del mismo modo en que se haría con una variable local.
Cuando una clase es declarada, esta es presentada como un nuevo tipo en Java. Por
ejemplo:
Las variables de instancia por lo general son declaradas como private. Los datos que
estas manejan muchas veces no son necesarios o del interés del usuario por lo que es
una buena práctica el ocultarlos y al solo ser accesibles mediante métodos, se protegen
de cambios no deseados.
This (también llamada como referencia this) permite acceder a la referencia de cualquier
objeto. En caso de llamarse un método no static para un objeto específico al campo, se
utilizara de manera implícita la palabra clave this para hacer referencia a los atributos y
a otros métodos.
Un constructor puede recibir parámetros con el mismo nombre que los atributos de la
clase pero no se trata de una práctica recomendada. Cuando un método posee una
variable local con el mismo nombre de un campo, se hará referencia a la variable local.
En ese caso, el campo dentro del alcance del método es oculto por la variable local. Sin
embargo, puede usarse la referencia this en forma explícita para hacer referencia a otros
métodos en el objeto actual.
Cada método de la clase utiliza, de manera implícita, a this para determinar el objeto
que manipulará.
Cuando un objeto de una clase tiene una referencia a otro objeto de la misma clase, este
podrá acceder a todos los atributos y métodos del segundo, incluyendo los del tipo
private.
Toda clase debe tener como mínimo un método constructor. Si este no es proporcionado
en la declaración de una clase, el compilador creará un constructor predeterminado que
no recibirá argumentos cuando es invocado. Este método iniciará los atributos con los
valores especificados en sus declaraciones o con los valores predeterminados pero no es
la única tarea que realiza. Un método constructor nunca retorna valores.
8.7 Observaciones acerca de los métodos Establecer y Obtener
Los atributos de tipo private solo pueden ser modificados por los métodos de la clase,
estos métodos por lo general son del tipo public. Los métodos establecer son conocidos
como métodos mutadores al modificar el estado de un objeto (atributos). Los métodos
obtener también son conocidos como métodos de acceso o de consulta.
Si un atributo es declarado como public, cualquier método que cuente con una
referencia a un objeto que posea esa variable de instancia podrá leerla o modificarla. De
ser declarada como private será necesario acudir al método obtener del atributo para
poder leerla y este método puede controlar la información que el usuario recibe y la
manera en que accede a ella. Un método establecer puede controlar los valores que se
le asignaran al atributo y lanzar una excepción de ser necesario. Ambos métodos
restringen el acceso y son buenas prácticas en la ingeniería de software.
Métodos predicados
8.8 Composición
Una clase puede tener referencias a objetos de otras clases como atributos, esto es
llamado como composición y algunas veces como relación tiene un.
Todos los objetos utilizan recursos del sistema, como la memoria. Es necesario contar
con una forma disciplinada de regresarlos al sistema cuando no sean necesarias pues de
lo contrario podría haber fuga de recursos que puede impedir o hacer que sea utilizado
por otros programas. La máquina virtual de Java realiza la recolección de basura de
manera automática para liberar el espacio de memoria que deja de ser ocupado.
Generalmente esto ocurre cuando la JVM ejecuta su recolector de basura.
El recolector de basura hace un llamado al método finalize para que realice las tareas de
preparación para la terminación sobre un objeto poco antes de que el recolector de
basura lo reclame y limpie esa parte de la memoria. El método finalize no recibe
parámetros ni retorna void. Al no saber en qué momento se ejecutara el recoleptor de
basura no es recomendado ejecutar el finaliza.
Cuando se requiere una sola copia de una variable para todos los objetos de la clase se
utiliza un campo static (la variable es conocida como variable de clase). Las variables
static representan información en toda la clase y es compartida por todos los objetos de
la clase. Estas comienzan con la palabra clave static.
Un método static no puede acceder a los miembros no static, esto se debe a que las
variables static pueden ser invocadas independientemente de si se creó o no un objeto de
clase. Para acceder a un método estático debe anteponerse el nombre de la clase y un
punto (.).
Declarar un atributo como final ayuda a hacer el principio del menor privilegio. Es
recomendable hacerlo con las variables que no serán modificadas.
Cada clase en la API de Java está contenida dentro de un paquete que posee un grupo de
clases relacionadas. Estos paquetes son definidos una vez y se pueden importar en
muchos programas. Facilitan la reutilización de código, ayudan a administrar la
complejidad de los componentes de una aplicación y proporcionan una convención para
los nombres de clases únicos.
Una clase debe estar contenida en un paquete para ser reutilizable. Estos son los pasos a
seguir:
El compilador utiliza un objeto especial (cargador de clases) para localizar las clases
que necesita. El cargador de clases empieza buscando las clases estándar de Java que
están incluídas en el JDK. El siguiente paso es buscar los paquetes opcionales. Java
cuenta con un mecanismo de extensión que se permite agregar paquetes nuevos
(opcionales), para fines de desarrollo, y ejecución. De no encontrarse en las ubicaciones
anteriormente mencionados buscara en la ruta de clases. La ruta de clases contiene una
lista de ubicaciones en las que se almacenan las clases. Consisten en una listas de
directorio, también llamadas archivos de ficheros, cada uno separado por un separador
de directorio (le signo de punto y coma en Windows o los dos puntos en Linux). Cada
archivo de fichero contiene archivos individuales con directorios de otros archivos, por
lo general, comprimidos.
Manejo de excepciones
11. 1 Introducción:
Las clases que extienden de throwable (paquete java.lang), directa o indirectamente, son
las únicas que pueden hacer uso de excepciones.
Las excepciones son lanzadas cuando un método encuentra un problema que no puede
solucionar. Esta información es conocida como rastreo de pila y contiene el nombre de
la excepción (java.lang.ArithmeticException) en un mensaje descriptivo, este contiene
el problema que ocurrió y la cadena de llamadas al método en que se dio la excepción,
método por método. Es incluida la ruta de ejecución que llevó a la excepción, método
por método.
Este tipo de manejo de excepciones permite trazar una ruta a seguir en caso de haber
encontrado una excepción. El programa la atrapa y ejecuta las instrucciones que el
programador le ha asignado para manejar la excepción.
Un bloque try consiste en la palabra clave try seguida de un bloque de código , este se
encontrará encerrado entre llaves. El bloque try no incluye la palabra clave try.
Atrapar excepciones
Es necesario que aparezca al menos un bloque catch o un bloque finally justo después
del bloque try. Entre los paréntesis que contienen los parámetros del bloque catch se
específica la excepción que puede procesar el manejador. En caso de ocurrir una
excepción, el primer bloque en ser ejecutado es el que coincide con el tipo de excepción
que ocurrió.
Una excepción no atrapada es ocurre una excepción y no hay un bloque catch que
coincida con ella.
En caso de ocurrir una excepción en un bloque try, este será terminado de inmediato y
el control del programa es transferido al primero de los bloques catch que contenga un
tipo de parámetro que coincida con el tipo de excepción lanzada. Una vez que la
excepción es manejada no se regresa al punto de lanzamiento (el bloque try ha expirado)
y el programa continua su ejecución después del último bloque catch. A esto se le llama
modelo de terminación del manejo de excepciones. En algunos lenguajes el modelo de
reanudación del manejo de excepciones el control se reanuda después del punto de
lanzamiento.
Si en el bloque try no son lanzadas excepciones, los bloques catch son ignorados. El
bloque try y sus respectivos catch y/o finally forman una instrucción try. Cuando un
bloque try es terminado, las variables locales que lo conforman desaparecen. Las
variables locales de un bloque try no son accesibles en sus bloques catch.
Esta cláusula especifica las excepciones que lanza el método. Se encuentra después de
la lista de parámetros y antes del cuerpo. Contiene una lista separada por comas de las
excepciones que serán lanzadas por el método. Estas pueden ser lanzadas mediante
instrucciones en el cuerpo del método o desde el llamado al método.
La clase Throwable posee dos subclases, estas son Exception y Error. La clase
Exception y sus subclases representan situaciones excepcionales que pueden llegar a
ocurrir en un programa de Java y que pueden llegar a ser atrapadas por la aplicación. La
clase Error y sus subclases representan situaciones anormales que pueden ocurrir en la
JVM, estos suelen ocurrir con poca frecuencia y no deben ser atrapados por las
aplicaciones, difícilmente una aplicación puede recuperarse de los errores tipo Error.
Si se escribe un manejador catch para atrapar objetos de excepción, este también podrá
atrapar a todos los objetos de las subclases de dicha clase. Esto permite que el bloque
catch maneje los errores relacionados de manera concisa y permite el procesamiento
polimórfico de las clases excepciones relacionadas.
En caso de que varios bloques catch coincidan con un tipo específico de excepción solo
se hará uso del primer catch.
Es necesario que los programas que obtienen ciertos tipos de recursos deban
devolverlos al sistema en forma explícita porque de lo contrario se dará lo que se
denomina como fuga de recursos. Java realiza de forma automática la recolección de
basura en la memoria que ya no es utilizada por los programas para así evitar que se den
las fugas de memoria. Sin embargo esto no evita que ocurran otros tipos de fugas de
recursos en Java.
El bloque finally es opcional (a veces llamado cláusula finally). En caso de de que sea
usado, este se colocará después del último bloque catch y si este no existe después del
bloque try.
Debido a que un bloque finally casi siempre es ejecutado, puede contener código para
liberar recursos.
Las excepciones vuelven a ser lanzadas cuando un bloque catch, al momento de recibir
una excepción, no puede procesar la excepción, o no puede hacerlo de manera completa.
En el momento en que una excepción vuelve a ser lansada, se difiere el manejo de la
misma (quizás solo una parte) hacia otro bloque catch asociado con una instrucción try
exterior. Para que una excepción pueda volver a ser lanzada es necesario usar la palabra
clave throw acompañada de la referencia al objeto excepción que fue atrapado, esto no
es permitido a través del bloque finally.
En caso de crearse clases que puedan ser utilizadas en sus programas puede ser
conveniente declarar excepciones específicas para posibles problemas.
Las nuevas clases excepción deben extender a una clase excepción existente, esto
permite asegurar que dicha clase utilizará el mecanismo de manejo de excepciones. Una
nueva clase de excepción, generalmente, contiene cuatro constructores, uno sin
argumentos que pasa un objeto String como mensaje de error predeterminado al
constructor de la superclase; uno que recibe un mensaje de error personalizado como un
objeto String y que pasará al constructor de la superclase; uno que recibe un mensaje de
error personalizado y un objeto Throwable (encadena excepciones), y pasa ambos
objetos al constructor de la super clase.
Una poscondicion es verdadera una vez que el método regresa con éxito. Describen las
restricciones en el valor de retorno y en sus posibles efectos secundarios. Deben ser
documentadas para que otros programadores puedan saber lo que se está esperando. Es
necesario verificar que las poscondiciones sean cumplidas si las precondiciones se
cumplen.
11.11 Aserciones
Cuando una clase es depurada e implementada, puede llegar a ser conveniente
establecer condiciones que deban ser verdaderas en un punto específico de un método.A
estas condiciones se les llama aserciones, ayudan a asegurar la validez de un programa
al atrapar los errores potenciales y a identificar posibles errores lógicos durante el
desarrollo. Un ejemplo son las precondiciones y las poscondiciones.
Las aserciones son usadas, principalmente, para depurar e identificar errores lógicos.
Deben ser habilitadas de manera explícita al ejecutar un programa, ya que reducen el
rendimiento y carecen de utilidad para el usuario.
Los errores de tipo AssertionError deben permanecer ocultos para el usuario. Solo
podrán mostrarse en la implementación.
Es común que un bloque try tenga varios bloques catch para manejar diferentes
excepciones. En caso de que los cuerpos de los catch sean idénticos puede usarse la
nueva característica multi-catch de Java SE7 para atrapar dichas excepciones en un solo
manejador catch donde los tipos de excepciones serán separados con una barra vertical.
Generalmente el bloque finally es el que se utiliza para asegurar que los recursos sean
liberados en el bloque try correspondiente sin embargo la opción try con recursos
(nueva en Java SE7) es una alternativa que permite simplificar la escritura de código en
donde se obtienen uno o más recursos, es utilizado en un bloque try y se libera en el
correspondiente bloque finally.