340
Capítulo 8 Clases y objetos: un análisis más detallado
8.8 Composición
Una clase puede tener referencias a objetos de otras clases como miembros. A dicha capacidad se le conoce como
composición
y algunas veces como
relación “tiene un”
. Por ejemplo, un objeto de la clase
RelojAlarma
necesita
saber la hora actual y la hora en la que se supone sonará su alarma, por lo que es razonable incluir dos referencias
a objetos
Tiempo
como miembros del objeto
RelojAlarma
.
Observación de ingeniería de software 8.9
La composición es una forma de reutilización de software, en donde una clase tiene como miembros referencias a
objetos de otras clases.
Nuestro ejemplo de composición contiene tres clases:
Fecha
(fi gura 8.7),
Empleado
(fi gura 8.8) y
Prue-
baEmpleado
(fi gura 8.9). La clase
Fecha
(fi gura 8.7) declara las variables de instancia
mes
,
dia
y
anio
(líneas 6 a
8) para representar una fecha. El constructor recibe tres parámetros
int
. La línea 14 invoca el método utilitario
comprobarMes
(líneas 23 a 33) para validar el mes; un valor fuera de rango se establece en
1
para mantener un
estado consistente. La línea 15 asume que el valor de
anio
es correcto y no lo valida. La línea 16 invoca al método
utilitario
comprobarDia
(líneas 36 a 52) para validar el valor de
dia
con base en el
mes
y
anio
actuales. Las líneas
42 y 43 determinan si el día es correcto, con base en el número de días en el
mes
específi co. Si el día no es correc-
to, las líneas 46 y 47 determinan si el
mes
es Febrero, el día
29
y el
anio
un año bisiesto. Si las líneas 42 a 48 no
devuelven un valor correcto para
dia
, la línea 51 devuelve
1
para mantener la
Fecha
en un estado consistente.
Observe que las líneas 18 y 19 en el constructor muestran en pantalla la referencia
this
como un objeto
String
.
Como
this
es una referencia al objeto
Fecha
actual, se hace una llamada implícita al método
toString
(líneas
55 a 58) para obtener la representación
String
del objeto.
1
// Fig. 8.7: Fecha.java
2
// Declaración de la clase Fecha.
3
4
public class
Fecha
5
{
6
private int
mes;
// 1-12
7
private int
dia;
// 1-31 con base en el mes
8
private int
anio;
// cualquier año
9
10
// constructor: llama a comprobarMes para confirmar el valor apropiado para el mes;
11
// llama a comprobarDia para confirmar el valor apropiado para el día
12
public
Fecha(
int
elMes,
int
elDia,
int
elAnio )
13
{
14
mes = comprobarMes( elMes );
// valida el mes
15
anio = elAnio;
// pudo validar el año
16
dia = comprobarDia( elDia );
// valida el día
17
18
System.out.printf(
19
"
Constructor de objeto Fecha para la fecha %s\n
"
,
this
);
20
}
// fin del constructor de Fecha
21
22
// método utilitario para confirmar el valor apropiado del mes
23
private int
comprobarMes(
int
mesPrueba )
24
{
25
if
( mesPrueba >
0
&& mesPrueba <=
12
)
// valida el mes
26
return
mesPrueba;
27
else
// mes es inválido
28
{
29
System.out.printf(
30
"
Mes invalido (%d) se establecio en 1.
"
, mesPrueba );
31
return
1
;
// mantiene el objeto en estado consistente
Figura 8.7
| Declaración de la clase
Fecha
. (Parte 1 de 2).
08_MAQ_CAP_08.indd340
4/19/081:23:48AM