Está en la página 1de 136

Tcnicas Avanzadas de Diseo de Software:

Una introduccin a la Prog ramacin Orientada a Ob etos usando U!" # $ava

Autor : $os %& 'lez Serrano (olaboradores: Ang el S)nc*ez Almudena Sierra +sidoro ,ern)n Alberto Pea Santiag o Doblas Alfredo (asado %rancisco -ort)zar

Prlog o
.l /resente te0to surge de varios aos de e0/eriencia docente de los autores en las asignaturas 1 Software Avanzado2 # 1"engua es +nform)ticos23 4ue se im/arten res/ectivamente en el tercer curso de la carrera de +ngenier5a Tcnica de +nform)tica de -estin # en el segundo curso de la carrera +ngenier5a +nform)tica3 en la .scuela Tcnica Su/erior de +ngenier5a +nform)tica de la Universidad 6e# $uan (arlos de !adrid& .l ob etivo de este te0to es la introduccin del /aradigma de la /rogramacin orientada a ob etos3 del diseo basado en /atrones3 del "engua e Unificado de !odelado 7 U!"8 # del lengua e de /rogramacin $ava en su versin 9& (on estas bases se /retende 4ue el lector consiga unos conocimientos tericos en estas materias # a la vez /ueda com/robar su utilidad /r)ctica& .l te0to se /uede leer de manera continua3 /ero tambin se /uede leer como una introduccin a la Programacin Orientada a Ob etos 7si slo se leen los ca/5tulos :3 9 # ;83 o como una introduccin al lengua e $ava 7si slo se leen los ca/5tulos <3 =3 >3 ? # @8& (abe decir 4ue al terminar cada ca/5tulo se /lantean algunos e ercicios 4ue se encuentran resueltos en el ane0o A& 6es/ecto al formato del te0to se *an tomado varias decisiones& Para em/ezar3 cuando se introduce un nuevo conce/to se escribe en neg rita # se aade al glosario 4ue se encuentra en el ane0o A& Adem)s3 debido al car)cter de la materia3 el te0to est) sal/icado de anglicismos # marcas 74ue se *an escrito en cursiva83 de referencias a cdigo en el te0to 74ue se *an escrito en fuente courier8 # de fragmentos de /rogramas 74ue3 tambin en courier3 se *an sombreado8&

Bndice
(a/5tulo : +ntroduccin a la /rog ramacin orientada a ob etos &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& : :&:& (om/le idad del software: origen # tratamiento&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& : :&:&: ,erramientas /ara tratar la com/le idad&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& : :&:&< .volucin de los lengua es de /rogramacin&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& < :&:&= Paradigmas de /rogramacin&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& = :&<& Programacin orientada a ob etos&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& = :&<&: Abstraer&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& > :&<&< .nca/sular&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 9 :&<&= $erar4uizar&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ? :&<&> !odularizar&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C :&<&9 Ti/o&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :: :&<&? (oncurrencia&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& := :&<&@ Persistencia&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& := :&=& "ecturas recomendadas&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :> :&>& . ercicios&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :> (a/5tulo < +ntroduccin al lengua e $ava &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :9

<&:& +ntroduccin&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :9 <&:&: Areve *istoria de $ava&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :9 <&:&< "a m)4uina virtual de $ava&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :? <&:&= (om/iladores de $ava&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :? <&:&> .ntornos de desarrollo /ara $ava&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :? <&:&9 .l /rograma *ola mundo&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :? <&:&? "os comentarios&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :@ <&:&@ $uego de instrucciones&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :; <&<& .0/resiones b)sicas # control de flu o&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :; <&<&: Ti/os /rimitivos&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :; <&<&< (onversiones entre ti/os /rimitivos&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :D <&<&= O/eradores&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& <C <&<&> (ontrol del flu o&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& <: <&=& "as clases&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& <= <&=&: "as /ro/iedades en detalle&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& <9 <&=&< "os mtodos en detalle&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& <@ <&=&= (reacin de ob etos&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& <; <&=&> Destruccin de ob etos&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& <D <&=&9 Alo4ues de inicializacin&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& <D <&=&? "os modificadores de control de acceso a los miembros en detalle&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&=C <&=&@ "os modificadores de uso de los miembros en detalle&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& =C <&=&; !odificadores en la definicin de clases generales&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& =: <&=&D (lases internas&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& =: <&=&:C . em/lo del /arEing&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& =< <&=&:: Definicin de arra#s de ob etos # de ti/os /rimitivos&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& == <&>& "os /a4uetes&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& => <&9& "ecturas recomendadas&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& =9 <&?& . ercicios&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& =9 (a/5tulo = ,erencia # genericidad en $ava &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& =@

=&:& "a *erencia de clases&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& =@ =&:&: ,erencia en clases internas&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& =; =&:&< 6edefinicin de miembros&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& =; =&:&= "a *erencia # los constructores&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& =; =&<& Polimorfismo din)mico&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& =D =&<&: .l casting de referencias a ob etos&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& >: =&=& "as interfaces&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& >< =&>& "a genericidad&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& >> =&>&: (lases e interfaces genricas&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& >> =&>&< !todos con ti/os /arametrizados&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& >@ =&9& (onclusiones&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& >@ =&?& "ecturas recomendadas&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& >@ =&@& . ercicios&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& >@ (a/5tulo > .l /a4uete ava&lang &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& >D

>&:& "a clase Ob ect&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& >D >&:&: "a clase (lass"oader&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& >D >&<& (lases /ara el mane o de cadenas de caracteres&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 9C >&=& "as e0ce/ciones&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 9: >&=&: Ti/os de e0ce/ciones&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 9< >&=&< .l uso /r)ctico de las e0ce/ciones&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 9= >&>& Sobrecarga de los mtodos b)sicos de ob ect&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 99 >&>&: +nterfaz (loneable&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 99 >&>&< "os mtodos e4uals # *as*(ode&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 9? >&>&= +nterfaz (om/arable&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 9@ >&9& "a concurrencia&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 9@ >&9&: "a /alabra reservada s#nc*ronized &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 9; >&9&< (omunicacin entre *ilos&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 9; >&?& "os ti/os enumerados&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 9D >&@& .nvolturas&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ?: >&;& "ecturas recomendadas&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ?< >&D& . ercicios&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ?< (a/5tulo 9 Diseo de (lases &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ?=

9&:& Diseo to/Fdown a/o#ado en U!"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ?= 9&:&: 6elaciones de de/endencia entre ob etos&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ?> 9&:&< 6elaciones de asociacin entre ob etos&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ?@ 9&:&= 6elaciones entre clases&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& @: 9&<& (onclusiones&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& @? 9&=& "ecturas recomendadas&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& @? 9&>& . ercicios&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& @? (a/5tulo ? .ntrada salida en $ava &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& @D

?&:& Streams de b#tes&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& @D ?&<& Streams de caracteres&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;: ?&<&: Streams del sistema&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;= ?&<&< StreamToEenizer # Scanner&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;= ?&=& !ane o de fic*eros&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;> ?&>& "a interfaz Serializable&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;> ?&9& (onclusiones&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;9

?&?& . ercicios&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;9 (a/5tulo @ .str ucturas de datos /redefinidas en $ava &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;@

@&:& (ollection&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;@ @&:&: .l .numSet&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;; @&<& !a/&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;D @&=& +teradores&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& DC @&>& "a clase (ollections&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& DC @&9& .l resto del /a4uete ava&util&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& D: @&?& (onclusiones&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& D: @&@& "ecturas recomendadas&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& D: @&;& . ercicios&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& D: (a/5tulo ; Patrones # /rinci/ios de diseo &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& D=

;&:& Princi/ales Patrones de Diseo&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& D= ;&:&: %)brica Abstracta 7Abstract %actor#8&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& D= ;&:&< Ada/tador o .nvoltorio 7Ada/ter o Gra//er8&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& D9 ;&:&= Decorador 7Decorator8&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& D9 ;&:&> (om/osicin 7(om/osite8&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& D@ ;&:&9 +terador 7+terator8&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& D@ ;&:&? .strategia 7Strateg#8&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& D@ ;&:&@ (omando 7(ommand8&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& D; ;&:&; Observador 7Observer8&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :CC ;&<& Algunos /rinci/ios Htiles en POO&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :CC ;&<&: .l /rinci/io abiertoFcerrado&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :CC ;&<&< .l /rinci/io de "isEov&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C: ;&<&= .l /rinci/io de segregacin de interfaces&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C: ;&<&> !a0imizar el uso de clases inmutables&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C: ;&<&9 Preferir com/osicin frente a *erencia&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C: ;&<&? Princi/io de res/onsabilidad Hnica&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C: ;&<&@ .liminar du/licaciones &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C: ;&<&; Princi/io de inversin de de/endencia&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C: ;&<&D Preferir el /olimorfismo a los blo4ues ifIelse o switc*Icase&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&:C: ;&<&:C (onclusiones&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C< ;&=& "ecturas recomendadas&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C< ;&>& . ercicios&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C< Ane0o A Solucin de los e ercicios &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C9 A&: . ercicios del ca/5tulo :&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C9 A&:&: Solucin del e ercicio :&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C9 A&< . ercicios del ca/5tulo <&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C? A&<&: Solucin del e ercicio :&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C? A&<&< Solucin del e ercicio <&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C? A&<&= Solucin del e ercicio =&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C? A&= . ercicios del ca/5tulo =&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C? A&=&: Solucin del e ercicio :&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C? A&=&< Solucin del e ercicio <&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C@ A&=&= Solucin del e ercicio =&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C@ A&> . ercicios del ca/5tulo >&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C; A&>&: Solucin del e ercicio :&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :C; A&9 . ercicios del ca/5tulo 9&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :CD

A&9&: A&9&< A&9&= A&9&> A&9&9

Solucin del e ercicio :&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :CD Solucin del e ercicio <&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :CD Solucin del e ercicio =&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ::< Solucin del e ercicio >&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ::> Solucin del e ercicio 9&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ::;

A&? . ercicios del ca/5tulo ?&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :<: A&?&: Solucin del e ercicio :&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :<: A&@ . ercicios del ca/5tulo @&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :<= A&@&: Solucin del e ercicio :&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :<= Ane0o A Bndice alfabtico&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :<9

(a/5tulo :

+ntroduccin a la /rog ramacin orientada a ob etos

.n este /rimer ca/5tulo se comienza analizando las caracter5sticas 4ue *acen com/le o el software # las *erramientas 4ue *abitualmente se utilizan /ara enfrentar esa com/le idad& Des/us3 se re/asa la evolucin de los lengua es de /rogramacin a travs del tiem/o3 # se /resentan los /rinci/ales /aradigmas de /rogramacin& %inalmente se analiza el /aradigma de orientacin a ob etos3 describiendo los mecanismos 4ue debe /ro/orcionar un lengua e de /rogramacin orientado a ob etos&

:&:& (om/le idad del software : orig en # tratamiento


.n el desarrollo de un /ro#ecto de software de tamao medio o grande suelen intervenir varias /ersonas 4ue toman mHlti/les decisiones3 tanto en el diseo como en la im/lementacin& Jormalmente3 como resultado se obtiene un con unto de /rogramas # bibliotecas con cientos de variables # miles de l5neas de cdigo& (uando se /roducen errores en el desarrollo de un /ro#ecto de este ti/o3 o cuando el /ro#ecto crece *asta *acerse incom/rensible3 surgen las /reguntas: K4u *acemos malL3 K/or 4u es tan com/le o este sistema o este desarrolloL Para res/onder a estas /reguntas *a# 4ue em/ezar /or ace/tar 4ue la com/le idad es una /ro/iedad in*erente al software # no un accidente debido a una mala gestin o a un mal diseo& SegHn -rad# Aooc*3 l a com/le idad en el software # en su desarrollo se deriva fundamentalmente de los siguientes cuatro elementos:

"a com/le idad del dominio del /roblema&F Un /ro#ecto software siem/re est) sal/icado /or la com/le idad /ro/ia del /roblema 4ue /retende resolver& Por e em/lo3 el desarrollo de un software de contabilidad tiene la com/le idad /ro/ia del desarrollo3 m)s la com/le idad de las normas # del /roceso de contabilidad& "a dificultad de g estionar el /roceso de desar rollo&F (uando el desarrollo software 4ue se realiza tiene miles de l5neas de cdigo3 cientos de fic*eros3 muc*os desarrolladores&&& el /roceso 4ue gestiona todos estos elementos no es trivial& "a fle0ibilidad de las *er ramientas de software &F .sta fle0ibilidad es un obst)culo3 #a 4ue /ermite a los desarrolladores usar elementos mu# b)sicos /ara construir el software desde cero en vez de usar elementos m)s elaborados # /robados construidos /or otros& .ste *ec*o se deriva de la /oca confianza 4ue e0iste en los desarrollos de otras /ersonas3 # de los /roblemas de comunicacin relativos al tras/aso de software& (om/ortamiento im/redecible del software &F .l software /uede verse como un sistema discreto :3 con multitud de variables 4ue definen su estado en cada momento& Un /e4ueo cambio en una de esas variables /uede llevar al sistema a un estado totalmente diferente& .sto /uede verse como una alta sensibilidad al ruido3 es decir3 4ue un /e4ueo error 7ruido8 /uede /rovocar un com/ortamiento totalmente errneo&

:&:&: ,erramientas /ara tratar la com/le idad


.0iste una limitacin en la ca/acidad *umana /ara tratar la com/le idad& .s /or ello 4ue /ara enfrentarnos a ella solemos utilizar tcnicas de an)lisis como: descom/oner3 abstraer # erar4uizar& Descom/oner Descom/oner consiste en dividir sucesivamente un /roblema en /roblemas menores e inde/endientes& (uando se crean sistemas grandes es esencial la descom/osicin /ara /oder abordar el /roblema& Tras la descom/osicin3 cada una de las /artes se trata # refina de manera inde/endiente& "a descom/osicin reduce el riesgo de error cuando se constru#en elementos grandes /or4ue /ermite construir elementos de manera incremental utilizando elementos m)s /e4ueos en los 4ue #a tenemos confianza& Desde el /unto de vista de la /rogramacin se /uede *ablar de dos formas de descom/osicin& "a descom/osicin orientada a algoritmos # la descom/osicin orientada a ob etos&

Descom/osicin alg or5tmica &F .l /roblema se descom/one en tareas m)s sim/les& "uego3 cada tarea se descom/one a su vez otras m)s sim/les # as5 sucesivamente& Por e em/lo3 es el enfo4ue utilizado al *acer la comida 7/rimero /re/araremos los alimentos # luego los coceremosM /ara /re/ararlos /rimero los lim/iaremos # luego los trocearemosM /ara lim/iarlos&&&8&

A)sicamente un autmata de estados&

F:F

(a/5tulo :

+ntroduccin a la /rogramacin orientada a ob etos

Descom/osicin orientada a ob etos &N .l /roblema se descom/one en ob etos de cu#a interaccin surge la solucin& (ada ob eto a su vez se descom/one en m)s ob etos& Por e em/lo3 es el enfo4ue utilizado al construir un coc*e 7un coc*e funciona como resultado de la interaccin del motor3 las ruedas # el c*asisM el motor funciona como resultado de la interaccin de la bater5a3 el carburador # los cilindrosM la bater5a&&&8&

"a descom/osicin orientada a ob etos tiene varias venta as cuando se a/lica a /ro#ectos grandes& Para em/ezar3 facilita una ma#or reusabilidad de mecanismos comunes& Adem)s3 al /ermitir construir ob etos 4ue a su vez agru/an a otros ob etos /rovee de una ma#or econom5a de e0/resin& Se ada/ta me or al cambio /or4ue se basa en formas intermedias estables 4ue se /ueden utilizar de mHlti/les maneras& Por otro lado la descom/osicin algor5tmica a/orta venta as cuando los /roblemas a resolver son /e4ueos3 #a 4ue es mu# sencillo el desarrollo de tareas concretas& Abstraer Para com/render un sistema mu# com/le o las /ersonas solemos ignorar los detalles 4ue nos /arecen /oco significativos # solemos concentrarnos en otros 4ue consideramos esenciales3 constru#endo un modelo sim/lificado del sistema 4ue se conoce como abstraccin& Por e em/lo3 cuando se desea re/resentar en un ma/a los accidentes geogr)ficos de un /a5s se ignora la divisin en /rovincias o regiones de ese /a5s& .s decir3 se *ace abstraccin de la divisin /ol5tica de la su/erficie de ese /a5s& $erar4uizar .sta tcnica de an)lisis nos /ermite ordenar los elementos /resentes en un sistema com/le o& Ordenar los elementos en gru/os nos /ermite descubrir seme anzas # diferencias 4ue nos gu5an luego /ara com/render la com/le idad del sistema& Por e em/lo3 si nos /iden enumerar las /rovincias .s/aolas las citaremos agru/)ndolas /reviamente /or comunidades autnomas&

:&:&< .volucin de los lengua es de /rog ramacin


.l desarrollo de sistemas de software cada vez m)s grandes # com/licados *a influido en la creacin de lengua es de /rogramacin 4ue faciliten tcnicas /ara tratar la com/le idad& .sto a su vez *a /ermitido abordar /roblemas m)s com/le os3 /ara entrar en una es/iral de evolucin 4ue nos trae *asta la actualidad& "a /rimera generacin de lengua es de /rogramacin a/arece entre los aos :D9> # :D9;& .n a4uella /oca a/arecieron %ortran 7%ormula Translator de la mano de $& G& AacEus83 A"-O"3 %low!atic e +P" '& .sta /rimera eta/a se caracteriza /or /rogramas mu# lineales3 con una sola l5nea /rinci/al de e ecucin3 # /or una clara orientacin *acia ingenieros # cient5ficos& .n estos lengua es no e0iste una se/aracin clara entre datos # /rogramas3 # como mecanismo de reutilizacin de cdigo se /ro/one la biblioteca de funciones& .n la segunda generacin 7:D9D N :D?:8 a/arecen %ortran ++ # (obol 7(ommon Ausiness Oriented "anguage8& .ste Hltimo tuvo un alto arraigo en el mundo em/resarial al 4ue iba dirigido& Adem)s3 a/arece "is/ 7"ist Processing creado en el !+T /or $& !c(art*# # otros8 orientado a los /roblemas de inteligencia artificial # 4ue tuvo un gran im/acto en multitud de lengua es /osteriores& .n todos estos lengua es3 aun4ue #a e0iste se/aracin entre datos # /rograma3 el acceso a los datos es desordenado # no se /ro/orcionan mecanismos 4ue /reserven la integridad de los mismos& Utilizando estos lengua es no e0iste ninguna restriccin en cuanto al orden de los datos # adem)s se /uede acceder a ellos directamente desde cual4uier /arte de un /rograma& As53 los cambios en una /arte de un /rograma3 4ue acceda a ciertos datos3 /ueden ocasionar errores en otra /arte del /rograma #a cerrada3 4ue accede a los mismos datos& "gicamente3 esto da lugar a 4ue los /rogramas de cierta com/le idad desarrollados con estos lengua es sean mu# inestables # dif5cilmente /uedan crecer& "a tercera generacin 7:D?< N :D@98 es mu# /rol5fica& .ntre la multitud de lengua es 4ue a/arecen /odemos destacar Pascal3 ( # Simula& .n esta eta/a a/arecen conce/tos como el de /rogramacin estructurada # el de abstraccin de datos& "a /rogramacin estructurada se basa en un teorema de Di Estra 4ue demuestra 4ue cual4uier /rograma de ordenador /uede escribirse con un lengua e 4ue /ermita la e ecucin secuencial de instrucciones3 la instruccin condicional # la realizacin de bucles de instrucciones& Por otro lado3 las abstracciones de datos consisten en la definicin de ti/os com/le os de datos # su asociacin a o/eradores /ara tratarlos& .stas abstracciones /ermiten 4ue se /uedan abordar /rogramas m)s com/le os& Sin embargo3 estos lengua es aHn no formalizan mecanismos de /roteccin adecuados /ara evitar violaciones en los /rotocolos de acceso a los datos& Tam/oco aaden ningHn mecanismo de reutilizacin de cdigo distinto a las bibliotecas de funciones& .n la eta/a 4ue com/rende desde el ao :D@? *asta :D;C los lengua es de la eta/a anterior evolucionan # se estandarizan& A/arecen adem)s lengua es funcionales como los de la familia !"3 # lengua es lgicos como Prolog& .n las dcadas de :D;C # :DDC a/arecen los lengua es orientados a ob etos como SmallTalE3 (OO # $ava& .stos lengua es est)n es/ecialmente diseados /ara ada/tarse a la descom/osicin orientada a ob etos& Para ello3 e0isten mecanismos 4ue /ermiten restringir el acceso a los datos 4ue forman /arte de los ob etos& .s res/onsabilidad de cada ob eto el mantenimiento de sus datos3 # el resto de ob etos 4ue interaccionan con l lo *ace a travs de una interfaz bien definida& Tambin a/arece en estos lengua es el mecanismo de *erencia 4ue /ermite la reutilizacin de cdigo de una manera controlada& F<F

Disear # Programar todo es em/ezar (asi todos los lengua es evolucionan desde sus or5genes& Por e em/lo3 las versiones m)s actuales de (obol3 %ortran # Pascal incor/oran caracter5sticas de orientacin a ob etos&

:&:&= Paradigmas de /rog ramacin


Un /aradigma de /rogramacin es un modelo conce/tual /ara desarrollar /rogramas& .l uso de un /aradigma se refuerza /or el lengua e 4ue se esco a /ara realizar un /rograma concreto3 aun4ue en general3 con ma#or o menor dificultad3 se /uede usar cual4uier lengua e de /rogramacin /ara seguir cual4uier /aradigma& -rad# Aooc* cita diferentes /aradigmas:

Orientado al /rocedimiento&F Pue se e0/resa de manera im/erativa en forma de algoritmos& Por e em/lo ( # %ortran& Orientado a funciones&F Se basa en el conce/to matem)tico de funcin # se e0/resa de manera declarativa& Por e em/lo "is/3 S!"3 ,o/e3 ,ascEel& Orientado a la lgica&F Pue se e0/resa /or metas en forma de c)lculo de /redicados& Utilizan reglas e inferencia lgica& Por e em/lo Prolog& Orientado a ob etos&F Se e0/resa en forma de relaciones entre ob etos # res/onsabilidades de cada uno& Por e em/lo SmallTalE o $ava&

.sta clasificacin no es estanca3 algunos lengua es /ertenecen a varios /aradigmas& .0isten /aradigmas m)s generales3 como el /aradigma im/erativo o el estr ucturado 3 4ue engloban a otros& Adem)s3 continuamente a/arecen nuevos /aradigmas3 como la orientacin a as/ectos 4ue com/lementa a la Programacin Orientada a Ob etos fomentando la se/aracin de conce/tos& (ada uno de estos /aradigmas tiene ciertas venta as& As53 el /aradigma /rocedimental a/orta venta as cuando son tareas sencillas 4ue se /ueden describir con unos /ocos /asos3 o cuando es im/ortante o/timizar la velocidad de e ecucin& .l uso del /aradigma orientado a la lgica facilita la im/lementacin de sistemas e0/ertos en los 4ue se deba mane ar una base de conocimiento& .l /aradigma funcional /ermite construir /rogramas concisos3 f)ciles de /robar # /aralelizar3 lo cual es mu# adecuado /ara la /rueba matem)tica de algoritmos # /ara /rogramas en los 4ue se re4uiera un alto grado de fiabilidad& .l /aradigma de Programacin Orientada a Ob etos est) demostrando su utilidad en una am/lia variedad de /roblemas 7interfaces gr)ficas3 simuladores3 a/licaciones ofim)ticas3 uegos&&&8& Adem)s3 est) demostrando 4ue /uede ser un marco de alto nivel ideal /ara integrar sistemas desarrollados siguiendo diferentes /aradigmas&

:&<& Prog ramacin orientada a ob etos


Antes de *ablar de Programacin Orientada a Ob etos definiremos 4u es un ob eto& Un ob eto es algo a lo 4ue se le /uede enviar mensa es # 4ue /uede res/onder a los mismos # 4ue tiene un estado3 un com/or tamiento bien definido # una identidad& .l estado de un ob eto est) definido /or el valor de ciertas variables internas al ob eto& .ste estado /uede cambiar de/endiendo de los mensa es 4ue reciba desde el e0terior o de un cambio interno al /ro/io ob eto& .l com/ortamiento de un ob eto var5a en funcin del estado en el 4ue se encuentra3 # se /ercibe /or los valores 4ue devuelve ante los mensa es 4ue recibe # /or los cambios 4ue /roduce en los ob etos con los 4ue se relaciona& %inalmente3 la identidad de un ob eto es a4uello 4ue lo *ace distinguible de otros ob etos& "a Programacin Orientada a Ob etos es un mtodo de desarrollo en el cual los /rogramas se organizan como colecciones de ob etos 4ue coo/eran /ara resolver un /roblema& .n general los ob etos /ueden corres/onderse a entidades del mundo real 7como un coc*e o un gato83 a acciones 7como saltar o realizar una transaccin bancaria8 o a /rocesos 7como el vuelo o el a/rendiza e8& "a Programacin Orientada a Ob etos se basa en el !odelo de Ob etos & .ste modelo se fundamenta en el uso de @ ca/acidades3 > de las cuales 4ue se consideran /rinci/ales # = secundarias& "os lengua es de /rogramacin orientados a ob etos se caracterizan /or4ue /ro/orcionan mecanismos 4ue dan so/orte a estas ca/acidades& "as ca/acidades /rinci/ales son:

Abstraer& .nca/sular& !odularizar& $erar4uizar& Ti/o& (oncurrencia&

"as ca/acidades secundarias son:


F =F

(a/5tulo :

+ntroduccin a la /rogramacin orientada a ob etos Persistencia&

A lo largo de las e0/licaciones 4ue siguen # a lo largo del resto de temas se utilizar) el "engua e Unificado de !odelado 7Unified !odeling "anguage F U!" 8 /ara re/resentar gr)ficamente los e em/los 4ue se va#an /ro/oniendo& U!" es un lengua e gr)fico /ara visualizar3 es/ecificar3 construir # documentar los artefactos de un sistema software orientado a ob etos& "a notacin U!" se ir) introduciendo de manera gradual segHn se va#a necesitando& .n los siguientes a/artados se describen m)s detalladamente las ca/acidades /rinci/ales antes mencionadas&

:&<&: Abstraer
"os *umanos *emos desarrollado la ca/acidad de abstraccin /ara tratar la com/le idad& Al analizar un /roblema ignoramos gran /arte de los detalles3 # solo mane amos las ideas generales de un modelo sim/lificado de ese /roblema& Por e em/lo al estudiar cmo conducir un coc*e nos /odemos centrar en sus instrumentos 7el volante3 las marc*as&&&8 # olvidarnos de as/ectos mec)nicos 7como el di)metro de los /istones o la aleacin usada en el cigQeal8& Abstraer es la ca/acidad 4ue /ermite distinguir a4uellas caracter5sticas fundamentales de un ob eto 4ue lo *acen diferente del resto3 # 4ue /ro/orcionan l5mites conce/tuales bien definidos relativos a la /ers/ectiva del 4ue lo visualiza& "a abstraccin surge de reconocer las similitudes entre ob etos3 situaciones o /rocesos en el mundo real3 # la decisin de concentrarse en esas similitudes e ignorar las diferencias& As53 una abstraccin se focaliza sobre una /osible vista3 a#udando a se/arar el com/ortamiento esencial de un ob eto de su im/lementacin& 'olviendo al e em/lo de los ma/as3 un ma/a /ol5tico se focaliza en la divisin en regiones de la su/erficie de un /a5sM si el ma/a es f5sico se focaliza en los as/ectos geogr)ficos de la misma su/erficie& "os lengua es de /rogramacin orientados a ob etos facilitan abstraer gracias a 4ue /ermiten definir interfaces comunes /ara comunicarse con clases de ob etos& .stas interfaces est)n com/uestas /or los mtodos3 4ue son funciones 4ue /ueden a/licarse sobre el ob eto # 4ue /ueden verse como los mensa es 4ue es /osible enviar al ob eto& Jormalmente un ob eto /uede tener varias interfaces& .n la %igura : se /uede ver cmo el coc*e tiene distintas interfaces /ara comunicarse con los ob etos 4ue lo forman& Por e em/lo3 el volante3 la /alanca de cambios o los /edales&

%igura :&F "as interfaces nos /ermiten comunicarnos con los ob etos3 nos /ermiten concentrarnos en ciertos as/ectos # obviar el resto&

As53 en algunos lengua es de /rogramacin orientados a ob etos 7como (OO o $ava8 a/arece el conce/to de clase de ob etos o sim/lemente clase 4ue une las interfaces definidas en el /roceso de abstraccin con la im/lementacin del com/ortamiento deseado& Otros lengua es 7como SmallTalE o $avaScri/t8 no /ermiten definir clases de ob etos3 sino 4ue se basan en el conce/to de /rototi/os 7todo ob eto es un /rototi/o a /artir del cual se /uede crear otro8& "as clases aaden a la definicin de mtodos la im/lementacin de los mismos& Tambin aaden las /ro/iedades3 4ue son variables internas al ob eto o a la clase 4ue definen el estado del ob eto& As53 los ob etos 4ue *a# en un sistema siem/re /ertenecen a una determinada clase3 la cual define su com/ortamiento3 la forma de interaccionar con l # sus /osibles estados& !todos # /ro/iedades tambin se conocen como miembros& .ntre los ob etos se crea un com/ortamiento clienteIser vidor 3 de forma 4ue el cliente conoce el com/ortamiento de una abstraccin servidora analizando los servicios 4ue /resta& .stos servicios forman un contrato 4ue establece las res/onsabilidades de un ob eto res/ecto a las o/eraciones 4ue /uede realizar& .l orden en 4ue se deben a/licar las o/eraciones se conoce como /rotocolo3 # /ueden im/licar /recondiciones # /oscondiciones 4ue deben ser satisfec*as& (uando al enviar un mensa e a un ob eto se cum/len las /recondiciones /ero el ob eto no /uede cum/lir las /oscondiciones se /roduce una e0ce/cin& "os lengua es orientados a ob etos tambin suelen dar so/orte al mane o de e0ce/ciones&

F>F

Disear # Programar todo es em/ezar Al estudiar un /roblema solemos fi ar un nivel de abstraccin3 # en l buscamos las abstracciones /resentes& Jo es frecuente mezclar elementos 4ue est)n a diferente nivel de abstraccin al analizar un /roblema debido a 4ue genera confusin& Por e em/lo3 la estructura de un coc*e /resenta varias abstracciones a un nivel alto de abstraccin: motor3 ruedas3 c*asis3 /uertas3 volante& Dentro del motor3 a diferente nivel de abstraccin encontramos: cilindros3 carburador3 radiador3 etc& A un nivel de abstraccin menor3 dentro de un carburador encontramos: tornillos3 muelles3 arandelas&&& Otro e em/lo de niveles de abstraccin /odemos encontrarlo en la estructura de las /lantas& A un nivel alto de abstraccin est)n la ra5z3 el tallo # las *o as& Se a/recia 4ue estos elementos tienen formas de interactuar bien definidas3 # 4ue no *a# /artes centrales 4ue coordinen su funcionamiento& De la interaccin entre estas abstracciones surge un com/ortamiento 4ue es ma#or 4ue el com/ortamiento de sus /artes& A la *ora de definir abstracciones es im/ortante determinar la granularidad de los ob etos3 es decir3 determinar 4u son ob etos # 4u son /artes de un ob eto& Para a#udar a crear abstracciones se /uede medir la calidad de una abstraccin revisando los siguientes as/ectos:

Aco/lamiento&F !inimizar el grado de asociacin entre diferentes abstracciones& (o*esin&F !a0imizar el grado de asociacin dentro de una abstraccin& Suficiencia # com/letitud &F Pue tenga las caracter5sticas /recisas /ara /ermitir un funcionamiento eficiente # com/leto& Primitividad &F "as o/eraciones de una abstraccin deben ser lo m)s b)sicas /osibles&

Sin embargo3 debe tenerse en cuenta 4ue encontrar buenas abstracciones en un /roblema no es una ciencia e0acta& Jotacin U!" .n U!" las clases se re/resentan en los Diag ramas .st)ticos de (lases mediante rect)ngulos 7ver %igura >8& .n el interior de cada rect)ngulo se indican3 se/arados /or l5neas *orizontales3 el nombre de la clase3 las /ro/iedades # los mtodos& "as interfaces se re/resentan mediante los mismos rect)ngulos3 con la salvedad de 4ue en el nombre se ante/one la /alabra interfaz3 # de 4ue no se de a lugar /ara las /ro/iedades #a 4ue no tienen 7ver %igura <8&

%igura <&F . em/lo de la clase Coche # de la interfaz Automvil&

:&<&< .nca/sular
.nca/sular es la ca/acidad 4ue /ermite mantener oculta la im/lementacin de una abstraccin /ara los usuarios de la misma& .l ob etivo de enca/sular es la ocultacin de la im/lementacin3 /ara 4ue ninguna /arte de un sistema com/le o de/enda de cmo se *a im/lementado otra /arte&

F 9F

(a/5tulo :

+ntroduccin a la /rogramacin orientada a ob etos

%igura =&F "a enca/sulacin oculta los detalles de im/lementacin de una abstraccin&

"a abstraccin # la enca/sulacin son com/lementarias& !ientras 4ue la /rimera se centra en el com/ortamiento observable3 la segunda lo *ace en cmo se constru#e ese com/ortamiento& As53 la abstraccin define la interfaz # la enca/sulacin se encarga de los detalles de la im/lementacin& Para forzar esta Htil se/aracin entre abstraccin e im/lementacin3 entre la definicin de la interfaz # la im/lementacin de una abstraccin se dice 4ue e0iste la bar rera de la abstraccin & "a /rinci/al venta a de la enca/sulacin est) en 4ue facilita 4ue al cambiar el funcionamiento interno de una abstraccin3 los clientes de la misma no lo noten& Para facilitar la ocultacin los lengua es orientados a ob etos ofrecen ciertos mecanismos3 como los modificadores de visibilidad /ublic 3 /rivate # /rotected de (OO # $ava& .stos modificadores /ermiten 4ue se /ueda acceder libremente a unas /artes de la interfaz 74ue son /Hblicas83 acceder con restricciones a otras /artes 74ue son /rotegidas83 # 4ue se /ro*5ba el acceso a otras /artes 74ue son /rivadas8& Jotacin U!" "os Diagramas .st)ticos de (lases se /ueden adornar con los modificadores de visibilidad& Rstos se dis/onen /recediendo a los mtodos # a las /ro/iedades3 mediante los caracteres O 3 F # S /ara /Hblico3 /rivado # /rotegido res/ectivamente&

%igura >&F 6e/resentacin de una clase en U!"&

:&<&= $erar4uizar
.n cual4uier /roblema sim/le se encuentran m)s abstracciones de las 4ue una /ersona /uede usar a la vez en un razonamiento& "os con untos de abstracciones a menudo forman erar4u5as # su identificacin /ermite sim/lificar la com/rensin del /roblema& $erar4uizar es una ca/acidad 4ue /ermite ordenar abstracciones& Su /rinci/al venta a consiste en 4ue la organizacin de las abstracciones de un sistema en una erar4u5a /ermite detectar estructuras # com/ortamientos comunes # con ello sim/lificar el desarrollo& .n el es4uema de Programacin Orientada a Ob etos se definen dos formas b)sicas de erar4u5as:

$erar4u5as entre clases e interfaces& $erar4u5as entre ob etos&

F?F

Disear # Programar todo es em/ezar $erar4u5a entre clases e interfaces Definen relaciones del ti/o 1tal abstraccin es una abstraccin cual2& .stas relaciones se denominan relaciones de *erencia # cum/len 4ue los elementos de los 4ue se *ereda son m)s generales3 mientras 4ue los 4ue elementos 4ue *eredan est)n m)s es/ecializados& Un e em/lo lo /odr5amos encontrar en la clase Coche # en una clase derivada Deportivo& "os ob etos de la clase Deportivo com/artir5an el com/ortamiento de los de la clase Coche3 /ero adem)s los ob etos de la clase Deportivo aadir5an ciertas interfaces # com/ortamientos nuevos& "a clase Deportivo ser5a una es/ecializacin de la clase Coche& Por e em/lo3 los ob etos de la clase Deportivo /odr5an tener la /ro/iedad turbo3 /ero un Coche en general no tendr5a /or 4u tener turbo& Adem)s3 la clase Deportivo /odr5a redefinir el mtodo acelerar3 /ara dotarlo de diferentes caracter5sticas mediante una im/lementacin diferente& Obsrvese 4ue todo Deportivo ser5a un Coche3 /ero no todo Coche ser5a un Deportivo& "os lengua es de /rogramacin orientados a ob etos deben dar so/orte a la erar4u5a de clases e interfaces& Para ello deben /ro/orcionar mecanismos /ara definir clases e interfaces nuevas o 4ue *ereden de otras #a e0istentes& Por eso se /uede *ablar de *erencia entre interfaces3 de *erencia entre clase e interfaz # de *erencia entre clases&

,erencia entre interfaces&F Ta se *a dic*o 4ue las interfaces no contienen im/lementacin ni /ro/iedades3 slo definen mtodos& Por eso3 cuando una interfaz *ereda de otra lo 4ue obtiene es /recisamente la declaracin de sus mtodos& ,erencia entre clase e interfaz&F (uando una clase *ereda de una interfaz se dice 4ue tal clase im/lementa o 4ue cum/le tal interfaz& Juevamente3 como las interfaces no contienen im/lementacin slo se *ereda la definicin de mtodos3 siendo res/onsabilidad de la clase 4ue *ereda im/lementar el com/ortamiento& ,erencia entre clases&F "a *erencia de clases se /roduce cuando una clase *ereda tanto la interfaz como el com/ortamiento de otra clase& Por e em/lo3 cuando en $ava se define una clase B 4ue *ereda de otra A3 la clase B tiene todos los mtodos # todas las /ro/iedades 4ue en A se definieron como /Hblicas o /rotegidas& Adem)s3 cual4uier llamada a un mtodo M de la clase B se com/ortar) e0actamente como lo *ar5a sobre un ob eto de la clase A3 salvo 4ue e0/l5citamente se modifi4ue su com/ortamiento en B&

Tras *eredar siem/re se /ueden aadir nuevos mtodos a la interfaz 4ue *ereda /ara es/ecializarla en algHn as/ecto& Adem)s3 en el caso de 4ue la 4ue *ereda sea una clase3 # no una interfaz3 tambin se /ueden aadir nuevas /ro/iedades& Por otro lado3 la *erencia /uede clasificarse en dos gru/os atendiendo a la forma de las erar4u5as: *erencia sim/le # *erencia mHlti/le&

,erencia sim/le &F (uando un elemento slo *ereda de una erar4u5a& .n la /r)ctica esto ocurre cuando una clase o interfaz *ereda slo de otra # no lo *ace de varias simult)neamente& ,erencia mHlti/le &F (uando una clase o interfaz *ereda simult)neamente de varias erar4u5as diferentes&

"a *erencia mHlti/le de clases da lugar a lo 4ue se conoce como el /roblema de la ambigQedad& .ste /roblema a/arece cuando una clase *ereda de varias 4ue tienen un mtodo de idntico nombre # /ar)metros /ero 4ue tiene definidos com/ortamientos diferentes en cada clase& .l e em/lo *abitual de ambigQedad se conoce como el /roblema del diamante 7ver %igura 98& .n l *a# una clase A3 de la 4ue *eredan dos clases B # C& %inalmente e0iste una clase D 4ue *ereda simult)neamente de B # C& Algunos de los interrogantes 4ue /lantea esta situacin son:

Si e0iste un mtodo en A 4ue se im/lementa de forma diferente en B # en C3 Ka 4u mtodo se invoca cuando se *ace desde DL (uando se invoca al constructor de D # este a su vez invoca recursivamente a los constructores de las clases de las 4ue deriva: Kcu)ntas veces se invoca al constructor de la clase A3 # en 4u orden se invocan los constructores de B # C?

"as res/uestas a estas /reguntas resultan en es4uemas de e ecucin com/licados 4ue /ueden sor/render f)cilmente al /rogramador& Por otro lado3 la *erencia mHlti/le de interfaz no /resenta /roblemas de ambigQedad3 /ues la im/lementacin slo est) detallada en las clases # su uso resulta menos com/le o aun4ue la reutilizacin de cdigo es menor& .s /or todo esto 4ue en algunos lengua es 7como $ava8 se *a decidido no dar so/orte a la *erencia mHlti/le de clases&

F @F

(a/5tulo :

+ntroduccin a la /rogramacin orientada a ob etos

%igura 9&F Problema del diamante&

,erencia .ntre interfaces .ntre clase e interfaz .ntre clases

Sim/le S5 S5 S5
%igura ?&F 6elaciones de *erencia so/ortadas /or $ava&

!Hlti/le S5 S5 Jo

.n cierto sentido la *erencia de clases /uede com/rometer la enca/sulacin3 /ues /ara *eredar se deben conocer detalles de la clase /adre& .ste *ec*o crea una com/le idad 4ue normalmente debe evitarse& Por ello se recomienda en general el uso e0clusivo de la *erencia de interfaz frente a otros ti/os de *erencia& $erar4u5a entre ob etos "as erar4u5as entre ob etos se /ueden clasificar en < ti/os de relaciones: relaciones de asociacin # relaciones de de/endencia& "as relaciones de asociacin establecen relaciones estructurales entre ob etos de forma 4ue se establece una cone0in entre ellos& %undamentalmente3 este ti/o de relaciones /ermite construir ob etos mediante la asociacin de otros ob etos menores& Un e em/lo lo /odemos encontrar en la relacin entre los ob etos de la clase Coche # los ob etos de la clase Rueda3 si definimos 4ue un ob eto de la clase Coche /osee cuatro ob etos de la clase Rueda& "os lengua es orientados a ob etos facilitan las relaciones de asociacin /ermitiendo 4ue cual4uier clase /ueda se /ueda utilizar /ara definir una /ro/iedad dentro otra clase& "as relaciones de de/endencia dan lugar a relaciones del ti/o 1tal ob eto usa tal otro ob eto2 /or lo 4ue tambin se conocen como relaciones de uso& .stas relaciones se distinguen de las de asociacin /or4ue el )mbito # el tiem/o de uso de un ob eto desde otro es m)s limitado& "os lengua es orientados a ob etos facilitan las relaciones de de/endencia /ermitiendo 4ue un mtodo /ueda utilizar un ob eto de manera local& Jotacin U!" .n U!" las relaciones entre clases se re/resentan en los Diagramas .st)ticos de (lases mediante l5neas 4ue unen las clases&

F;F

Disear # Programar todo es em/ezar

%igura @&F "as clases D # E derivan de la B& A su vez B # C derivan de A& "a clase C adem)s im/lementa la interfaz F&

.n el caso de la *erencia la relacin se re/resenta mediante una l5nea entre las ca as corres/ondientes a las clases involucradas en la relacin& Dic*a l5nea termina en una flec*a *ueca 4ue a/unta a la clase de la 4ue se *ereda& Si la *erencia es de interfaz3 la l5nea es /unteada 7ver %igura @8& Si la clase B *ereda de A se dice 4ue A es la su/erclase de B& Tambin se suele decir 4ue A es la clase /adre de B3 4ue B es una clase derivada de A3 o 4ue B es una clase *i a de A& Adem)s3 se *abla de 4ue una clase est) a un nivel de abstraccin ma#or cuanto m)s alta est) en una erar4u5a de clases& As53 la clase m)s general en una erar4u5a se conoce como clase base& Por e em/lo3 en la %igura @ B esta en un nivel de abstraccin ma#or 4ue D # E3 siendo base de ellas3 # la clase A es base de B3 C3 D # E& Por otro lado3 las relaciones de asociacin entre ob etos se re/resentan mediante l5neas sim/les 4ue unen las ca as de las clases& Sobre estas l5neas se /ueden indicar las cardinalidad es3 es decir3 las /ro/orciones en las 4ue intervienen los elementos de la asociacin 7ver %iguras ; # D8& Obsrvese 4ue las relaciones de asociacin tambin se /ueden re/resentar como /ro/iedades& Suele *acerse as5 cuando el diseo de una de las clases de la asociacin no tiene im/ortancia en ese conte0to& .n estos casos3 el nombre del ob eto menor se aade como una /ro/iedad de la clase 4ue se est) e0/licando& Por e em/lo3 en la clase Coche de la %igura D3 e0iste una asociacin entre la clase Coche # la clase Texto3 /ero se considera de menos im/ortancia 4ue la asociacin entre Coche # Rueda3 4uiz)s /or4ue la clase Texto es mu# comHn3 # /or ello se /resenta de manera abreviada& %inalmente3 las relaciones de uso se re/resentan mediante l5neas /unteadas con /unta de flec*a3 indicando el sentido de la de/endencia&
A 1 * B

%igura ;&F .sta figura /resenta 4ue cada ob eto de la clase A /uede estar asociado a varios elementos de la clase A& T cada elemento de la clase B slo est) asociado a un elemento de la clase A&
Coche -matricula : Texto 1 4 Rueda

%igura D&F . em/lo en el 4ue los ob etos de la clase Coche se relacionan con > elementos de la clase Rueda # con uno de la clase Texto3 aun4ue a esta Hltima asociacin se le concede menor im/ortancia& Adem)s3 los elementos de la clase Rueda se asocian con uno de la clase Coche&

%igura :C&F "a clase A usa a la clase A&

F DF

(a/5tulo :

+ntroduccin a la /rogramacin orientada a ob etos

Tambin se suelen utilizar diagramas 4ue /resentan instancias de ob etos mediante ca as # las relaciones 4ue *a# entre ellos en un momento de la e ecucin mediante l5neas& .stos diagramas se denominan Diag ramas de +nstancias & .n el interior de las ca as se /resenta el nombre de la clase /recedida /or el car)cter de dos /untos& O/cionalmente se /uede /resentar el nombre de la instancia3 en cu#o caso debe a/arecer subra#ado # antes del nombre de la clase& %inalmente3 ba o el nombre de la clase /uede /resentarse el valor de la /ro/iedades de la clase /ara esa instancia&

%igura ::&F Diagrama de +nstancias&

:&<&> !odularizar
!odularizar es la ca/acidad 4ue /ermite dividir un /rograma en agru/aciones lgicas de sentencias& A estas agru/aciones se las llama mdulos& "as venta as 4ue ofrece la modularidad son:

%acilidad de mantenimiento3 diseo # revisin& Al dividir el /rograma se facilita 4ue varias /ersonas /ueden desarrollar de manera simult)nea e inde/endiente con untos dis untos de mdulos& Aumento de la velocidad de com/ilacin& "os com/iladores suelen com/ilar /or mdulos& .sto significa 4ue el cambio de un mdulo slo im/lica la recom/ilacin del mdulo # de los 4ue de/endan de l3 /ero no la del total de mdulos& !e ora en la organizacin # en la reusabilidad3 #a 4ue es m)s f)cil localizar las abstracciones similares si se encuentran agru/adas de una manera lgica& !a0imizar la co*erencia3 es decir3 se deben agru/ar en un mismo mdulo las abstracciones relacionadas lgicamente& !inimizar las de/endencias entre mdulos3 es decir3 4ue /ara com/ilar un mdulo no se necesite com/ilar muc*os otros& (ontrolar el tamao de los mdulos & !dulos /e4ueos aumentan la desorganizacin3 mdulos mu# grandes son menos mane ables # aumentan los tiem/os de com/ilacin&

A la *ora de disear los mdulos debe tenerse en cuenta:


.n (OO # en $ava el conce/to de mdulo encuentra so/orte a varios niveles& Al menor nivel cada mdulo se corres/onde a un fic*ero& As53 los fic*eros se /ueden escribir # com/ilar de manera se/arada& "as bibliotecas a/ortan un segundo nivel de modularidad a (OO& !ientras3 en lengua es como $ava3 se *a creado el conce/to de /a4uete 4ue /ermite un nHmero ilimitado de niveles de modularidad& Tambin suele utilizarse el conce/to de com/onente # de /rograma como mdulos 4ue tienen una funcionalidad com/leta e inde/endiente& Jotacin U!" .n U!" los /a4uetes se re/resentan en los Diag ramas de Pa4uetes mediante unos rect)ngulos 4ue se aseme an a car/etas& .stas car/etas se eti4uetan con el nombre del /a4uete& "os com/onentes # los /rogramas se re/resentan utilizando unas ca as decoradas con dos ca as en su interior 7ver %igura :<8& Obsrvese 4ue entre /a4uetes se /ueden dar relaciones de asociacin # de/endencia&

F :C F

Disear # Programar todo es em/ezar

%igura :<&F .l /a4uete D de/ende del /a4uete E3 # el com/onente A.EXE de/ende del com/onente B.D # del /a4uete D& Por otro lado3 los com/onentes A.EXE # B.D est)n contenidos en el /a4uete C 4ue igual 4ue F est) contenido en el /a4uete E&

:&<&9 Ti/o
Un ti/o< es una caracterizacin /recisa asociada a un con unto de ob etos& .n Programacin Orientada a Ob etos3 los ob etos 4ue com/arten una misma interfaz se dice 4ue tienen el mismo ti/o& Tambin se dice 4ue el ti/o de un ob eto B deriva del de otro A cuando la interfaz de B es un su/ercon unto de la de A& "a asociacin del ti/o a un ob eto se conoce como ti/ado& .l ti/ado refuerza las decisiones de diseo3 im/idiendo 4ue se confundan abstracciones diferentes # dificultando 4ue /uedan utilizarse abstracciones de maneras no /revistas&

%igura :=&F .l ti/ado /rotege de los errores 4ue se /ueden cometer al mezclar abstracciones&

.l so/orte al ti/ado en los diferentes lengua es de /rogramacin es desigual& Por e em/lo3 en SmallTalE los mensa es flu#en de un ob eto a otro sin ninguna restriccin3 aun4ue los ob etos /uedan no res/onder al recibir mensa es /ara los 4ue no estn /re/arados& "os lengua es /ueden clasificarse en dos gru/os res/ecto a las restricciones 4ue im/one el ti/o:

"engua es con ti/ado fuer te 3 en los 4ue no es /osible mezclar variables de ti/os diferentes& "engua es con ti/ado dbil3 en los 4ue es /osible mezclar variables de diferentes ti/os& .sta mezcla /uede realizarse de manera im/l5cita o e0/l5cita mediante coercin& "a coercin fuerza al com/ilador a tratar un dato de un ti/o como si fuese de otro ti/o3 # /or ello el /rogramador debe res/onsabilizarse de tal violacin&

Jo se debe confundir la coercin con la conversin o casting & "a coercin trata al dato como un sim/le con unto de b#tes forzando su uso como de un ti/o determinado3 mientras 4ue la conversin im/lica algHn ti/o de tratamiento 4ue asegura la validez de la o/eracin& .l ti/ado fuerte evita los errores 4ue se /ueden cometer al mezclar abstracciones de una manera no /revista en el diseo& Por e em/lo3 /uede evitar 4ue se com/aren directamente dos im/ortes si est)n en monedas diferentes 7como dlares # euros8& Tambin acelera los intr/retes # los com/iladores3 /ues al ser m)s estricta la sinta0is el nHmero de /osibilidades a analizar es menor&
<

.l conce/to de ti/o /roviene directamente de la Teor5a de Ti/os Abstractos& SegHn sta un Ti/o Abstracto de Datos es la estructura resultante de la unin de un dominio /ara ciertos datos # de una coleccin de o/eraciones 4ue actHan sobre esos datos&

F ::F

(a/5tulo :

+ntroduccin a la /rogramacin orientada a ob etos

.n contra del ti/ado fuerte se /uede decir 4ue introduce fuertes de/endencias sem)nticas entre las abstracciones& .sto /uede /rovocar 4ue un /e4ueo cambio en la interfaz de una clase base desencadene 4ue tenga 4ue recom/ilarse todas las subclases # clases relacionadas& .n $ava el ti/ado es fuerte& Tanto una clase como una interfaz definen un ti/o3 # con l los mensa es 4ue se le /ueden enviar& As53 todos los ob etos de un determinado ti/o /ueden recibir los mismos mensa es& Adem)s3 $ava im/ide violar el ti/o de un ob eto envi)ndole mensa es /ara los 4ue no est) /re/arado& .0isten lengua es 4ue tienen un ti/ado *5brido entre ti/ado fuerte # dbil& .n este gru/o se encuentra /or e em/lo ( # (OO3 4ue tiene ti/ado fuerte en algunos casos 7/or e em/lo al com/arar clases83 /ero dbil en otros 7al /ermitir com/arar ti/os b)sicos como el i!t # el "loat o al usar coercin de /unteros a void8& Por otro lado3 de/endiendo de la forma en 4ue se declaran las variables se /uede *ablar de:

Ti/ado e0/licito3 cuando antes de utilizar una variable debe declararse el ti/o al 4ue /ertenece& Ti/ado im/l5cito3 cuando las variables no se les indica el ti/o3 sino 4ue ste se deduce del cdigo&

.l ti/ado im/l5cito /uede ocasionar /roblemas dif5ciles de detectar debido a errores de escritura& Si en un lengua e con ti/ado im/l5cito se define la variable 1entero2 # luego se usa la variable 1enetero2 = se crear)n dos variables diferentes sin 4ue se /roduzca ningHn error sint)ctico& Sin embargo3 en e ecucin estar) asegurado el error en la sem)ntica del cdigo& Para evitar estos /roblemas $ava utiliza ti/ado e0/licito& Por Hltimo3 en cuanto al momento en 4ue se com/rueba el ti/o de una variable3 los lengua es de /rogramacin se /ueden clasificar en:

"engua es con ti/ado est)tico 3 en los 4ue el ti/o se com/rueba en com/ilacin& "engua es con ti/ado din)mico3 en los 4ue el ti/o se com/rueba en e ecucin&

.n general3 los lengua es no utilizan slo ti/ado est)tico o slo ti/ado din)mico& Pues aun4ue un lengua e /retenda utilizar slo ti/ado est)tico3 /uede *aber ciertas caracter5sticas 4ue obligan a utilizar el ti/ado din)mico& As53 los lengua es com/ilados suelen utilizar ti/ado est)tico 7/or e em/lo (OO # $ava8& .n estos lengua es3 tras com/ilar llega la eta/a de enlazado& (uando el ti/o de un ob eto se conoce en com/ilacin las direcciones de los mtodos se enlazan mediante lo 4ue se conoce como un enlace tem/rano& Sin embargo3 en los lengua es de /rogramacin orientados a ob etos e0iste una caracter5stica derivada de la *erencia 4ue im/ide el enlace tem/rano en algunas ocasiones& .sta caracter5stica se denomina /olimorfismo # consiste en /ermitir utilizar una misma variable /ara designar ob etos de clases diferentes /ero 4ue cum/lan la misma interfaz& .l /olimorfismo /uede im/edir 4ue se se/a en com/ilacin a 4u mtodo de 4u clase se debe llamar& Por lo 4ue se debe realizar la com/robacin de ti/o en e ecucin # realizar un enlace tard5o& (uando en com/ilacin se /uede determinar la direccin del mtodo se *abla de /olimorfismo est)tico3 # cuando slo es /osible determinarla en e ecucin se *abla de /olimorfismo din)mico& Otro e em/lo lo /odemos encontrar en lengua es como (OO # $ava en los 4ue se realiza coercin con com/robacin de ti/os en tiem/o de e ecucin>& Se debe sealar 4ue cuando el ti/ado es im/l5cito # din)mico3 el ti/o de una variable /odr5a cambiar durante la e ecucin3 como /or e em/lo /ermite el lengua e P#t*on& .n este lengua e tambin se considera una variedad del ti/ado din)mico 4ue se denomina ti/ado latente # 4ue consiste en 4ue al invocar un mtodo de un ob eto no se com/rueba el ti/o como algo global sino 4ue slo se com/rueba la e0istencia del mtodo 4ue se est) invocando& .l siguiente diagrama com/ara la forma en la 4ue se utiliza el ti/ado en algunos lengua es de /rogramacin&

= >

Obsrvese 4ue intencionadamente sobra un car)cter 1e2&

.n (OO se /ueden realizar conversiones # coerciones& Utilizando la instruccin di!amic#cast /ara realizar la coercin con com/robacin de ti/os din)micaM utilizando static#cast /ara coercin con com/robacin de ti/os est)ticaM con rei!terpret#cast /ara coercin sin com/robacin de ti/osM finalmente usando /arntesis # U se realiza coercin3 mientras 4ue usando solo /arntesis se realiza conversin&

F :< F

Disear # Programar todo es em/ezar


Ti$a%o im$licito P&t'on Ti$a%o mixto "isual #asic Ti$a%o ex$licito

Dinmico

a!a C++ Pascal

Esttico

Haskel

Fuerte

Dbil

%igura :>&F (om/aracin del ti/ado de varios lengua es&

Jotacin U!" .n U!" el ti/o a/arece como nombre de cada clase o interfaz& Tambin suele seguir a cual4uier identificador 4ue a/arezca en un diagrama3 se/arado del mismo /or el s5mbolo de dos /untos 7ver %iguras < # D8&

:&<&? (oncurrencia
"a concurrencia es la ca/acidad 4ue /ermite la e ecucin /aralela de varias secuencias de instrucciones& , a# /roblemas 4ue se resuelven m)s f)cilmente si se dis/one de esta ca/acidad& Por e em/lo3 *a# ocasiones en las 4ue se dis/one de mHlti/les /rocesadores # se desea a/rovec*arlos a todos a la vez /ara resolver un mismo /roblema& Otros /roblemas re4uieren 4ue se /uedan tratar diversos eventos simult)neamente& (l)sicamente los lengua es de /rogramacin no *an dado ningHn so/orte a la concurrencia& -eneralmente3 esta facilidad es /ro/orcionada /or los sistemas o/erativos& Por e em/lo3 en Uni0 la concurrencia se consigue con la invocacin de una funcin del sistema o/erativo llamada "or$ 4ue divide la l5nea de e ecucin3 creando mHlti/les l5neas de e ecucin 7tambin conocidas como *ilos o t*reads 8& "os lengua es orientados a ob etos /ueden dar so/orte a la concurrencia de una manera natural *aciendo 4ue un ob eto se /ueda e ecutar en un t*read se/arado& A tales ob etos se les llama ob etos activos frente a los /asivos 4ue no se e ecutan en t*reads se/arados& .sta forma de tratamiento a#uda a ocultar la concurrencia a altos niveles de abstraccin& Sin embargo3 los /roblemas cl)sicos de la concurrencia /ersisten 7condiciones de carrera3 deadlocE3 inanicin3 in usticia3 retraso&&&8& $ava es un e em/lo de lengua e 4ue da so/orte a la concurrencia creando *ilos al crear ciertos ob etos3 aun4ue en el caso de $ava el *ilo /uede e ecutar luego cdigo 4ue est en otros ob etos&

:&<&@ Persistencia
"a /ersistencia es la ca/acidad 4ue /ermite 4ue la e0istencia de los datos trascienda en el tiem/o # en el es/acio& Podemos clasificar los datos en relacin a su vida segHn los siguientes ? ti/os:

.0/resiones& (u#a vida no su/era el )mbito de una l5nea de cdigo& 'ariables locales& (u#a vida se circunscribe a la vida de una funcin& 'ariables globales& Pue e0isten mientras se e ecuta un /rograma& Datos 4ue /ersisten de una e ecucin a otra& Datos 4ue sobreviven a una versin de un /rograma& Datos 4ue sobreviven cuando #a no e0isten los /rogramas3 los sistemas o/erativos e incluso los ordenadores en los 4ue fueron creados&

"os tres /rimeros /untos entran dentro del so/orte dado cl)sicamente /or los lengua es de /rogramacin& "os tres Hltimos /untos no suelen estar so/ortados /or los lengua es de /rogramacin3 entrando en el )mbito de las bases de datos& Un lengua e orientado a ob etos 4ue d so/orte /ara la /ersistencia deber5a /ermitir grabar los ob etos 4ue e0istan3 as5 como la definicin de sus clases3 de manera 4ue /uedan cargarse m)s adelante sin ambigQedad3 incluso en otro /rograma distinto al 4ue lo *a creado& $ava da cierto nivel de so/orte a la /ersistencia de una clase si sta cum/le la interfaz /redefinida %eriali&able& .sta interfaz define mtodos 4ue /ermiten almacenar los ob etos en so/ortes /ermanentes&

F :=F

(a/5tulo :

+ntroduccin a la /rogramacin orientada a ob etos

:&=& "ecturas recomendadas


1Ob ectFOriented Anal#sis and Design23 -& Aooc*3 Aen amin (ummings3 :DD>& "os cinco /rimeros ca/5tulos de este libro constitu#en una de las /rimeras3 # me ores3 introducciones formales al diseo orientado a ob etos de la mano de uno de los creadores de U!"& 1.l lengua e Unificado de !odelado2 # 1.l lengua e Unificado de !odelado: -u5a de referencia23 -& Aooc*3 +& $acobson # $& 6umbaug*3 <V edicin3 Addison Gesle# <CC?& 1"os tres amigos23 creadores de U!"3 /resentan en estas dos obras una gu5a de usuario # una gu5a de referencia de U!"& +m/rescindibles /ara conocer todos los detalles de U!"3 su car)cter3 /oco did)ctico3 *ace 4ue solo se recomiende como obra de consulta&

:&>& . ercicios
. ercicio : Su/ngase 4ue un banco desea instalar ca eros autom)ticos /ara 4ue sus clientes /uedan sacar e ingresar dinero mediante una tar eta de dbito& (ada cliente /odr) tener m)s de una cuenta en el Aanco3 # /or cada cuenta se /odr) tener como m)0imo una tar etaM de cada cuenta slo interesan los datos del titular de la misma3 estando las tar etas3 en caso de 4ue e0istan3 a nombre del titular de la cuenta& Para evitar 4ue las tar etas e0traviadas o robadas se usen3 se decide 4ue antes de entregar el dinero del ca ero debe verificar mediante una contrasea la identidad del /ro/ietario de la cuenta& Slo se /ermiten tres intentos /ara introducir la clave correcta3 si no se consigue se invalida la tar eta& Para aumentar la seguridad3 el Aanco /ro/one 4ue se fi e una cantidad m)0ima de dinero 4ue /ueda sacarse cada d5a& .l banco desea 4ue m)s tarde sea /osible aadir nuevas o/eraciones al ca ero como: consultar el saldo3 com/rar entradas de teatro3 etc& Usando el /aradigma de orientacin a ob etos # el lengua e U!" se /ide construir un Diagrama .st)tico de (lases 4ue /ueda re/resentar una solucin al enunciado&

F :> F

(a/5tulo <

+ntroduccin al lengua e $ava

<&:& +ntroduccin
.n este ca/5tulo se /resenta una breve introduccin al lengua e $ava& "a bibliograf5a recomendada al final del ca/5tulo /ermitir) com/render con detalle los conce/tos 4ue en los siguientes /untos se esbozan&

<&:&: Areve *istoria de $ava


%irst Person3 una filial de Sun !icros#stems es/ecializada en el desarrollo de software /ara /e4ueos dis/ositivos3 decidi desarrollar un nuevo lengua e adecuado a sus necesidades& .ntre estas necesidades estaban la reduccin del coste de /ruebas en relacin a otros lengua es como ( o (OO3 la orientacin a ob etos3 la inclusin de bibliotecas gr)ficas # la inde/endencia del sistema o/erativo& As53 de la mano de $ames -osling3 naci OaE& Al /oco tiem/o3 en :DD>3 cerr %irst Person al no des/egar ni los /ro#ectos de T' interactiva3 ni los de tostadoras inteligentes&
Uno de los desarrolladores de Uni0 # fundadores de Sun3 Aill $o#3 /ens 4ue OaE /od5a ser el lengua e 4ue la inci/iente +nternet necesitaba # en :DD93 tras una /e4uea ada/tacin de OaE3 nac5a $ava& .ntre las /rinci/ales caracter5sticas de $ava se /ueden citar:

Sinta0is similar a la de (OO& Aun4ue se sim/lifican algunas caracter5sticas del lengua e como: la sobrecarga de o/eradores3 la *erencia mHlti/le3 el /aso /or referencia de /ar)metros3 la gestin de /unteros3 la liberacin de memoria # las instrucciones de /recom/ilacin& So/orte *omogneo a la Programacin Orientada a Ob etos& A diferencia de (OO3 4ue /uede considerarse un lengua e multi/aradigma3 $ava est) diseado es/ec5ficamente /ara utilizar el /aradigma de orientacin a ob etos& +nde/endencia de la /lataforma& (on $ava se *izo un im/ortante esfuerzo /ara 4ue el mismo cdigo fuese e ecutable inde/endientemente del *ardware # del Sistema O/erativo&

A la versin del lengua e vigente en <CCD se le denomina $ava 9 # su/one una me ora sustancial res/ecto a a4uella /rimera versin de $ava de :DD9& .l siguiente diagrama de blo4ues muestra un es4uema de alto nivel de la /lataforma $ava S.&

a!a ()*

,erra)ientas$+$A!Is de$desarrollo

java

javac

javadoc

apt

jar

javap

D! Bus#ueda de$errores

"tras

Seguridad

Internacional

RNI

IDL

Despliegue

Monitoreo

%M$&I

&ecnolog6as$de despliegue !a#uetes$de Inter0a3$de$2suario

ava$-e/$Start

ava$!lug7in

awt

Input$Methods Drag'n'Drop IDL DBC

javax

Swing Sownd NDI RMI

I)age$I" Accesi/ilit+

!rint$Service ava$.D RMI7II"!

D8 RE

Inter0aces$de integraci5n

NI Beans Int'I$Support I" M( Math

"tros$pa#uetes
Networ*ing Std$"verride Mechanis) Seriali3ation Securit+ New$I" (ML$ A(!

!a#uetes$/ase

lang

!re0erences Re0$"/jects

Manage)ent Re0lection

Extesion Mechanis) %ersioning

util

AR Regular Expresion

Logging Collections

Concurrenc+ 2tilities 1ip

M4#uinas$virtuales

ava$,otspot$Client$Co)piler

ava$,otspot$Server$Co)piler

Siste)as$"perativos

Linux

Solaris

-indows

"tros

%igura :9&F Diagrama de los /rinci/ales com/onentes de la /lataforma $ava S.&

F :9 F

(a/5tulo <

+ntroduccin al lengua e $ava

<&:&< "a m)4uina virtual de $ava


Partiendo del cdig o fuente de un /rograma3 el com/ilador de $ava S. no /roduce cdig o m)4uina e ecutable en un /rocesador es/ec5fico& .n vez de esto3 genera un cdigo sim/lificado3 denominado b#tecode 3 4ue /recisa de otro /rograma3 la !)4uina 'irtual de $ava S.3 /ara e ecutarse& .sta !)4uina 'irtual3 e ecuta las a/licaciones $ava en un entorno virtual 4ue se denomina la ca a de arena 7sandbo0 8& .ste es4uema de funcionamiento *ace 4ue $ava sea mu# seguro en cuanto al acceso no autorizado a los recursos del sistema& Tambin *ace 4ue sea multi/lataforma3 /ues una sola com/ilacin genera b#tecodes 4ue se /odr)n e ecutar en m)4uinas virtuales de diferentes /lataformas& Debido a la e0istencia de este lengua e intermedio de b#tecodes3 *a# 4uien considera a $ava un lengua e inter/retado& Sin embargo3 en $ava S. desde la versin :&= la !)4uina 'irtual en vez de inter/retar cada b#tecode3 com/ila a cdigo m)4uina nativo cada funcin antes de e ecutarla& .ste ti/o de enfo4ue se denomina $ust +n Time 7$+T 8 /or4ue se realiza la com/ilacin en el momento de la e ecucin 7esta misma tecnolog5a la *a co/iado !icrosoft en la m)4uina virtual de la /lataforma &J.T8& Adem)s3 los b#tecodes tienen un formato similar al cdigo m)4uina de cual4uier /rocesador3 # /or ello la generacin de cdigo m)4uina desde estos b#tecodes es mu# r)/ida& Debe e0istir una !)4uina 'irtual diferente /ara cada /lataforma 4ue so/orte $ava S.& +ncluso suele *aber diferentes m)4uinas virtuales /ara la misma /lataforma3 de/endiendo del fabricante de software3 siendo algunas me ores 4ue otras&

%igura :?&F .s4uema b)sico de com/ilacin # e ecucin en $ava&

Tambin e0isten im/lementaciones del com/ilador de $ava 4ue convierten el cdigo fuente directamente en cdigo ob eto nativo3 como -($& .sto elimina la eta/a intermedia donde se genera el b#tecode3 /ero la salida de este ti/o de com/iladores no es multi/lataforma&

<&:&= (om/iladores de $ava


.0isten varias a/licaciones /ara com/ilar $ava en l5nea de comandos& "a m)s sim/le es avac3 /ro/orcionada /or el $DW 7$ava Develo/er Wit8 de Sun& Actualmente3 en <CCD3 la Hltima versin estable del Eit de desarrollo de $ava de Sun es el $DW ?&

<&:&> .ntornos de desarrollo /ara $ava


Para /rogramar en $ava e0isten entornos O/en Source de nivel /rofesional como .cli/se 7desarrollado inicialmente /or +A!8 # Jetbeans 7de Sun8 4ue *acen esta tecnolog5a abierta # accesible& Tambin e0isten entornos /rivativos como +ntelli$ +D.A& Todos estos entornos /ermiten /rogramacin de a/licaciones de ti/o consola3 a/licaciones visuales3 a/licaciones web3 /ara sistemas embebidos3 /ara dis/ositivos mviles&&& Tanto .cli/se3 como Jetbeans e +ntelli$ +D.A3 est)n desarrollados en $ava& Tambin *a# entornos m)s modestos como Wawa o Scite3 desarrollados com/letamente en lengua e nativo3 4ue son menos /esados en e ecucin /ero 4ue no contem/lan muc*as de las caracter5sticas 4ue a/ortan sus *ermanos ma#ores&

<&:&9 .l /rog rama *ola mundo


"a tradicin3 iniciada con el famoso libro sobre el lengua e ( de Wernig*an # 6itc*ie3 dicta 4ue el /rimer /rograma 4ue debe e ecutarse cuando se est) a/rendiendo un lengua e es el /rograma 'olaMu!do& Dic*o /rograma se limita a im/rimir en /antalla un mensa e de bienvenida& Para no rom/er la tradicin3 con nuestro editor de te0to AS(++ favorito3 creamos un fic*ero fuente denominado 'olaMu!do.(ava& .n l co/iamos el siguiente fragmento de cdigo3 res/etando ma#Hsculas # minHsculas3 tanto en el nombre del fic*ero como en el contenido3 /ues $ava /resta atencin a este detalle&
)* +ro,rama e! -ava .ue muestra u! me!sa(e de bie!ve!ida *) class 'olaMu!do / )) m0todo e! el .ue comie!&a la e(ecuci! del pro,rama public static void mai! 1%tri!, 2 3 ar,4 / %5stem.out.pri!tl!16'ola mu!do647 8

F :? F

Disear # Programar todo es em/ezar Una vez grabado el cdigo fuente del /rograma en un directorio a nuestra eleccin3 desde la l5nea de comandos invocamos al com/ilador&
c9:s;a:E(emplo:< (avac 'olaMu!do.(ava

Rste com/ila # genera el fic*ero 'olaMu!do.class 4ue contiene los b#tecodes& %inalmente e ecutamos el /rograma invocando a la m)4uina virtual de $ava3 obteniendo el saludo es/erado&
c9:s;a:E(emplo:< (ava =classpath . 'olaMu!do 'ola mu!do

<&:&? "os comentarios


"os comentarios son l5neas de te0to 4ue a/arecen en el cdigo fuente # 4ue son obviadas /or el com/ilador& Su /rinci/al utilidad consiste en a#udar a entender el cdigo fuente ad#acente& Dentro de un /rograma $ava *a# dos formas de escribir un comentario& "a /rimera3 4ue llamaremos comentario en blo4ue3 se *ereda de ( # utiliza una combinacin del car)cter barra inclinada *acia la derec*a seguido del car)cter asterisco /ara abrir el comentario3 # la combinacin asterisco barra inclinada /ara cerrarlo& "a otra forma se *ereda de (OO # sim/lifica la tarea de *acer comentarios de una sola l5nea& Para ello utiliza dos veces el car)cter de la barra inclinada a la derec*a /ara indicar el comienzo del comentario # el retorno de carro /ara terminarlo& Puede observarse 4ue3 /or definicin3 no es /osible anidar comentarios de ti/o (3 aun4ue s5 es /osible 4ue un comentario de ti/o ( inclu#a comentarios de l5nea&
)* *) Esto es u! come!tario .ue puede ocupar varias l>!eas.

)) Esto es u! come!tario de l>!ea

Adem)s3 $ava aconse a un modo est)ndar de escritura de comentarios 4ue3 de seguirse3 /ermite al /rograma (avadoc del $DW de Sun generar de manera autom)tica la documentacin del cdigo& .l /rograma (avadoc /roduce un arc*ivo ,T!" /or cada fic*ero 4ue analiza 4ue /uede visualizarse con cual4uier navegador web& "os comentarios de documentacin son comentarios de blo4ue 4ue re/iten el asterisco& "os comentarios de documentacin se deben colocar antes del blo4ue de definicin al 4ue *acen referencia3 /or4ue $ava asocia el comentario de documentacin a la /rimera sentencia 4ue se encuentra des/us del /ro/io comentario& .n los comentarios de documentacin se utilizan ciertas /alabras clave /recedidas del car)cter arroba /ara eti4uetar los elementos 4ue se describen& "a siguiente tabla recoge las diferentes /osibilidades&
?param ?retur! ?thro;s ?versio! ?author ?deprecated ?see ?si!ce

Par)metros de entrada /ara un mtodo 'alor devuelto /or un mtodo .0ce/ciones lanzadas /or un mtodo 'ersin del cdigo Autor del cdigo .l mtodo #a no se debe usar3 /ero se mantiene /or com/atibilidad 6eferencias a otras clases Jueva funcionalidad aadida en la versin 4ue mar4ue este tag
Tabla :&F Anotaciones utilizadas en los comentarios&

.l siguiente fragmento de cdigo muestra un e em/lo de comentarios de documentacin& Adem)s3 en todos los fragmentos de cdigo 4ue se utilicen en este libro se incluir) el avadoc corres/ondiente como /arte del e em/lo&
)** E(emplo de docume!taci! autom@tica co! (avadoc ?author -os0 A0le& ?versi! B.C *) )** * Descripci! del comportamie!to del m0todo. * ?param !ombre+ar@metro#B descripci! * ?param !ombre+ar@metro#! descripci!

F :@F

(a/5tulo <
* * * * *)

+ntroduccin al lengua e $ava

?retur! descripci! ?thro;s !ombre#clase descripci! ?si!ce C.D ?deprecated explicaci!

<&:&@ $ueg o de instr ucciones


.n el siguiente /)rrafo se /resentan las /alabras reservadas del lengua e $ava&
abstractE boolea!E brea$E b5teE caseE catchE charE classE co!ti!ueE de"aultE doE doubleE exte!dsE "alseE "i!alE "i!all5E "loatE "orE i"E impleme!tsE i!sta!ceo"E i!tE i!ter"aceE lo!,E !ativeE !e;E !ullE pac$a,eE privateE publicE retur!E shortE staticE superE s;itchE s5!chro!i&edE thisE threadsa"eE tra!sie!tE trueE tr5E voidE volatileE ;hile.

<&<& .0/resiones b)sicas # control de f lu o


.n $ava e0isten una serie de ti/os de datos b)sicos /redefinidos 4ue se conocen como ti/os /rimitivos & Adem)s3 es /osible declarar variables de estos ti/os /rimitivos # asignarlas a datos del mismo ti/o mediante el o/erador de asignacin # una e0/resin adecuada& .n adelante se utilizar) un metalengua e denominado -O"D /ara describir la sinta0is de $ava& .ste metalengua e /resenta los s5mbolos no terminales entre )ngulos7XY83 los s5mbolos terminales como cadenas libres3 los corc*etes /ara indicar elementos o/cionales # elementos de las e0/resiones regulares 7como el asterisco /ara indicar re/eticiones8& .l uso de estas e0/resiones no tienen el )nimo de ser com/letas res/ecto a la sinta0is de $ava3 sino de a/ortar /recisin al uso m)s *abitual de dic*a sinta0is& Por e em/lo3 la declaracin e inicializacin de una variable tiene el siguiente formato&
Fdeclaraci!< Fi!iciali&aci!< 99G 99G 2"i!al3 Ftipo< Fide!ti"icador< 2EFide!ti"icador<37 Fide!ti"icador< G Fexpresi! de i!iciali&aci!<7

Obsrvese 4ue es /osible indicar 4ue el valor de la variable ser) inmutable 7no cambiar) tras su /rimera inicializacin8 mediante el modificador "i!al& Adem)s3 las o/eraciones de declaracin e inicializacin se /ueden realizar en un solo /aso&
Fdeclaraci! e i!iciali&aci!< 99G 2"i!al3 Ftipo< Fide!ti"icador< 2G Fexpresi! de i!iciali&aci! <37

"os identificadores en $ava /ueden corres/onder a cual4uier cadena de caracteres Unicode siem/re 4ue no comiencen /or un nHmero o un s5mbolo utilizado /or $ava /ara los o/eradores3 ni coincida con una /alabra reservada de $ava& As53 se /uede definir:
int mai!Co!tE auxCo!t7 mai!Co!t G H7 int i G J7 final double G K.BLBJM7 ))Declaraci! de dos e!teros ))I!iciali&aci! de u! e!tero ))Declara e i!icia u! e!tero ))Declara e i!icia u!a co!sta!te real

Para me orar la comunicacin es me or utilizar identificadores significativos #3 a ser /osible3 en ingls 9& 6es/ecto al uso de ma#Hsculas3 en $ava suele seguirse el convenio del camello al nombrar las clases e interfaces& .ste convenio consiste en comenzar cada /alabra 4ue forme /arte del identificador en ma#Hsculas # utilizar minHsculas /ara el resto de los caracteres3 dando a los identificadores una silueta con orobas& "as /ro/iedades3 mtodos # variables utilizan el criterio del camello e0ce/to /ara la /rimera letra del identificador& "as constantes se escriben en ma#Hsculas3 se/arando las /alabras con la barra *orizontal ba a& %inalmente3 los /a4uetes se suelen escribir en minHsculas& Por Hltimo se debe destacar 4ue la declaracin de las variables se /uede realizar en cual4uier /unto del cdigo& .sto debe a/rovec*arse /ara declarar las variables en el /unto en 4ue se utilizan # no antes3 me orando con ello la claridad del cdigo&

<&<&: Ti/os /rimitivos


"os ti/os /rimitivos en $ava se /ueden agru/ar en cuatro categor5as: nHmeros enteros3 nHmeros reales3 caracteres # booleanos& (ada uno tiene un valor /or defecto 4ue slo se a/lica cuando la variable corres/onde a una /ro/iedad de una clase&
9

Usar ingls al /rogramar facilita la comunicacin entre /rogramadores de distintas nacionalidades& Por e em/lo3 /ara un castellano *ablante3 leer cdigo en c*ino /uede ser tan dificultoso3 como /ara 4ue un *abitante de PeE5n lea cdigo en castellano& Por otro lado3 ciertas e0tensiones de $ava obligan a utilizar /art5culas como ,et o put las cuales unto a /alabras en castellano /resentan un as/ecto3 cuanto menos3 singular 7/or e em/lo ,etAalor8& Jo obstante3 este libro3 destinado a castellano *ablantes3 el cdigo estar) en castellano&

F :; F

Disear # Programar todo es em/ezar .nteros .0isten diferentes ti/os /ara re/resentar nHmeros enteros& (ada uno /ermite un rango diferente de re/resentacin # como consecuencia tambin tiene un coste de memoria diferente&
Ti/o b5te short i!t lo!,

A#tes

Descri/cin

'alor /or defecto C C C C

Sinta0is

. em/lo de uso b5te b G BCC7 short s G =NCCC7 i!t i G BLCCCCC7 lo!, l G =JK7

: < > ;

.nteros desde N:<; a :<@ .nteros desde N:?=;> *asta :?=;= .nteros desde F<=: *asta <=:F: .nteros desde F<?= *asta <?=F:

FZC3:[\CFD]O FZC3:[\CFD]O FZC3:[\CFD]O FZC3:[\CFD]O

6eales ,a# dos ti/os /ara re/resentar reales& De nuevo cada uno tiene una /recisin3 un rango de re/resentacin # una ocu/acin de memoria diferentes& Ti/o
"loat double

A#te s
; :?

Descri/cin 6eales 6eales largos

'alor /or defecto


OC.C" C.C

Sinta0is FZC3:[\CFD]U^&\CFD]Of FZC3:[\CFD]U^&\CFD]O

. em/lo de uso
"loat e G H.PB"7 "loat x G =B.HB"7 double p G OK.BL7

"gicos "as e0/resiones lgicas est)n so/ortadas /or el ti/o bivaluado boolea!& Ti/o
boolea!

A#tes
indefinido

Descri/cin cierto o falso

'alor /or defecto


"alse

Sinta0is true_false

. em/lo de uso
boolea! c G true7

(aracteres .l ti/o /rimitivo /ara los caracteres es el ti/o char& Ti/o


char

A#tes
+

Descri/cin (aracteres Unicode

'alor /or defecto


Q:uCCCCCCR

Sinta0is `\^u\CFD]O_&]`

. em/lo de uso
char c G STS7 char D G S:uBKS7

Por *erencia de ( la barra inclinada *acia la iz4uierda se utiliza como car)cter de control& Por se/arado no tiene sentido3 sino 4ue siem/re se combina con el siguiente car)cter& Algunos de sus /rinci/ales usos son:

Si va seguida de una u # un nHmero su significado es el car)cter re/resentado /or el valor Unicode de ese nHmero& Si va seguida de otra barra igual o de comillas dobles e4uivale al car)cter barra o el de comillas res/ectivamente& Si va seguida de una ! significa retorno de carro& Si va seguida de una t significa tabulado&

<&<&< (onversiones entre ti/os /rimitivos


.s /osible realizar conversiones directas entre los diferentes ti/os b)sicos numricos siem/re 4ue se realice de menor /recisin a ma#or /recisin& .s decir si se sigue el siguiente flu o:
b5te < short < i!t < lo!, < "loat < double

Para cual4uier conversin en otra direccin se debe utilizar la o/eracin de casting& (onsiste en /oner el ti/o al 4ue se desea convertir /or delante # entre /arntesis& "as conversiones /or casting deben *acerse de manera e0/l5cita /ara evitar

F :DF

(a/5tulo <

+ntroduccin al lengua e $ava

e4u5vocos3 /ues /ueden /rovocar /rdida de /recisin 7o de todo el valor8& .l siguiente e em/lo muestra la conversin de un valor de ti/o flotante a un valor de ti/o b#te usando un casting&
float temperatura G HJ.H"7 byte temperaturaTru!cada G 1byte4 temperatura7 ))valdr@ HJ

<&<&= O/eradores
"os o/eradores de $ava se /ueden agru/ar en: relacionales3 aritmticos3 lgicos # de bit& 6elacionales O/erador
GG < F <G FG UG

Descri/cin +gualdad !a#or !enor !a#or o igual !enor o igual Distinto

. em/lo
a GG b a < b a F b a <G b a FG b a UG b

Aritmticos 7sobre enteros # reales8 O/erador


O = * ) W OO == OG =G *G )G WG

Detalle Suma o declaracin de /ositivo 6esta o declaracin de negativo Producto Divisin 6esto de la divisin de dos nHmeros enteros Post o /reFincremento en una unidad de una variable Post o /reFdecremento en una unidad de una variable +ncremento en varias unidades de una variable Decremento en varias unidades de una variable !ulti/licacin /or un nHmero de una variable Divisin /or un nHmero de una variable !odularizacin /or un nHmero de una variable

Unitario
, ,

Ainario
, , , , ,

. em/lo
a O bE Oa a V bE =a a * b a ) b a W b aOOE OOa a==E ==a

, , , , , , ,

a OG b a =G J a *GK a )G b A WGL

F <C F

Disear # Programar todo es em/ezar

"gicos O/erador
X Y XX YY Z U XG YG

Descri/cin (on uncin 7and8 Dis#uncin 7or8 (on uncin im/aciente 7and8 Dis#uncin im/aciente 7or8 Dis#uncin e0clusiva 70or8 Jegacin 7not8 Asignacin con con uncin Asignacin con dis#uncin

Unitario

Ainario
, , , , ,

. em/lo
aXb aYb aXXb aYYb aZb [a

, , ,

aXGb aYGb

Ait 7sobre ti/os enteros8 O/erador


X Y Z FF << <<< \

Descri/cin (on uncin 7and8 Dis#uncin 7or8 Dis#uncin e0clusiva 70or8 Des/lazamiento binario a la iz4uierda rellenando con ceros Des/lazamiento binario a la derec*a rellenando con el bit m)s significativo Des/lazamiento binario a la derec*a rellenando con ceros Jegacin binaria

Unitario

Ainario
, , , , , ,

. em/lo
aXb aYb aZb aFFK a<<K a<<<K \a

<&<&> (ontrol del f lu o


$ava dis/one de la ma#or5a de sentencias de control de flu o *abituales en otros lengua es de /rogramacin como: i"3 ;hile3 "or&&& .n los siguientes /untos se analizan estas sentencias # los )mbitos sobre los 4ue se a/lican&
Definicin de )mbitos # sentencias Un )mbito se inicia con el car)cter de llave abierta *acia la derec*a # se termina con el car)cter de llave abierta *acia al iz4uierda& $ava utiliza los )mbitos /ara definir las sentencias afectadas /or una declaracin o /or una instruccin de control de flu o& "os )mbitos se /ueden anidar # dentro de un )mbito siem/re /uede definirse otro& .sto3 unido a 4ue las declaraciones de las variables son locales al )mbito en 4ue se declaran3 *ace 4ue el )mbito tambin se utilice /ara agru/ar lgicamente sentencias& "as sentencias del lengua e son las res/onsables de declarar mtodos3 /ro/iedades # variables3 crear ob etos3 invocar funciones de los ob etos3 controlar el flu o de e ecucin3 etc& Todas las sentencias terminan en /unto # coma salvo las 4ue se a/lican sobre la sentencia o )mbito inmediato& Por ello3 las sentencias /ueden escribirse unas tras otras en la misma l5nea3 aun4ue normalmente suele dis/onerse una sola sentencia /or l5nea /ara me orar la legibilidad& .l siguiente e em/lo ilustra los conce/tos 4ue se acaban de e0/oner&

F <:F

(a/5tulo <
/

+ntroduccin al lengua e $ava

int a7 ))A.u> a !o tie!e valor de"i!ido a G HJ7 int c G BJ7 ))A.u> SaS vale HJ 5 ScS vale BJ / int b G H7 ))A.u> SaS vale HJ 5 SbS vale H ))-ava !o permite declarar dos ide!ti"icadores i,uales e! u! @mbito ))por lo .ue e! este pu!to !o ser>a posible escribir i!t c G BH7 8 ))A.u> SaS vale HJE ScS vale BJ 5 SbS !o est@ declarada

+nstr ucciones if else "a sentencia i" lleva asociada una e0/resin booleana entre /arntesis& De cum/lirse la e0/resin se e ecuta la sentencia o el )mbito siguiente al i". .n otro caso se e ecuta3 si e0iste3 la rama else.
Fi!strucci! i"=else< 99G i" 1Fexpressio! boolea!a<4 F@mbito< Y Fse!te!cia< 2else F@mbito< Y Fse!te!cia<3

.l siguiente e em/lo ilustra el uso de i" encadenado a otro i"&


if 1importe<BCC4 / descue!to G C.H7 8 else if 1importeFNC4 / descue!to G C.B7 8 else / descue!to G C.BJ7 8

+nstr ucciones for "a /alabra reservada "or /ermite re/etir una sentencia o un )mbito cual4uier nHmero de veces& Su estructura es la siguiente&
Fi!strucci! "or< 99G "or 1Fexpresi! i!iciali&aci!<7Fexpresi! boolea!a<7Fexpresi! i!creme!to<4 F@mbito< Y Fse!te!cia<

.sta instruccin en /rimer lugar e ecuta la e0/resin de inicializacin& "uego evalHa la e0/resin booleana # en caso de resultar verdadera *ace una e ecucin del )mbito& Al terminar e ecuta la e0/resin de incremento& .l /roceso de evaluacin de la e0/resin3 e ecucin del )mbito # /osterior incremento3 se re/ite *asta 4ue la e0/resin booleana de a de resultar cierta& "os bucles "or suelen utilizarse cuando el nHmero de iteraciones es concreto # no var5a& .l siguiente e em/lo ilustra su uso:
for 1int co!t G C7 co!t F BCC7 co!tOO4 / suma OG co!t7 8

+nstr ucciones while "a /alabra reservada ;hile tambin /ermite re/etir un )mbito cual4uier nHmero de veces& Suele utilizarse cuando el nHmero de iteraciones no es concreto # de/ende de varias condiciones& Su estructura es la siguiente&
Fi!strucci! ;hile< 99G ;hile 1Fexpresi! boolea!a<4 F@mbito< Y Fse!te!cia<

Su funcionamiento consiste en evaluar la condicin # en caso de cum/lirse *acer una e ecucin del )mbito& .ste /roceso se re/ite *asta 4ue la condicin de a de cum/lirse& Un e em/lo de su uso ser5a:
while 11co!t < BCC4 XX 1Utermi!ar44 / termi!ar G 1co!t < mi!imoAariable47 co!t=GH7 8 ))termi!ar toma valor boolea!o ))se resta H a co!t cada iteraci!

F << F

Disear # Programar todo es em/ezar +nstr ucciones do while


Do=]hile es similar a ;hile /ero obliga a una /rimera iteracin antes de evaluar la condicin&
Fi!strucci! do< 99G do F@mbito< Y Fse!te!cia< ;hile 1Fexpresi! boolea!a<47

Un e em/lo de su uso ser5a:


do / calculo *G HJ7 ))calculo se multiplica por HJ e! cada iteraci! co!t<<B7 ))co!t se divide por dos cada iteraci! 8 while 11co!t < C4 XX 1calculo FBCCC447

+nstr ucciones break y continue "a instruccin brea$ /ermite interrum/ir en cual4uier /unto la e ecucin normal de un bucle "or o ;hile # salir instant)neamente del mismo& "a instruccin co!ti!ue /ermite interrum/ir la e ecucin normal de un bucle "or o ;hile # volver a la sentencia de evaluacin /ara decidir si continuar o salir& Tanto brea$ como co!ti!ue /ueden utilizarse en combinacin con eti4uetas /ara salir de varios bucles simult)neamente *asta alcanzar el bucle eti4uetado& "as eti4uetas se definen mediante un identificador seguido del car)cter de dos /untos& .stas instrucciones no se corres/onden con ninguna de las im/rescindibles /ara la /rogramacin estructurada& Sin embargo3 muc*os /rogramadores 7entre ellos los diseadores de lengua es8 consideran 4ue la /osibilidad de salir de un blo4ue de cdigo en cual4uier /unto3 facilita la tarea de /rogramar # no trae ningHn inconveniente #a 4ue es f)cilmente re/roducible con una estructura condicional adecuada& +nstr ucciones switch-case-break-default Permite evaluar una sola vez una e0/resin aritmtica # en base a su resultado e ecutar las sentencias de un )mbito concreto& Su estructura es la siguiente:
Fi!strucci! s;itch< 99G s;itch 1Fexpresi! e!tera<4 S/S 2case Fvalor#e!tero< S9S S/S Fse!te!cias< 2brea$S7S3 S8S 3* 2de"ault S9S S/S Fse!te!cias< S8S 3

S8S

<&=& "as clases


"as clases son el mecanismo b)sico 4ue /ro/orciona $ava /ara mane ar el conce/to de abstraccin # de ti/ado 7ver ca/5tulo :8& $ava /ermite construir clases 4ue definan la interfaz # la im/lementacin de los ob etos 4ue /osteriormente se /odr)n crear& As53 cada clase define una interfaz # un ti/o 7o varios ti/os en el caso de las clases /arametrizadas8& "as clases en $ava est)n constituidas /or:

+dentificacin&F "a /rimera l5nea de una clase identifica el nombre de la clase3 las clases de las 4ue *ereda3 las interfaces 4ue im/lementa3 las e0ce/ciones 4ue /uede lanzar # los /ar)metros utilizados /ara referir ti/os& !iembros&F Se /ueden clasificar en datos miembros # funciones miembros3 tambin conocidos como /ro/iedades # mtodos3 de los 4ue #a *ablamos en el /unto :&<&:& (abe decir 4ue en $ava tanto las /ro/iedades como los mtodos /ueden corres/onder a instancias de la clase 7ob etos8 o a la /ro/ia clase 7con valores # com/ortamientos comunes /ara todos los ob etos de la clase8& (lases inter nas &F (lases 4ue se definen dentro de otras clases& Jormalmente se utilizan /ara crear clases fuertemente ligadas con la clase *us/ed& .stas clases internas /ueden incluso ser annimas3 derivando de otra 4ue le /ro/orciona una interfaz con el resto del cdigo& Alo4ues de inicializacin &F (on untos de instrucciones encargadas de iniciar las /ro/iedades de la clase& $ava se encarga de 4ue estos blo4ues se e ecuten convenientemente antes de crear los ob etos de la clase&

.l siguiente es4uema muestra cmo se define una clase en $ava& Se a/recia 4ue adem)s de nombrar la clase con un identificador3 se es/ecifican las e0ce/ciones 4ue /uede lanzar la clase 7de lo 4ue *ablaremos en el ca/5tulo >8 # los /ar)metros utilizados /ara referenciar ti/os genricos 7de lo 4ue *ablaremos en el ca/5tulo 98& Adem)s3 al definir una clase tambin se /uede aadir informacin sobre la *erencia& Aun4ue se /rofundizar) en este as/ecto en el ca/5tulo =3 se /uede adelantar 4ue /ara *eredar de otra clase se utiliza la /alabra reservada exte!ds seguida del nombre de la clase&

F <=F

(a/5tulo <

+ntroduccin al lengua e $ava

Fclase< 99G 2Modi"icador de clase3 class Fide!ti"icador< 2par@metros3 2here!cia3 2excepcio!es3 S/S 2Fm0todo<YFpropiedad<YFi!iciali&acio!<YFclase<3* S8S

De nuevo3 el identificador /uede estar formado /or cual4uier cadena de caracteres Unicode siem/re 4ue no comience /or un nHmero o un s5mbolo utilizado /or $ava /ara los o/eradores3 ni coincida con una /alabra reservada del lengua e& "a definicin de una clase en $ava siem/re se realiza dentro de un /a4uete& Para es/ecificar el /a4uete al 4ue /ertenecen las clases definidas en un fic*ero se usa la /alabra pac$a,e seguida del nombre del /a4uete& Si no se es/ecifica ningHn nombre de /a4uete el fic*ero se inclu#e en un 1/a4uete /or defecto2 corres/ondiente al directorio inicial de e ecucin& "as /ro/iedades se declaran en el interior de una clase mediante la definicin de variables& Por otro lado3 los mtodos se declaran mediante un identificador seguido de unos /arntesis3 4ue /ueden contener los /ar)metros /asados al mtodo& .n general3 tras los /ar)metros suele e0istir un )mbito 4ue contiene la im/lementacin del mtodo3 en dic*o )mbito se o/era con los /ar)metros3 con las /ro/iedades # con los otros mtodos de la clase utilizando sim/lemente sus identificadores& .l identificador del mtodo debe estar /recedido /or el ti/o del valor 4ue devuelve o void si no devuelve nada3 mientras 4ue en el interior del mtodo se usar) la /alabra reservada retur! /ara indicar el valor devuelto& "os siguientes e em/los definen la clase Automvil # la clase Coche& Ambos tienen definidas algunas /ro/iedades # mtodos& Obsrvese 4ue la clase Coche *ereda de Automvil3 # /or lo tanto3 aun4ue no los declara e0/l5citamente3 tiene los miembros definidos en Automvil m)s los 4ue ella misma define&
)** * E(emplo de impleme!taci! de u!a clase * ?versio! B.C *) class Automvil / int velocidad7 ))Declaraci! de u!a propiedad para la velocidad del coche )) E(emplo de declaraci! e impleme!taci! de u! m0todo )** M0todo .ue permite co!ocer la velocidad actual * ?retur! E!tero co! la velocidad *) int velocidad14 / ))Impleme!taci! del m0todo return velocidad7 8

)** * Declaraci! de u!a clase .ue hereda de la clase Automovil * ?versio! B.C *) class Coche extends Automvil / boolean e!Marcha7 ))I!dica si el coche est@ e! marcha int !umRuedas G L7 ))Cue!ta las ruedas del coche )** M0todo .ue permite aume!tar la velocidad * ?param i!creme!to Aalor e!tero .ue se sumar@ a la velocidad *) void acelerar1int i!creme!to4 / velocidad OG i!creme!to7 e!Marcha G true7 8 )** * +ermite reducir la velocidad *) void "re!ar14 / if 1e!Marcha4 velocidad ==7 if 1velocidad GG C4 e!Marcha G false7 8

.n la %igura :@ se muestra un Diagrama .st)tico de (lases 4ue re/resenta las clases Automvil # Coche # la relacin 4ue e0iste entre ellas& Una vez 4ue se tiene una clase se /odr)n crear ob etos de esa clase # definir variables 4ue referencien a tales ob etos& "a forma de declarar esas variables es similar a la #a descrita /ara los ti/os /rimitivos&
Fdeclaraci! ob(eto< 99G 2"i!al3 Ftipo< Fide!ti"icador< 2G !e; F!ombre#clase<12parametros3437

F <> F

Disear # Programar todo es em/ezar

%igura :@&F 6e/resentacin U!" del e em/lo del Automvil # el Coche&

Por e em/lo3 /ara declarar una variable miCoche 4ue referencie a ob etos de la clase Coche deberemos escribir:
Coche miCoche7

T /ara crear un ob eto:


miCoche G new Coche147

Tambin es /osible declarar la referencia # crear el ob eto en una Hnica instruccin& Por e em/lo:
Coche miCoche G new Coche147

Una vez creado un ob eto3 /odemos acceder a sus mtodos # /ro/iedades utilizando la variable 4ue lo referencia # el identificador del miembro al 4ue se desea acceder se/arado /or un /unto& Por e em/lo:
miCoche.velocidad G BJ7 miCoche.acelerar1BC47

<&=&: "as /ro/iedades en detalle


"as /ro/iedades3 o cam/os3 sirven /ara dotar de estado al ob eto o a la /ro/ia clase& "as /ro/iedades son variables 4ue se definen dentro de una clase # 4ue /ueden tomar valores diferentes en cada ob eto& .stas variables corres/onden a ti/os /rimitivos o a referencias a ob etos& Una referencia a un ob eto es una variable cu#o contenido a/unta a un ob eto de una clase o a un identificador de referencia vac5a 7!ull8& Ti/o referencia a ob eto

A#tes
>

Descri/cin 6eferencia a un ob eto 4ue cum/le un ti/o

'alor /or defecto


!ull

. em/lo de uso
Coche c G b7

Al definir el identificador de estas variables se debe seguir las mismas reglas 4ue /ara las variables de ti/os /rimitivos& .s decir3 el identificador /uede estar formado /or cual4uier cadena de caracteres Unicode siem/re 4ue no comience /or un nHmero o un s5mbolo utilizado /or $ava /ara los o/eradores3 ni coincida con una /alabra reservada del lengua e& Adem)s3 el identificador de la /ro/iedad no /uede coincidir con el nombre de la clase3 ni en una clase /uede *aber dos /ro/iedades con el mismo identificador& "a definicin de una /ro/iedad en una clase sigue la gram)tica ad unta& .n caso de omitirse la inicializacin la /ro/iedad toma el valor /or defecto&
Fpropiedad< 99G 2mod co!trol acceso3 2mod uso3 Ftipo< Fide!ti"ica< 2G i!iciali&acio!37

"os modificadores de control de acceso m)s *abituales son public # private3 indicando si /uede o no /uede accederse a la /ro/iedad desde fuera de la clase& 6es/ecto a los modificadores de uso lo m)s *abitual es no /oner nada o /oner "i!al /ara indicar 4ue su valor no cambia& (omo #a se *a dic*o3 se /ueden distinguir dos ti/os de /ro/iedades: /ro/iedades de los ob etos # /ro/iedades de la clase 7tambin llamadas est)ticas8& "as /rimeras se /ueden consultar en los ob etos 4ue se creen de esa clase # las segundas sobre la /ro/ia clase& (uando la /ro/iedad es est)tica se debe usar el modificador de uso static&

F <9F

(a/5tulo <

+ntroduccin al lengua e $ava

Acceso a las /ro/iedades de ob eto Para acceder a las /ro/iedades de ob eto se utiliza el identificador del ob eto seguido del identificador de la /ro/iedad se/arados /or un /unto& As53 /ara asignar el valor > a la /ro/iedad !umRuedas del ob eto miCoche se /odr5a *acer:
miCoche.!umRuedas G L7

De nuevo3 si se desea acceder a una /ro/iedad de un ob eto desde dentro de un mtodo no est)tico de la /ro/ia clase no es necesario *acer referencia al /ro/io ob eto3 sino 4ue se /uede invocar al nombre de la /ro/iedad directamente& Por e em/lo:
)** * Declaraci! de la clase coche * ?versio! H.C *) class Coche / public int !umRuedas7 )** * ATade ruedas a u! coche * ?deprecated %e ha decidido !o ma!te!er este m0todo *) public void aTadirRuedas14 / !umRuedasOO7 8

Acceso a las /ro/iedades de clase 7/ro/iedades est)ticas8 "as variables est)ticas son a4uellas cu#a e0istencia es inde/endiente de 4ue *a#a ob etos de la clase a la 4ue /ertenecen& Para acceder3 desde fuera de la clase3 a las /ro/iedades est)ticas de una clase se utiliza el nombre de tal clase seguido de un /unto # del nombre de la /ro/iedad& Por e em/lo3 sumar : a la /ro/iedad !umero^!idadesAe!didas de la clase Coche3 4ue es comHn /ara todos los ob etos de la clase3 se /odr5a *acer as5:
Coche.!um^!idadesAe!didasOO7

(omo siem/re3 si se accede a una /ro/iedad est)tica de una clase desde dentro del )mbito de la /ro/ia clase no es necesario *acer referencia a la clase&
)** * Declaraci! de la clase coche * ?versio! K.C *) class Coche / public static int !um^!idadesAe!didas G C7 )** * Aume!ta el !_mero de u!idades ve!didas *) public void ve!der^!idad14 / !um^!idadesAe!didasOO7 8 ))Blo.ue de i!iciali&aci! est@tico static / !um^!idades G HJ7 8

"a referencia this "a /ro/iedad this es una referencia no modificable al /ro/io ob eto en el 4ue se invoca #3 /or lo tanto3 se /uede utilizar en todos los mtodos no est)ticos de un ob eto& Permite /asar referencias del /ro/io ob eto en el 4ue se invoca a otros ob etos& Tambin sirve /ara referirse a /ro/iedades de la /ro/ia clase3 resolviendo la ambigQedad 4ue a/arece cuando un mtodo tiene /ar)metros o variables con nombres iguales a las /ro/iedades de la clase& Por e em/lo:
)** * Declaraci! de la clase coche * ?versio! L.C *) class Coche / int velocidad7

))declaraci! de u!a propiedad

F <? F

Disear # Programar todo es em/ezar


)** * Acelera el coche * ?param velocidad Aume!to e! la velocidad *) public void acelerar1int velocidad4 / ))+ar@metro de i,ual !ombre a propiedad this.velocidad OG velocidad7 ))%e suma el par@metro sobre la propiedad 8

<&=&< "os mtodos en detalle


"os mtodos 7tambin llamados mensa es8 son funciones definidas dentro la clase # 4ue se invocan sobre los ob etos creados de esa clase o sobre la clase misma& (ada mtodo consta de un identificador 4ue nuevamente /uede estar formado /or cual4uier cadena de caracteres Unicode3 siem/re 4ue no comiencen /or un nHmero o un s5mbolo utilizado /ara los o/eradores3 ni coincida con una /alabra reservada& .l siguiente cuadro muestra la gram)tica de definicin de un mtodo&
Fm0todo< 99G 2Modi"icador de co!trol de acceso3 2Modi"cador de uso3 Ftipo< FIde!ti"icador<12par@metros34 2excepcio!es3 2/2se!te!cia3*83 Fpar@metros< 99G Ftipo< Fide!ti"icador<2EFtipo< Fide!ti"icador<3* Fexcepcio!es< 99G thro;s Ftipo< 2EFtipo<3*

Obsrvese 4ue o/cionalmente los mtodos /ueden declarar el lanzamiento de e0ce/ciones mediante la /alabra reservada thro;s seguida del ti/o de e0ce/cin lanzada& Dic*o ti/o debe ser Exceptio! o un derivado& A su vez3 /ara lanzar una e0ce/cin en el cuer/o del mtodo se utiliza la /alabra reservada thro; seguida del ob eto lanzado& .n el ca/5tulo siguiente se tratar) con m)s detalle del mane o de e0ce/ciones& Tambin en los mtodos3 los modificadores de control de acceso m)s *abituales son public # private3 /ara indicar si /uede o no /uede invocarse un mtodo desde fuera de la clase& 6es/ecto a los modificadores de uso3 lo m)s *abitual es utilizar "i!al /ara indicar 4ue su im/lementacin no /uede cambiarse mediante *erencia o abstract /ara indicar 4ue el mtodo no tiene im/lementacin # solo define una interfaz& Por otro lado3 cuando el mtodo es est)tico se debe usar el modificador de uso static& .ste ti/o de mtodos no tiene acceso a las /ro/iedades no est)ticas& Acceso a los mtodos de un ob eto Para acceder a un mtodo de un ob eto se utiliza el identificador del ob eto seguido del identificador del mtodo& Ambos nombres se dis/onen se/arados /or el car)cter /unto # van seguidos de unos /arntesis 4ue /ueden contener los /ar)metros 4ue se le /asan al mtodo& Por e em/lo:
miCoche.acelerar1BC47

Si se desea acceder a un mtodo de una clase desde otro mtodo no est)tico de la /ro/ia clase se /uede invocar al nombre del mtodo directamente sin ante/oner ningHn nombre& Acceso a los mtodos de una clase 7mtodos est)ticos8 Para acceder a los mtodos est)ticos de una clase se utiliza el nombre de la clase seguido del nombre del mtodo se/arados /or el car)cter /unto3 siendo innecesario referir la clase si se invoca en el )mbito de la /ro/ia clase& Devolucin de valores "os mtodos en $ava /ueden devolver valores de ti/os /rimitivos o referencias a ob etos& Para ello se utiliza una sentencia 4ue consiste en la /alabra reservada retur! seguida o/cionalmente de una e0/resin& .sta e0/resin tras evaluarse corres/onder) a una referencia a un ob eto o a un ti/o /rimitivo& "os mtodos 4ue declaran el ti/o del valor devuelto con la /alabra reservada void no devuelven nada& .n estos mtodos3 el uso de retur! 7sin e0/resiones a su derec*a8 no es obligatorio3 /ero /uede utilizarse /ara terminar la e ecucin del mtodo en cual4uier /unto&
Fsalida< 99G retur! 2Fexpresi!<37

F <@F

(a/5tulo <

+ntroduccin al lengua e $ava

Paso de /ar)metros .l /aso de /ar)metros a un mtodo en $ava siem/re es /or valor& Tanto los ti/os /rimitivos como las referencias a los ob etos se /asan /or valor& As53 un cambio de uno de estos /ar)metros dentro de un mtodo no afecta a su valor en el e0terior& Sin embargo3 en el caso de referencias a ob etos debe tenerse en cuenta 4ue el ob eto al 4ue referencian estos /ar)metros s5 es el original& Por lo tanto cual4uier cambio en el estado del ob eto tiene refle o fuera del mtodo& "os /ar)metros 4ue se /asan a un mtodo tambin admiten el modificador "i!al /ara indicar 4ue no es /osible cambiar su valor& Sobrecarg a de mtodos 7/olimorfismo est)tico8 Se /ueden definir varios mtodos con el mismo identificador siem/re 4ue las secuencias de ti/os de sus /ar)metros sean diferentes& .l com/ilador de $ava es ca/az de decidir a 4u mtodo se est) invocando en funcin de los /ar)metros 4ue se le /asan& A esta /ro/iedad3 4ue /ermite usar un mismo nombre # 4ue en cada caso tenga diversas inter/retaciones3 se le denomina /olimorfismo est)tico o sobrecarg a 3 # se resuelve de manera est)tica en la com/ilacin& "a sobrecarga suele utilizarse /ara dotar de *omogeneidad a los interfaces3 al /ermitir 4ue los mtodos 4ue *agan algo similar con diferentes /ar)metros de entrada /uedan com/artir el mismo identificador& A diferencia de otros lengua es como (OO3 en la definicin de un mtodo de $ava no se /ueden definir valores /or defecto /ara sus /ar)metros& Sin embargo3 gracias a la sobrecarga3 se /uede realizar variaciones de un mtodo con diferentes /ar)metros obteniendo la misma funcionalidad& Por e em/lo3 el siguiente fragmento de cdigo define la funcin "re!ar dentro de la clase Coche3 utilizando /or defecto una reduccin de : en la velocidad& Adem)s3 e0iste otro mtodo Fre!ar 4ue realiza el frenado utilizando el valor 4ue se le /asa como /ar)metro&
)** * Declaraci! de la clase coche * ?versio! J.C *) class Coche / private int velocidad7 )** * Acelera el coche *) public void acelerar14 / velocidadOO7 8 )** * Fre!a el coche *) public void "re!ar14 / "re!ar1B47 8 )** * Fre!a el coche u!a cierta ca!tidad * ?param v ca!tidad de velocidad a "re!ar *) public void "re!ar1int v4 / velocidad =G v7 8

<&=&= (reacin de ob etos


Se *a e0/licado 4ue /ara crear un ob eto en $ava se usa la /alabra reservada !e; seguida del nombre de la clase # unos /arntesis& .n esta o/eracin se est) invocando al constr uctor de la clase& "os constructores son mtodos es/eciales 4ue se e ecutan cuando se crea un ob eto # 4ue se utilizan /ara iniciar las /ro/iedades del ob eto& De *ec*o3 las /ro/iedades finales solo se /ueden modificar en los constructores # en los blo4ues de inicializacin de los 4ue *ablaremos m)s adelante& "os constructores3 como todos los mtodos3 /ueden tener /ar)metros3 aun4ue no /ueden declarar ningHn ti/o de retorno3 # se distinguen /or4ue tienen el mismo nombre 4ue la clase a la 4ue /ertenecen& Jormalmente3 una clase /uede tener varios constructores3 aun4ue no /uede tener dos constructores 4ue reciban los mismos /ar)metros 7es decir3 con el mismo nHmero de /ar)metros3 de los mismos ti/os # en el mismo orden8& Si en el cdigo fuente de una clase no se define ningHn constructor3 $ava3 al com/ilar3 aade un constr uctor /or defecto 4ue no tiene /ar)metros& .ste constructor no im/lementa ningHn cdigo # su definicin no a/arece de manera e0/l5cita en el cdigo& Sin embargo *emos visto 4ue se utiliza e0/l5citamente cuando se crean ob etos& (uando en el cdigo de una clase se define uno o m)s constructores3 $ava no aade el constructor /or defecto& Si se desea mantener un constructor sin /ar)metros se debe definir e0/l5citamente en el cdigo de la clase& F <; F

Disear # Programar todo es em/ezar A continuacin se muestra un e em/lo de un constructor /ara la clase (oc*e:
)** * Declaraci! de la clase coche * ?versio! J.B *) class Coche / private parado G true7 private final int matricula7 private int velocidad7 )** Co!stru5e coches asi,!a!do valores a al,u!as de sus propiedades *) public Coche1int vE boolean e!Movimie!toE int !umMatricula4 / velocidad G v7 parado G Ue!Movimie!to7 matricula G !umMatricula7 ))^!a propiedad "i!al se i!icia e! u! co!structor 8 )) %i se desea usar el co!structor si! par@metros es !ecesario de"i!irlo expl>citame!te )** Co!stru5e coches asi,!a!do valor aleatorio a la matr>cula *) public Coche14 / matricula G ra!d147 )) El atributo velocidad se i!iciali&a co! u! valor por de"ecto aleatorio 8

<&=&> Destr uccin de ob etos


"a destruccin de ob etos se realiza de manera autom)tica mediante un mecanismo conocido como la recoleccin de basura& Para ello la m)4uina virtual de $ava revisa de manera /eridica los blo4ues de memoria reservados buscando a4uellos 4ue no est)n siendo referenciados /or ninguna variable /ara liberarlos& "a tarea 4ue realiza esta o/eracin se llama recolector de basura 7garbage collector 8 # se e ecuta en segundo /lano intentando a/rovec*ar los tiem/os de ba a intensidad de /roceso& Podr5a /ensarse 4ue un sistema de liberacin de memoria e0/l5cito 7como el de (OO8 /uede ser me or 4ue uno basado en recoleccin autom)tica& Debe tenerse en cuenta 4ue en un sistema de *ardware multi/roceso3 la recoleccin de basura /odr5a realizarse en un *ilo a/arte 3 lo cual *ar5a 4ue no se robase tiem/o de /roceso al *ilo 4ue e ecuta el /rograma /rinci/al& Tam/oco debe creerse 4ue la recoleccin autom)tica de basura elimina la /osibilidad de 4ue se /roduzcan /erdidas de memoria& .s cierto 4ue la memoria nunca se /ierde3 en el sentido de no liberar memoria 4ue no es a/untada /or ningHn ob eto& Sin embargo3 la memoria /uede llenarse de ob etos 4ue aun4ue #a no son Htiles3 aHn se mantienen al estar a/untados /or otros& %inalizadores "os finalizadores son mtodos 4ue se e ecutan antes de la liberacin del es/acio de memoria de un ob eto& .n ellos se /ueden realizar tareas como avisar a otros ob etos relacionados de la destruccin de ste& Para aadir un finalizador a una clase basta con aadir un mtodo 4ue se llame "i!ali&e # cu#o ti/o devuelto sea void& .n general se recomienda no utilizar finalizadores dado 4ue no es /osible conocer el momento e0acto de su e ecucin&

<&=&9 Alo4ues de inicializacin


$ava /ermite definir blo4ues de inicializacin& .stos blo4ues se definen mediante )mbitos annimos en el interior de las clases3 # se e ecutan de manera /revia a cual4uier constructor siguiendo el orden en el 4ue estn /resentes& ,abitualmente se utilizan /ara im/lementar cdigo de inicializacin comHn a todos los constructores&
Adem)s3 si un blo4ue est) eti4uetado como static se e ecuta slo una vez durante la construccin de la clase& Siendo en este caso su /rinci/al utilidad la de iniciar variables est)ticas de la clase 4ue re4uieran de algHn tratamiento com/le o& Por e em/lo3 se /uede considerar 4ue un coc*e siem/re est) /arado cuando se crea& .n este caso se /odr5a definir un blo4ue de inicializacin como el siguiente&
)** * Declaraci! de la clase coche * ?versio! J.H *) class Coche / private int velocidad7 private final int !umRuedas7 private final int !um+uertas7 private boolean parado7 public i!t !um^!idadesAe!didas7 )** * * * Co!structor .ue permite co!struir u! coche i!icia!do ciertos par@metros ?param v velocidad ?param e!Movimie!to ?param !+uertas +uertas del coche *)

F <DF

(a/5tulo <

+ntroduccin al lengua e $ava

public Coche1int vE boolean e!Movimie!toE int !+uertas4 / velocidad =G v7 parado G Ue!Movimie!to7 !um+uertas G !+uertas7 8 )** Co!structor .ue permite co!struir u! coche si! pasar par@metros *) public Coche14 / )) os atributos se i!iciali&a! a los valores por de"ecto 8 )) Blo.ue de i!iciali&aci! com_! a todos los co!structores )) as propiedades "i!ales tambi0! se puede! i!iciar a.u> / e!Marcha G "alse7 !umRuedas G L7 8 )) Blo.ue de i!iciali&aci! est@tico .ue solo se e(ecuta u!a ve& static / !um^!idadesAe!didas G C7 8

<&=&? "os modificadores de control de acceso a los miembros en detalle


.stos modificadores son *erramientas 4ue /ro/orciona $ava /ara facilitar la enca/sulacin& Se utilizan al definir cada miembro # es/ecifican la visibilidad de ese miembro desde otras clases& "os modificadores de control de acceso son:

/ublic &F Si la clase A tiene un miembro declarado como public ese miembro es accesible desde cual4uier clase 4ue vea la interfaz de A& /rivate &F Si la clase A tiene un miembro declarado como private ese miembro slo es accesible desde los mtodos de la clase A& /rotected &F Si la clase A tiene un miembro declarado como protected ese miembro es accesible desde los mtodos de la clase A3 /or las clases 4ue *ereden de A3 # /or las clases definidas en el mismo /a4uete&
Si no se es/ecifica ningHn modificador de control de acceso el miembro declarado es de ti/o friendl# & .stos miembros son visibles desde cual4uier clase 4ue /ertenezca al mismo /a4uete3 siendo inaccesibles desde fuera del /a4uete&

<&=&@ "os modificadores de uso de los miembros en detalle


.stos modificadores se utilizan en la definicin de los miembros # /ermiten es/ecificar caracter5sticas de la im/lementacin de un miembro&

abstract &F .ste modificador slo es a/licable a mtodos& (uando un mtodo se declara abstract en una clase A ese mtodo no tiene im/lementacin en A& Adem)s la clase A /asa a ser abstracta& Una clase abstracta es una clase 4ue tiene uno o m)s mtodos abstractos& (uando una clase tiene todos sus mtodos abstractos se dice 4ue es una clase abstracta /ura& Jo se /ueden crear ob etos de clases abstractas3 #a 4ue tienen mtodos no definidos& !)s adelante se /rofundizar) en la utilidad de las clases abstractas&
.n U!" los mtodos abstractos # las clases 4ue los contienen se distinguen /or4ue el te0to corres/ondiente est) en cursiva&

static &F Un miembro definido como static no /ertenece a ninguna de las instancias 4ue se /uedan crear de una clase sino a la clase misma& Se dice 4ue los miembros declarados con static son miembros de clase3 mientras 4ue el resto son miembros de instancia& As53 una /ro/iedad static de la clase A es una /ro/iedad cu#o valor es com/artido /or todos los ob etos de la clase A& Por otro lado3 /ara llamar a un mtodo static de la clase A no *ace falta ningHn ob eto de la clase A& .n general no se recomienda el uso de miembros static /ues son a enos a la Programacin Orientada a Ob etos&
Todo /rograma en $ava comienza su e ecucin en un mtodo static denominado mai!& .ste mtodo debe encontrase en una clase 4ue tenga el mismo nombre 4ue el fic*ero 4ue la contiene& .s necesario 4ue dic*o mtodo sea est)tico /or4ue no se crea ningHn ob eto al e ecutar un /rograma # sin embargo la m)4uina virtual de $ava lo invoca& .n U!"3 las miembros est)ticos se distinguen /or4ue el te0to corres/ondiente est) subra#ado&

final &F Un miembro se declara como "i!al cuando se desea im/edir 4ue su valor /ueda ser cambiado& .n general se recomienda usar este modificador /ara todas las /ro/iedades # mtodos de las clases 4ue se definan&
"as /ro/iedades definidas como "i!al son constantes a lo largo de la vida de un ob eto& Su valor /uede definirse en tiem/o de com/ilacin3 en tiem/o de e ecucin 7en los llamados blo4ues de inicializacin83 e incluso /ueden definirse de forma tard5a en el constructor& "as referencias a ob etos declaradas como "i!al no /ueden cambiarse3 aun4ue los ob etos en s5

F =C F

Disear # Programar todo es em/ezar mismos s5 /ueden cambiar su estado& Adem)s3 /ueden utilizarse combinadas con static /ara definir constantes inmutables /ara todos los ob etos& Por otro lado3 los mtodos definidos como "i!al no /ueden cambiar su im/lementacin en clases derivadas& "a declaracin de un mtodo como final tiene dos ob etivos: fi ar el diseo # aumentar la eficiencia& "as clases finales /ermiten ligadura est)tica de las funciones lo 4ue redunda en ma#or velocidad& Tambin /ermiten fi ar razones de diseo al im/edir cambios&

native &F Permite utilizar funciones e0ternas a $ava& As53 los miembros declarados !ative se im/lementan en otro lengua e nativo de la m)4uina en la 4ue se invoca # se asocian a $ava utilizando bibliotecas de enlace din)mico mediante la $ava Jative +nterface 7$J+8& transient &F .l valor de una /ro/iedad definida como tra!sie!t no se desea 4ue se /reserve si el ob eto tiene la ca/acidad de /ersistencia& s#nc*ronized &F .ste modificador es a/licable a mtodos o )mbitos& Provoca 4ue el cdigo as5 eti4uetado slo /ueda estar siendo e ecutado /or un *ilo en cada momento /ara cada ob eto& volatile &F Una /ro/iedad as5 definida indica al com/ilador 4ue su uso no debe ser o/timizado& .sto se *ace /ara evitar /roblemas cuando la variable /ueda ser utilizada desde varios t*reads de manera simult)nea& strictf/ &F !odificador a/licable a mtodos 4ue fuerza a $ava a utilizar una aritmtica flotante inde/endiente del /rocesador /ara asegurar com/atibilidad multi/lataforma&

<&=&; !odificadores en la definicin de clases g enerales


"as clases /ueden definirse de diferentes ti/os:

/ublic &F Se utiliza el modificador public /ara indicar 4ue la clase es visible desde otros /a4uetes diferentes al /a4uete en el 4ue se im/lementa& Por el contrario una clase no definida con public slo es visible en el /a4uete en el 4ue se im/lementa& Slo /uede usarse el modificador public /or fic*ero # el nombre de la clase sobre la 4ue se use debe coincidir con el nombre del fic*ero& abstract &F Una clase abstracta es a4uella 4ue tiene al menos un mtodo abstracto # de la 4ue3 /or tanto3 no /ueden crearse instancias& "as clases abstractas deben utilizar el modificador abstract /ara indicar su car)cter& final&F Son a4uellas de las 4ue no se /uede *eredar /ara crear una nueva clase /or estar marcadas con el modificador "i!al& .n general se recomienda utilizar el modificador "i!al /ara todas las clases&

<&=&D (lases internas


Una clase interna es una clase 4ue se declara dentro de otra& Para ser m)s /recisos3 su declaracin se /uede realizar dentro del )mbito de la clase o incluso dentro de un mtodo& Su /rinci/al utilidad consiste en enca/sular la definicin de la clase /ara restringir su uso o su visibilidad&
class Coche / ... class Rueda / ... 8 8

)) a clase rueda es i!ter!a a la clase Coche

.n general las clases internas tienen varias /articularidades:


Jo se /ermite declarar miembros est)ticos en ellas& Para crear un ob eto de una clase interna es necesario 4ue se *aga desde una instancia de la clase contenedora& Desde una clase interna es /osible acceder a las /ro/iedades de la clase contenedora como si fuesen /ro/ias& Para declarar una referencia del ti/o de una clase interna fuera de la clase contenedora debe usarse la sinta0is ClaseCo!te!dora.ClaseI!ter!a&

.n la definicin de clases internas es /osible aadir los modificadores public3 private o protected& Si no se aade ningHn modificador la clase ser) visible en el /a4uete3 si se aade public ser) visible en general3 si se aade private slo ser) visible dentro de la clase en la 4ue est) definida # si se aade protected slo ser) visible dentro de la clase en la 4ue est) definida # en las clases 4ue de ella deriven& Tambin es /osible declarar una clase interna con el modificador static& "as clases internas as5 definidas se diferencian del resto de clases internas en = /articularidades:

F =:F

(a/5tulo <

+ntroduccin al lengua e $ava

.n estas clases internas se /ueden definir miembros est)ticos& Desa/arece la /osibilidad de acceder a las /ro/iedades de la clase contenedora& Tambin desa/arece la restriccin 4ue im/ide crear ob etos de la clase interna sin un ob eto de la clase contenedora&

Por Hltimo3 no se /uede cerrar este a/artado sobre clases internas sin *ablar de las clases annimas& Son clases 4ue no tienen identificador& Se utilizan cuando se *ereda de otra clase3 no se desea aadir nada a su interfaz # solo se 4uiere crear un Hnico ob eto&

<&=&:C . em/lo del /arEing


A4u5 se /resenta como e em/lo la codificacin de una clase 4ue im/lementa una estructura de datos de ti/o /ila /ara almacenar ob etos de la clase Coche& "as /ilas son unas estructuras de datos cl)sicas 4ue se caracterizan /or almacenar los elementos de manera 4ue el Hltimo en ser insertado es el /rimero en ser recu/erado& Una forma de im/lementar las /ilas consiste en utilizar una sucesin de ob etos contenedores enlazados mediante referencias& .n este caso se *a creado la clase +la&a como contenedor de ob etos Coche& (omo se /uede a/reciar en el diagrama est)tico ad unto3 la clase +ar$i!, tiene una referencia a un ob eto de la clase +la&a3 el cual a su vez tiene una referencia a un siguiente ob eto +la&a3 # as5 sucesivamente& .s im/ortante notar 4ue la siguiente a la Hltima /laza tomar) valor !ull. Obsrvese tambin3 4ue la clase +la&a se *a definido interna a la clase +ar$i!,&

%igura :;&F Diagrama est)tico de la estructura del +ar$i!,&


)** * De"i!imos la clase +ar$i!,. Este es u! +ar$i!, orde!adoE es decirE los * coches !o decide! .ue pla&a ocupa!E el par$i!, les asi,!a la libre m@s prxima. * Adem@sE tie!e pla&as i!"i!itas 1e! u!a estructura de tipo pila4 * a hacemos "i!al por.ue !o .ueremos .ue !adie pueda heredar de esta clase * ?versio! B.C *) public final class +ar$i!, / ))Como la clase +la&a solo i!teresa a +ar$i!,E se de"i!e i!ter!aE privada 5 "i!al private final class +la&a / private final +la&a a!terior7 private final Coche coche7 private +la&a1Coche !uevoCocheE +la&a pla&aA!terior4 / a!terior G pla&aA!terior7 coche G !uevoCoche7 8 public ,etCoche14 / return coche7 8

)) a pla&a actualE i!icialme!te a !ullE acepta coches e! el par$i!,. ))`o hacemos la propiedad "i!al por.ue cambia. private +la&a pla&aActual7 )** * I!serta u! coche al par$i!, *) public void ocupar+la&a1Coche coche4 / ))I!creme!tamos las pla&as ocupadas pla&aActual G new +la&a1cocheE pla&aActual47 8 )** * Comprueba si el par$i!, est@ vacio *) public boolean vacio14 / return 1pla&aActual GG null47 8

F =< F

Disear # Programar todo es em/ezar


)** * %aca u! coche del par$i!, *) public Coche desocupar+la&a14 / ))Al desocupar la _ltima pla&aE la !ueva _ltima pla&a ocupada es la a!terior Coche coche G pla&aActual.,etCoche147 pla&aActual G pla&aActual.a!terior7 return coche7 8

<&=&:: Definicin de arra#s de ob etos # de ti/os /rimitivos


$ava /ro/orciona una clase ar ra# como contenedor b)sico de ob etos # ti/os /rimitivos& Para la creacin de ob etos arra# en $ava se *a sobrecargado el o/erador corc*etes& As53 /ara la declaracin de una referencia a un ob eto arra# se utiliza el ti/o de ob etos o ti/o /rimitivo 4ue contendr) el arra# seguido de una /are a de corc*etes vac5a& (omo siem/re3 si una referencia no se inicializa su valor es !ull& Para crear un arra#3 se utiliza la /alabra reservada !e; seguida de una /are a de corc*etes con las dimensiones del arra#?& ,a# 4ue resaltar 4ue una vez dimensionado un arra# no es /osible redimensionarlo&
Ftipo< S23S Fide!ti"icador< G !e; Ftipo < 2Fdime!si!<37 Ftipo< S2323S Fide!ti"icador < G !e; Ftipo < 2Fdime!si!B<3 2Fdime!si!H<37 Ftipo< 2S23S3* Fide!ti"icador < G !e; Ftipo < 2Fdime!si!B<3 ...2Fdime!si!`<37

.l siguiente e em/lo muestra un arra# de enteros # un arra# de ob etos de la clase Coche&


int 23 vector G new int2HJ37 Coches 23 aparcamie!to G new Coches 2KC37

$ava tambin /ermite declarar im/l5citamente la dimensin de un arra# inicializ)ndolo con los elementos 4ue contiene # sin es/ecificar su dimensin&
Ftipo< S23S Fide!ti"icador< G /2ob(etosYvalores primitivosYcade!as de caracteres3*87

Por e em/lo una declaracin im/l5cita de la dimensin con inicializacin ser5a:


int 23 "ib G /BEBEHEKEJENEBK87

.l acceso a un elemento de un arra# se realiza utilizando la variable # entre corc*etes el 5ndice del elemento al 4ue se desea acceder& "os 5ndices comienzan /or cero # alcanzan como m)0imo un valor igual a la dimensin del arra# menos uno& .ste /rimer e em/lo crea un arra# de enteros # lo rellena con el valor =&
int 23 vector G new i!t2HJ37 for 1int x G C7 x F HJ7 xOO4 vector2x3 G K7

.l siguiente e em/lo crea una tabla bidimensional de ob etos de la clase Coche # una referencia a la misma& "uego inicializa cada referencia de la tabla con un ob eto Coche nuevo&
Coche 2323 tablaCoches G new Coche2HJ32KC37 for 1int x G C7 x F HJ7 xOO4 for 1int 5 G C7 5 F KC7 5OO4 tablaCoches2x3253 G new Coche147

$ava tambin /ermite definir un arra# com/uesto de otros arra#s de tamaos variables& .sta /osibilidad se /otencia con el uso de la /ro/iedad le!,th 4ue tiene la clase arra# # 4ue devuelve la dimensin del mismo& Por e em/lo3 un arra# bidimensional como el /resentado en el es4uema de la %igura :D corres/onder5a al siguiente cdigo&

Por *erencia de (3 $ava tambin /ermite definir /rimero el identificador # luego los corc*etes3 aun4ue es /referible la /rimera o/cin al 4uedar m)s claro cual es el ti/o de la variable&
?

F ==F

(a/5tulo <

+ntroduccin al lengua e $ava

int 2323 vectores G new int2H3237 vectores2C3 G new int2J37 vectores2B3 G new int2N37 for 1int x G C7 x F tabla.le!,th7 xOO4 for 1int 5 G C7 5 F tabla2x3.le!,th7 5OO4 vectores2x3253 G =B7

Por Hltimo se debe sealar 4ue /ara los arra#s com/uestos de caracteres se /ermite una sinta0is es/ecial&
char 23 cade!a G 6Esto es u! arra5:!de chars67))Arra5 de chars co! retor!o de carro

!ectores -+.-. !ectores -*. !ectores -1. -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

%igura :D&F 6e/resentacin es4uem)tica de un arra# bidimensional de enteros&

<&>& "os /a4uetes


$ava estructura las bibliotecas de software mediante /a4uetes& "os /a4uetes son agru/aciones lgicas de cdigo # constitu#en el mecanismo 4ue /ro/orciona $ava como so/orte a la modularidad 7ver ca/5tulo :8&
"os /a4uetes se organizan entre ellos en forma de )rbol # esta organizacin re/ercute en su nombre& Por e em/lo3 un /a4uete /odr5a ser es.ur(c.so"t;are # otro /a4uete contenido en ste /odr5a ser es.ur(c.so"t;are.utilidades& "as organizacin en )rbol es un mecanismo 4ue /ro/orciona $ava /ara facilitar la erar4u5a 7ver ca/5tulo :8& (ada vez 4ue se crea un /a4uete se est) es/ecificando im/l5citamente una estructura de directorios& .l /a4uete debe residir en el directorio indicado /or su nombre3 # debe ser un directorio localizable a /artir de alguno de los directorios declarados en la variable de entorno C A%%+AT' 7o en el /ar)metro classpath en la invocacin a la !)4uina 'irtual de $ava8& Por otro lado3 la /ertenencia de un fic*ero a un /a4uete se debe declarar en la /rimera l5nea de cdigo del fic*ero mediante la /alabra reservada pac$a,e seguida del nombre del /a4uete al 4ue /ertenece& .s /osible acceder a un elemento contenido en un /a4uete si se ante/one el nombre com/leto del /a4uete al nombre del elemento 7lo 4ue se conoce como nombres com/letamente calificados8& As53 /ara crear un ob eto de la clase Coche contenida en el /a4uete ^tilitarios del /a4uete Aehiculos debemos escribir:
vehiculos.utilitarios.Coche miCoche G new vehiculos.utilitarios.Coche147

Tambin se /uede utilizar la /alabra reservada import al /rinci/io de un fic*ero /ara evitar usar nombres com/letamente calificados&
import vehiculos.utilitarios.Coche7 ... Coche miCoche G new Coche147

+ncluso es /osible utilizar el asterisco /ara es/ecificar 4ue se desea im/ortar todas las clases contenidas dentro de un determinado /a4uete&
import vehiculos.utilitarios.*7 ... Coche miCoche G new Coche147

Tambin es /osible utilizar la combinacin import static /ara invocar los mtodos est)ticos de una clase sin necesidad de utilizar nombres com/letamente calificados& F => F

Disear # Programar todo es em/ezar 6esta decir 4ue una clase siem/re /ertenece a un /a4uete& Por eso3 cuando se define una clase3 si no se es/ecifica ningHn /a4uete se considera 4ue est)n en el /a4uete /or defecto3 4ue es un /a4uete asociado al directorio de e ecucin 4ue se crea autom)ticamente& .sta /r)ctica est) desaconse ada /or4ue va en contra de cual4uier /rinci/io de organizacin& Si la variable C A%%+AT' est) definida ser) necesario 4ue contenga el directorio donde se encuentran los fic*eros del /a4uete /or defecto& Si no est) definida no es necesario&

<&9& "ecturas recomendadas


1.l lengua e de /rogramacin $ava23 >V .dicin3 Wen Arnold3 $ames -osling3 David ,olmes3 Addison Gesle#3 <CC:& 1+ntroduccin a la Programacin Orientada a Ob etos con $ava23 (& T*omas Gu3 !c -raw ,ill3 <CC:&

<&?& . ercicios
. ercicio : K(u)l es la diferencia entre una /ro/iedad de clase # una /ro/iedad de instanciaL . ercicio < KPor 4u no e0iste en $ava una instruccin /ara la eliminacin de la memoria reservada con !e; 7como delete en (OO3 o dispose en Pascal8L . ercicio = .l siguiente fragmento de cdigo3 4ue corres/onde a una clase A3 contiene varios errores& Detallar en 4ue consisten los errores3 indicando cada vez la l5nea en la 4ue se /roducen&

B public B metodoB1B c4 H / K B aux G new B147 L A auxH7 L aux G c7 J aux.ATadir1HJ47 D if 1aux G c4 P auxH.Aalue1HJ47 N return aux7 M auxH G null7 BC 8

F =9F

(a/5tulo =

,erencia # genericidad en $ava

.n este ca/5tulo se introducen los as/ectos m)s relevantes de la forma en 4ue $ava da so/orte a la *erencia # a la genericidad&

=&:& "a *erencia de clases


$ava /ermite la *erencia sim/le de clases& A)sicamente la *erencia /ermite 4ue una clase co/ie de otra su interfaz # su com/ortamiento # 4ue aada nuevo com/ortamiento en forma de cdigo& "a *erencia facilita la reutilizacin del cdigo sin afectar demasiado a la deseable /ro/iedad de enca/sulacin&
!)s concretamente3 la *erencia de clases /osibilita 4ue los miembros /Hblicos # /rotegidos de una clase A sean /Hblicos # /rotegidos3 res/ectivamente3 en cual4uier clase B descendiente de A& Por ello3 los miembros /Hblicos # /rotegidos de una clase se dice 4ue son accesibles desde las clases 4ue derivan de ella& Por otro lado3 los miembros /rivados de una clase A no son accesibles en los descendientes de A& Para aadir nuevas funcionalidades3 sobre una clase B 4ue *erede de una clase A se /ueden im/lementar tantos mtodos nuevos como se desee& .n el /unto <&= se di o 4ue la definicin de una clase se corres/ond5a con:
Fclase< 99G 2Modi"icador de clase3 class Fide!ti"icador< 2par@metros3 2here!cia3 2excepcio!es3 / 2Fm0todo<YFpropiedad<YFclase<YFblo.ue i!iciali&aci!<3* 8

.l elemento *erencia debe sustituirse /or:


Fhere!cia< 99G exte!ds Fsuper clase<

.l siguiente e em/lo ilustra la *erencia&


)** * Declaraci! de la clase coche * ?versio! D.C *) class Coche / public int matricula7 private int ruedas7 private void revisar14 / ))El m0todo privado !o ser@ heredado 8 protected void "re!ar14 / ))El m0todo prote,ido s> se hereda 8 void acelerar14 / ))^! m0todo "rie!d se hereda si est@ e! el mismo pa.uete 8 public void abrir+uerta14 / ))El m0todo p_blico tambi0! se hereda 8

F =@ F

(a/5tulo =

,erencia # genericidad en $ava

)) a clase Deportivo deriva de Coche class Deportivo extends Coche / private int i!5ectores G BH7 public void turbo14 / )* AIa ACIa`E% DE A AI%IBI IDAD ruedasOO7 )) ErrorE las propiedades privadas !o so! visibles revisar147 )) ErrorE m0todo !o visible "uera de Coche *) "re!ar147 abrir+uerta147 i!5ectoresOO7 acelerar147 ))CorrectoE ))CorrectoE ))CorrectoE ))CorrectoE Fre!ar es visible e! derivados de Coche Revisar es visible siempre i!5ectores es visible e! Deportivo Acelerar es visible e! el pa.uete

class +rueba / public static void mai! 1%tri!, 23 ar,4 Deportivo d G new Deportivo147

)* AIa ACIa`E% DE A AI%IBI IDAD d.i!5ectoresOO7 ))ErrorE propiedad !o visible "uera de Deportivo d.revisar147 ))ErrorE m0todo !o visible "uera de Coche d."re!ar147 ))ErrorE m0todo !o visible "uera de Deportivo *) d.matricula G J7 d.abrir+uerta147 d.turbo147 d.revisar147 ))CorrectoE ))CorrectoE ))CorrectoE ))CorrectoE las propiedades p_blicas so! accesibles el m0todo es visible de!tro del pa.uete los m0todos p_blicos so! accesibles los m0todos p_blicos se hereda!

"a *erencia /osibilita 4ue un ob eto cum/la varios ti/os& .n efecto3 como cada clase define un ti/o3 un ob eto de una clase A cum/le el ti/o definido /or A # tambin cum/le los ti/os definidos /or todas las clases de la erar4u5a de la 4ue deriva A& .s im/ortante notar 4ue en $ava cada clase no /uede *eredar de m)s de una clase simult)neamente& .s decir3 no /ermite *erencia mHlti/le3 slo *erencia sim/le& "as erar4u5as de *erencia de clases de $ava tienen forma de )rbol& De *ec*o3 en $ava e0iste una clase llamada ab(ect de la 4ue deriva toda clase 4ue no declare derivar de otra& Por tanto3 en $ava *a# un Hnico )rbol de *erencia3 # ab(ect es su/erclase de todas las clases de $ava&

=&:&: ,erencia en clases internas


"as clases internas tambin /ueden *eredar de otras clases& .n /articular3 las clases internas est)ticas /ueden utilizar la *erencia3 consiguiendo efectivamente 4ue una clase *erede de manera aislada diferentes /artes de su interfaz de erar4u5as diferentes&

=&:&< 6edefinicin de miembros


.n una clase B 4ue deriva de una clase A es /osible redefinir los miembros accesibles de A im/lement)ndolos de nuevo& (on esto se consigue 4ue B redefina el com/ortamiento definido /or su su/erclase A& (uando un mtodo M se redefine en una clase B 4ue deriva de A3 cual4uier llamada al mtodo M sobre un ob eto de B /roduce una llamada a la im/lementacin de B # no a la de A3 4ue 4ueda enmascarada& .s /osible acceder a la im/lementacin de la su/erclase dentro de un miembro redefinido mediante el uso de la /ro/iedad /rivada super 4ue no es otra cosa 4ue una referencia a la interfaz de la su/erclase& A /artir de la versin 9 de $ava es /osible 4ue el ti/o devuelto /or el mtodo redefinido /ueda ser un ti/o derivado del ti/o devuelto /or el mtodo de la su/erclase&

=&:&= "a *erencia # los constr uctores


"os constructores accesibles de una clase A son visibles desde cual4uier clase B derivada de A3 /ero no se /uede construir ob etos de la clase B si no se redefine los constructores en B& .s decir los constructores siem/re se tienen 4ue im/lementar3 aun4ue desde un constructor de una clase B se /uede llamar al constructor de la su/erclase utilizando la /ro/iedad /rivada super& Si al definir un constructor en una clase derivada no se llama al constructor de la clase /adre $ava aade una llamada al constructor /or defecto de la su/erclase& .n el caso de 4ue la su/erclase no tenga constructor /or defecto $ava da un error de com/ilacin /or4ue al crear un ob eto no sabr) como inicializar los /ar)metros de la su/erclase& Su/ngase una clase A con dos constructores&

F =; F

Disear # Programar todo es em/ezar


class A / public A14 / ))Impleme!taci! 8 public A1int x4 / ))Impleme!taci! 8

.l siguiente fragmento crea una clase B 4ue deriva de la clase A anterior& .sta clase tiene dos constructores& .l /rimero no invoca al constructor de la su/erclase3 /or lo 4ue se invoca autom)ticamente al constructor /or defecto& .l segundo invoca a uno en es/ecial de los constructores de la su/erclase&
class B extends A / public B14 / ))`o se especi"ica co!structor por lo .ue autom@ticame!te se ))llama al co!structor por de"ecto de la superclase ))resto de la impleme!taci! 8 public B1int x4 / super1x47 )) lamada al co!structor co! par@metros de la superclase ))resto de la impleme!taci! 8

Si en la clase A el mtodo M es /Hblico no es /osible ocultarlo en ninguna clase B derivada de A redefiniendo M como /rivado& .l intento de ocultar un mtodo 4ue es /Hblico en una su/erclase da un error de com/ilacin /ues im/lica 4ue se intenta violar el contrato de la clase /adre& . em/lo de *erencia sobre la clase Parking .l siguiente e em/lo *ereda del +ar$i!, del e em/lo <&=&:C /ara im/lementar un +ar$i!, 4ue solo admite coc*es con matr5cula /ar& Para ello redefine el mtodo ocupar+la&a3 de manera 4ue solo invoca a la su/erclase cuando la matr5cula es /ar&
class +ar$i!,+ares extends +ar$i!, / public void ocupar+la&a1Coche c4 / if 1c.matricula W H GG C4 super.ocupar+la&a 1c47 8 8

=&<& Polimorfismo din)mico


.n $ava un ob eto de un ti/o T /uede estar referenciado /or una referencia del ti/o T o /or una referencia de cual4uier ti/o del 4ue T derive& As53 $ava /ermite asignar el contenido de una referencia de una clase B a una referencia de una su/erclase de B& Por e em/lo si la clase B deriva de la clase A se /uede *acer:
B b G new B147 A a7 a G b7

.ste mecanismo /ermite 4ue una misma referencia /ueda a/untar en la misma e ecucin a ob etos de clases diversas& (uando esto se une a la redefinicin de mtodos se da la circunstancia de 4ue en com/ilacin no /uede decidirse a 4u im/lementacin se invoca cuando se llama a un mtodo& .sta decisin se tomar) en e ecucin de/endiendo del ob eto sobre el 4ue se invo4ue& (omo #a se e0/lic en el ca/5tulo :3 a esta /ro/iedad3 4ue /ermite usar un mismo nombre # 4ue en cada caso /rovoca diferentes e ecuciones3 se la denomina /olimorfismo din)mico3 #a 4ue se resuelve en e ecucin& .l siguiente e em/lo ilustra este com/ortamiento& Su/ngase 4ue la clase C # la B derivan de la clase A& Su/ngase adem)s3 4ue la clase A tiene un mtodo M 4ue de a /ara sea im/lementado /or la clase B # la C& (uando en el fragmento de cdigo ad unto se invoca al mtodo M es im/osible /redecir a /riori si se e ecuta la im/lementacin de la clase B o de la clase C&

F =DF

(a/5tulo =
A a7

,erencia # genericidad en $ava

if 1Math.ra!dom14 < C.J4 a G new B147 else a G new C147 a.M147

. em/lo del ueg o de coc*es Su/ongamos 4ue deseamos construir un uego de simulacin de ti/o /ersecucin de coc*es& As5 tendr5amos de/ortivos3 ambulancias3 camiones&&& Todas estas clases /odr5an derivar de una clase Automvil3 de manera 4ue se a/rovec*ase la definicin comHn de /arte de la im/lementacin& (ada clase aadir5a los detalles relativos a esa clase /articular& As5 la clase ambulancia aadir5a el mtodo e!ce!der%ire!a143 o la clase camin /odr5a tener la /ro/iedad booleana estaCar,ado& Adem)s3 si a la clase Aeh>culo aadimos el mtodo abstracto /i!tar14 cada clase derivada /odr) im/lementarlo de acuerdo a su car)cter& As5 la clase Ambula!cia /intar) una furgoneta blanca con una cruz ro a3 mientras 4ue la clase Deportivo /odr5a /intar un %errari ro o&
Auto)ovil +Pintar()

A)/ulancia +Encen%er/irena01 +Pintar01

Ca)ion -esta2car3a%o +Pintar01

Deportivo +Pintar01

%igura <C&F $erar4u5a /ara el uego de coc*es&

Pueda claro en este e em/lo 4ue cada una de estas clases 7 Deportivo3 Ambula!cia3 Cami!&&&8 son de la clase Automvil3 # /or lo tanto una referencia de ti/o Automvil /odr5a referenciar tanto a un Deportivo como a un Cami!& .s m)s3 desde una referencia del ti/o Automvil /odr5amos invocar al mtodo /i!tar143 aun4ue a /riori no /odr5amos saber el resultado3 /ues la referencia /uede a/untar a uno u otro de los diferentes ti/os de ve*5culos& .ste com/ortamiento es altamente Htil al realizar /rogramas de una com/le idad media o elevada3 #a 4ue /ermite al desarrollado traba ar con abstracciones de un nivel su/erior3 sin /reocu/arse de los detalles de las abstracciones de nivel inferior& As53 /or e em/lo3 /odr5amos tener un ob eto encargado de refrescar la /antalla recorrindose una estructura genrica 4ue almacena ob etos de la clase 'e*5culo& Tal ob eto no es necesario 4ue conozca la interfaz /articular de los diferentes ti/os de ve*5culos3 slo *ace falta 4ue invo4ue el mtodo +i!tar de cada Automvil 4ue contenga la estructura& Una im/lementacin /ara las clases descritas /odr5a ser:
class Automvil / public void pi!tar147 8 class Ambulacia extends Automvil / public void pi!tar14 / %5stem.out.pri!tl!16%o5 u!a ambulacia647 8 public void e!ce!der%ire!a14 / %5stem.out.pri!tl!16IIIIIIIIIAAAAAAAAAA647 8 8 class Camio! extends Automvil / private boolean estaCar,ado G "alse7 public void pi!tar14 / if 1estaCar,ado4 %5stem.out.pri!tl!16%o5 u! cami! car,ado647 else %5stem.out.pri!tl!16%o5 u! cami!647 8 8 class Deportivo extends Automvil / public void pi!tar14 / %5stem.out.pri!tl!16%o5 u! Deportivo647 8 8

F >C F

Disear # Programar todo es em/ezar

=&<&: .l casting de referencias a ob etos


.n $ava no se /ermite asignar directamente el contenido de una referencia de un ti/o T a una referencia de un ti/o derivado de T& Sobre el e em/lo anterior se ve claramente 4ue un ob eto de la clase Ambula!cia es necesariamente un ob eto de la clase Automvil& Jtese 4ue el reci/roco no es cierto: un ob eto de la clase Automvil no tiene /or4ue ser /recisamente de la clase Ambula!cia 7/ues /odr5a ser otra clase derivada de Automvil8& .s /ara /revenir este ti/o de errores /or lo 4ue no se /ermite asignar directamente el contenido de una referencia de un ti/o T a una referencia de un ti/o derivado de T& Sin embargo3 aun4ue la asignacin mencionada no se /uede realizar directamente3 s5 se /uede *acer cuando /reviamente se realiza una o/eracin de casting& .l siguiente e em/lo ilustra el uso del casting:
Ambula!cia a G new Ambula!cia147 Automvil b G a7 Ambula!cia c G 1Ambula!cia4 b7 ))A.u> se hace el casti!,

.l casting indica al com/ilador un ti/o al 4ue deber) /ertenecer el ob eto referenciado /or b cuando se e ecute el /rograma& Obsrvese 4ue debido al /olimorfismo el com/ilador no /uede com/robar el ti/o en com/ilacin& Por ello3 si durante su e ecucin el ob eto no /ertenece al ti/o es/ecificado en el casting se /roducir) un error en forma de e0ce/cin& Debido a la /osibilidad de 4ue en e ecucin se generen este ti/o de errores3 una buena norma ser5a no utilizar el casting nunca& Desgraciadamente su uso es im/rescindible en algunas ocasiones& Por e em/lo3 al recu/erar un ob eto de un contenedor genrico # 4uerer /oder acceder a la interfaz es/ec5fica del ob eto recu/erado& .n estos casos debe minimizarse su utilizacin3 enca/sulando el casting dentro de unos /ocos mtodos /ara 4ue slo se utilice en /artes mu# controladas del cdigo& .n $ava /uede usarse la /alabra reservada i!sta!ceo" /ara com/robar la /ertenencia de un ob eto a una clase # con ello asegurar un correcto funcionamiento del casting&
if 1x instanceof Coche4 / Coche c G 1Coche4 x7 8

Sin embargo este ti/o de com/robaciones debe evitarse en lo /osible3 /ues *ace 4ue se creen de/endencias fuertes entre clases 4ue lgicamente no deber5an de/ender entre si& As53 el uso de i!sta!ceo" es en general contrario a la modularidad # normalmente es innecesario si se utiliza adecuadamente el /olimorfismo& . em/lo del vector de ob ects Se desea construir una clase AectorDi!amico 4ue /ermita almacenar ob etos de clase ab(ect o de cual4uier clase 4ue *erede de sta 7# /or tanto de cual4uier clase de ob eto8&
public class AectorDi!amico / private int dime!sio! G C7 private ab(ect arra523 G null7 AectorDi!amico1int dime!sio!4 / redime!sio!ar1dime!sio!47 8 public int dime!sio!14 return dime!sio!7 8 /

public void po!er1int posE ab(ect o4 / if 1pos <G dime!sio!4 redime!sio!ar1posOBCCC47 arra52pos3 G o7 8 public void redime!sio!ar1int dime!sio!4 / if 1this.dime!sio! <G dime!sio!4 return7 ab(ect !uevo#arra523 G new ab(ect2dime!sio!37 for 1int co!t G C7 co!t F this.dime!sio!7 co!tOO4 !uevo#arra52co!t3 G arra52co!t37 arra5 G !uevo#arra57

F >:F

(a/5tulo =
8

,erencia # genericidad en $ava

dime!sio! G this.dime!sio!7

public ab(ect obte!er1int pos4 throws Exceptio! / if 1pos F dime!sio!4 return arra52pos37 else throw new ErrorAector16AectorDi!amico.obte!er149 Est@ vac>o647 8

class ErrorAector extends Excepctio! / public %tri!, error7 ErrorAector1stri!, error4 / this.error G error7 8

.l clase AectorDi!amico /ermitir) almacenar cual4uier ti/o de ob eto3 /ero al recu/erarlo se deber) *acer casting a una clase concreta /ara /oder utilizar el ob eto& .sto /uede *acer azaroso el uso de una estructura genrica3 #a 4ue al recu/erar un ob eto de la estructura no se sabe con seguridad de 4ue ti/o es el ob eto& Una buena solucin es controlar el acceso a tal estructura de manera 4ue slo sea /osible insertar en ella ob etos de un ti/o& .sto se /uede *acer creando una clase 4ue contenga la estructura AectorDi!amico como /ro/iedad /rivada3 # 4ue tenga mtodos /Hblicos /ara insertar # obtener elementos del ti/o concreto 4ue se desee en la estructura& . em/lo del a/arcamiento de coc*es .n el siguiente e em/lo utiliza la clase AectorDi!amico /ara crear una nueva clase Aparcamie!to 4ue /ermita la insercin # obtencin de ob etos Hnicamente de la clase Coche&
VectorDinamico dimension : int Aparcamiento + Aparcamiento(in capacidad : int) 1 1 + aparcar(in pos : int, in c : Automovil) + retirar() : Automovil

+ dimension() : int + poner(in pos : int, in valor : Object) + obtener() : Object + redimensionar(in dim : int) + VectorDinamico(in dim : int)

%igura <:&F 6elacin de asociacin entre el vector din)mico # el a/arcamiento&


class Aparcamie!to / private AectorDi!amico datos7 public Aparcamie!to1int dime!sio!4 / datos G new AectorDi!amico1dime!sio!47 8 public void aparcar1int posE Automvil c4 / datos.po!er1posE c47 8 public Coche retirar1int pos4 / return 1Coche4 datos.obte!er1pos47 8

Obsrvese 4ue no es /osible usar *erencia /ara 4ue Aparcamie!to *erede de AectorDi!amico3 #a 4ue la clase Aparcamie!to *eredar5a los mtodos 4ue /ermiten insertar cual4uier ab(ect # no se *abr5a conseguido nada&

=&=& "as interfaces


Se *a dic*o 4ue cuando se define una clase de ob etos se define la interfaz # la im/lementacin de los ob etos 4ue cum/len dic*a clase& ,a# 4ue aadir 4ue $ava tambin /ermite definir una interfaz sin tener 4ue definir su im/lementacin& "a declaracin de una interfaz se realiza mediante la siguiente estructura&
i!ter"ace Fid#i!ter"a&< 2exte!ds Fid#i!ter"a&< 2Fid#i!ter"a&<3*3 3 / 2propiedades est@ticas "i!ales Y declaraci! de m0todos Y i!ter"a& i!ter!a3* 8

F >< F

Disear # Programar todo es em/ezar "as interfaces se /ueden ver como clases abstractas /uras& .s decir3 clases 4ue slo declaran mtodos # /ro/iedades est)ticas finales3 # 4ue no definen el com/ortamiento de ningHn mtodo& As53 cual4uier /ro/iedad definida en una interfaz es est)tica # final3 mientras 4ue cual4uier mtodo es abstracto # /Hblico& "a definicin de interfaces constitu#e el segundo mecanismo 4ue /ro/orciona $ava /ara definir ti/os& $ava /ermite 4ue una clase declare 4ue im/lementa una o m)s interfaces simult)neamente3 lo cual e4uivale a la *erencia mHlti/le de clases abstractas& (uando una clase declara 4ue im/lementa una o varias interfaces indica con ello 4ue se res/onsabiliza de definir el com/ortamiento de cada uno de los mtodos 4ue declaran esas interfaces& "a declaracin de 4ue una clase im/lementa una o varias interfaces sigue la siguiente estructura&
class Fid#clase< 2exte!ds Fid#superclase<32impleme!ts Fid#i!ter"a&<2EFid#i!ter"a&<3*3 / 2m0todosYpropiedades3 8

"as interfaces /otencian el com/ortamiento /olimrfico de $ava& .sto se debe a la /osibilidad de definir referencias a ob etos 4ue im/lementen cierta interfaz3 # a la /osibilidad #a descrita de 4ue una referencia a un ob eto 4ue cum/le un ti/o T /ueda corres/onder a cual4uier ti/o derivado de T& (omo /eculiaridad se comentar) 4ue es /osible definir interfaces internas3 definindolas dentro de clases o de otras interfaces& .n este caso3 /ara referenciarlas se usar) la misma /ol5tica 4ue /ara referenciar clases internas& Adem)s3 las interfaces internas admiten el uso del modificador private3 /ara restringir su visibilidad& . em/lo del con unto ordenado Un con unto ordenado es una estructura 4ue /ermite almacenar sin re/eticiones elementos entre los 4ue e0iste un orden lo 4ue /ermite 4ue su recu/eracin sea m)s eficiente 4ue en una bHs4ueda secuencial& A este efecto3 la estructura /odr5a consistir en un )rbol binario en el 4ue se sigue la regla de 4ue los elementos menores est)n a la iz4uierda # los ma#ores a la derec*a& Por otro lado3 /ara establecer un orden entre los elementos de este )rbol /odr5a definirse la interfaz Eleme!toarde!able& .sta interfaz tendr5a un mtodo 4ue /ermitir5a com/arar 1elementos ordenables2& As53 cual4uier clase 4ue im/lemente la interfaz Eleme!toarde!able /odr5a ordenar sus elementos res/ecto a otros elementos 4ue tambin cum/lan dic*a interfaz& Definir el criterio de ordenacin como una interfaz tiene la venta a de 4ue /ermite 4ue se /ueda a/licar a cual4uier clase #a e0istente sin m)s 4ue *eredar # declarar 4ue la nueva clase im/lementa la interfaz Eleme!toarde!able&
interface Eleme!toarde!able / public boolean ma5orbue1Eleme!toarde!able e47 8 class ArbolBi!ario / private Eleme!toarde!able eRai&7 private ArbolBi!ario arbolDerechaE arbolI&.uierda7 public ArbolBi!ario i&.uierda14 return arbolI&.uierda7 8 public ArbolBi!ario derecha14 / return arbolDerecha7 8 public Eleme!toarde!able obte!erEleme!toRai&14 / return e#rai&7 8 public void i!sertar 1Eleme!toarde!able e4 / if 1eRai& GG null4 eRai& G e7 else / if 1e.ma5orbue1e#rai&44 / if 1arbolDerecha GG null4 arbolDerecha G new ArbolBi!ario147 arbolDerecha.i!sertar1e47 8 else / if 1arbolI&.uierda GG null4 arbolI&.uierda G new ArbolBi!ario147 arbolI&.uierda.i!sertar1e47 8 8 8 /

Por Hltimo3 se /rueba la clase creada mediante el siguiente cdigo de e em/lo&

F >=F

(a/5tulo =

,erencia # genericidad en $ava

class E!teroarde!able implements Eleme!toarde!able / public int eleme!to7 public E!teroarde!able1int e4 / eleme!to G e7 8 public boolean ma5orbue1Eleme!toarde!able e4 / E!teroarde!able aux G 1E!teroarde!able4 e7 return 1eleme!to < aux.eleme!to47 8 8 class E(emplo^so / public void mai!1%tri!, ar,s234 / E!teroarde!able a G new E!teroarde!able1K47 E!teroarde!able b G new E!teroarde!able1J47 E!teroarde!able c G new E!teroarde!able1BB47 E!teroarde!able d G new E!teroarde!able1P47 E!teroarde!able e G new E!teroarde!able1BK47 ArbolBi!ario arbol G new ArbolBi!ario147 arbol.i!sertar1a47 arbol.i!sertar1b47 arbol.i!sertar1c47 arbol.i!sertar1d47 arbol.i!sertar1e47

=&>& "a g enericidad


"a g enericidad /uede definirse como una ca/acidad 4ue /ermite a un lengua e declarar ti/os mediante /ar)metros variables& "a genericidad es un mecanismo 4ue suele utilizarse /ara construir contenedores conscientes del ti/o3 de manera 4ue se eviten los /roblemas descritos al crear inseguros contenedores de ab(ets& "a genericidad es un mecanismo m)s dbil 4ue el /olimorfismo3 # ello se constata en el *ec*o de 4ue $ava crea la genericidad sobre el /olimorfismo&

=&>&: (lases e interfaces g enricas


Para dar so/orte a la genericidad3 en la versin :&9 $ava introduce el conce/to de g enrico 7similar al de tem/late /resente en (OO desde su estandarizacin AJS+ en :DD;8& "os genricos /ermiten definir /ar)metros 4ue se corres/onden con un ti/o en la definicin de una clase o una interfaz& .stos genricos dan lugar al conce/to de clase 7o interfaz8 genrica& "as clases 7o interfaces8 genricas tambin suelen denominarse clases /arametrizadas& .n el /unto <&= se defini la im/lementacin de la siguiente manera:
Fclase< 99G 2Modi". de clase3 class Fide!ti".< 2par@metros3 2here!cia3 2excepcio!es3 S/S 2Fm0todo<YFpropiedad<YFclase<YFblo.ue i!iciali&aci!<3* S8S

A*ora /odemos e0/licar 4ue el o/cional 1/ar)metros2 se utiliza /ara la genericidad # toma la siguiente forma:
parametros 99G 2SFSide!ti"icador 2exte!ds tipo32impleme!ts Ftipo<2XFtipo<3* S<S3 2ESFSide!ti"icador 2exte!ds tipo32impleme!ts Ftipo<2XFtipo<3*33*S<S3

Obsrvese 4ue a continuacin del genrico se /ueden es/ecificar restricciones /ara limitar las clases 4ue se /ueden /asar como /ar)metro en la construccin de ob etos& .s m)s3 el ti/o 4ue limita al genrico /uede ser otro genrico& Dentro de la definicin de la clase se /uede utilizar el identificador del ti/o /ara definir otras variables o valores devueltos& Por otro lado3 /ara crear ob etos de una clase /arametrizada se debe usar la siguiente sinta0is:
Fob(eto parametri&ado< 99G Fclase< SFSparamS<S Fvariable< G !e; Fclase< SFSparamS<S 12par@metros34

"a /rinci/al utilidad de las clases /arametrizadas es la de /ermitir la creacin de contenedores genricos 4ue ace/ten elementos inde/endientes de su ti/o& ,asta la versin :&> de $ava3 la genericidad se consegu5a constru#endo contenedores 4ue almacenaban ob etos de la clase ab(ect # el casting /osterior a la clase corres/ondiente& Un e em/lo lo encontramos en la clase AectorDi!amico del /unto =&<&:& .l /roblema 4ue /lantea esta forma de construir contenedores genricos es 4ue

F >> F

Disear # Programar todo es em/ezar no se im/one ninguna limitacin a los ob etos al insertarlos en el contenedor& Por ello /odr5a darse la situacin de tener un contenedor lleno # no saber de 4u clase son los ob etos contenidos& . em/lo de uso de g enricos .l siguiente e em/lo muestra cmo utilizar los genricos al crear una clase Co!cesio!ario genrica3 4ue luego ser) ca/az de generar ob etos Co!cesio!ario de ob etos Deportivo # ob etos Co!cesio!ario de ob etos ^tilitario&
)** * Clase Co!cesio!ario ,e!0rica *) class Co!cesio!arioFT extends Coche< / private T23 coches G null7 )** * Co!structor del co!cesio!ario * ?param coches arra5 co! los coches .ue co!tie!e el co!cesio!ario *) public Co!cesio!ario1final T23 coches4 / this.coches G coches7 8 )** * abtie!e todos los coches del co!cesio!ario * ?retur! arra5 co! todos los coches del co!cesio!ario *) T23 obte!erCoches14 / return coches7 8 8

A continuacin veamos los distintos ti/os de coc*es 4ue se /ueden vender 7 Deportivo # ^tilitario3 ambos im/lementando la interfaz Coche8:
)** * I!ter"a& Coche *) interface Coche / )** * Devuelve el tipo de cohe * ?retur! tipo de coche *) %tri!, tipo147 8 )** * Clase Deportivo *) public class Deportivo impleme!ts Coche / )** * Tipo de coche *) private %tri!, tipo7 )** * Co!structor de u! deportivo * ?param marca marca del coche *) public Deportivo1final %tri!, marca4 / this.tipo G 6Deportivo9 6 O marca7 8 )** * Devuelve el tipo de coche * ?retur! tipo de coche *) public %tri!, tipo14 / return tipo7 8 8 )** * Clase ^tilitario *) public class ^tilitario implements Coche / )** * Tipo de coche *) private %tri!, tipo7 )** * Co!structor de u! deportivo * ?param marca marca del coche *) public ^tilitario1final %tri!, marca4 / this.tipo G 6^tilitario9 6 O marca7 8

F >9F

(a/5tulo =

,erencia # genericidad en $ava

)** * Devuelve el tipo de coche * ?retur! tipo de coche *) public %tri!, tipo14 / return tipo7 8

%inalmente mostramos el uso de la clase Co!cesio!ario desde un mtodo mai!&


public class Co!cesio!arioMai! / public static void mai!1%tri!,23 ar,s4 / ))Creamos los coches deportivos final Deportivo23 deportivos G /new Deportivo16Ferrari64E new Deportivo16+orsche6487 ))Creamos el co!cesio!ario de coches deportivos final Co!cesio!arioFDeportivo< co!cesio!arioDeportivo G new Co!cesio!arioFDeportivo<1deportivos47 for 1Deportivo deportivo 9 co!cesio!arioDeportivo.obte!erCoches144 / %5stem.out.pri!tl!1deportivo.tipo1447 8 ))Creamos los coches utilitarios final ^tilitario23 utilitarios G /new ^tilitario16%eat64E new ^tilitario16Re!ault6487 ))Creamos el co!cesio!ario de coches utilitarios final Co!cesio!arioF^tilitario< co!cesio!ario^tilitario G new Co!cesio!arioF^tilitario<1utilitarios47 for 1^tilitario utilitario 9 co!cesio!ario^tilitario.obte!erCoches144 / %5stem.out.pri!tl!1utilitario.tipo1447 8 8 8

"a salida /ara este mai! es:


Deportivo9 Ferrari Deportivo9 +orsche ^tilitario9 %eat ^tilitario9 Re!ault

Al crear una clase /arametrizada se crea una su/erclase de la 4ue *eredar)n cada una de las clases con una /arametrizacin es/ec5fica& A esta clase se la /uede referenciar utilizando el s5mbolo de interrogacin como /ar)metro& As53 la clase AectorDi!amicoF?< es su/erclase de todas las clases AectorDi!amico3 # /uede utilizarse /ara a4uellos casos en los 4ue deseemos realizar alguna o/eracin sobre un AectorDi!amico sin im/ortarnos el ti/o de ob eto 4ue almacena& ,a# 4ue notar 4ue un ob eto de la clase Co!cesio!arioFDeportivo< # otro de la clase Co!cesio!arioF^tilitario< no com/arten el mismo ti/o3 aun4ue las clases Deportivo # ^tilitario estn en relacin de *erencia& .n los diagramas est)ticos de U!" las clases /arametrizadas se dibu an con una /e4uea ca a en su /arte su/erior derec*a 4ue denota su ti/o& ,a# 4ue notar 4ue un ob eto de la clase AectorDi!amicoFA< # otro de la clase AectorDi!amicoFB< no com/arten el mismo ti/o3 aun4ue las clases A # B estn en relacin de *erencia& As53 un ob eto de la clase AectorDi!amicoF%tri!,< no com/arte el ti/o con un ob eto de la clase AectorDi!amicoFab(ect< # no se /uede *acer el casting de un ti/o a otro&

F >? F

Disear # Programar todo es em/ezar

%igura <<&F $erar4u5a de *erencia entre clases /arametrizadas&

.l cdigo /ara crear un ob eto de la clase AectorDi!amico # utilizarlo /ara almacenar cadenas con nombres ser5a:
AectorDi!amico F%tri!,< v G new AectorDi!amico F%tri!,<1BC47 v.+o!er1CE%tri!,16-ua!6447 v.+o!er1BE%tri!,16A!dres6447

=&>&< !todos con ti/os /arametrizados


.s /osible definir ti/os genricos en el interior de las clases # utilizarlos /ara definir los /ar)metros de los mtodos # los valores devueltos /or estos& Al definir el mtodo3 las llaves angulares a/arecen des/us de los modificadores del mtodo # antes del ti/o devuelto&
public final FA exte!ds %tri!,< int tamaTo1A texto4 / return texto.si&e147 8

"os ti/os /arametrizados suelen utilizarse sobre todo en los mtodos est)ticos3 en los 4ue /or su naturaleza no /uede accederse al ti/o /arametrizado de la clase&

=&9& (onclusiones
.n este ca/5tulo se *a visto 4ue los ob etos en $ava solo /ertenecen a una clase& Sin embargo el mismo ob eto /uede cum/lir tantos ti/os como clases e interfaces *a#a en la erar4u5a de *erencia de su clase& .sto3 unido a la /osibilidad de tratar a un ob eto mediante una referencia de cual4uiera de los ti/os 4ue cum/le3 da lugar al /olimorfismo din)mico& Tambin se *a estudiado la genericidad # la im/lementacin 4ue $ava realiza de ella&

=&?& "ecturas recomendadas


1Piensa en $ava23 <V .dicin3 Aruce .cEel3 Addison Gesle#3 <CC<& .n este libro3 .cEel con un estilo desenfadado3 /resenta una obra de referencia im/rescindible /ara /rofundizar en $ava&

=&@& . ercicios
. ercicio : De la clase A se deriva la clase B& De la clase B se deriva la clase C& KDesde la clase C se /uede llamar a los mtodos /rotegidos de la clase AL . ercicio < KPuede tener alguna utilidad una clase 4ue no tiene /ro/iedades # cu#os mtodos son todos abstractosL .n caso afirmativo e0/licar cu)l ser5a&

F >@F

(a/5tulo = . ercicio =

,erencia # genericidad en $ava

"as clases 4ue im/lementen la interfaz Eleme!toarde!able /ueden determinar si un ob eto es ma#or 4ue otro& .sta interfaz slo tiene un mtodo llamado ma5orbue14 4ue devuelve true si el ob eto sobre el 4ue se /regunta es ma#or 4ue el ob eto 4ue se /asa /or /ar)metro& .s claro 4ue esta relacin de orden 4ue define sobre una clase /articular res/onde a la naturaleza singular de esa clase&
interface Eleme!toarde!able / public boolean ma5orbue1Eleme!toarde!able e47 8

Se /ide escribir el cdigo $ava corres/ondiente a un ob eto 4ue im/lemente un )rbol binario ordenado de ob etos Eleme!toarde!able& .ste )rbol cum/lir) la siguiente descri/cin: (ada nodo de ArbolBi!ario /odr) tener como m)0imo dos ramas descendentes 7una a la iz4uierda # otra a la derec*a8 4ue ser)n a su vez cada uno ob etos ArbolBi!ario& "a clase ArbolBi!ario /ermitir) navegar /or sus ramas mediante dos funciones 4ue devuelven el )rbol binario de la iz4uierda o de la derec*a& .stos mtodos tendr)n la forma:
public ArbolBi!ario i&.uierda147 public ArbolBi!ario derecha14

Se /odr) obtener el ob eto contenido en el nodo ra5z de estos )rboles mediante el mtodo:
public Eleme!toarde!able obte!erEleme!toRai&147

"a insercin de elementos en este )rbol se realiza mediante el mtodo:


public void i!sertar1Eleme!toarde!able e47

"a insercin sigue el siguiente algoritmo recursivo de dos /asos: Paso :&F Si el )rbol est) vac5o el elemento se inserta en la ra5z& Paso <&F Si el )rbol no est) vac5o se com/ara el elemento a insertar con el /resente en el nodo ra5z& Si es ma#or el nuevo elemento se intenta insertar en el sub)rbol 4ue /ende de la derec*a del nodo ra5z llamando al /aso : con el sub)rbol de la derec*a& .n otro caso se intenta insertar en el sub)rbol 4ue /enda de la iz4uierda del nodo ra5z3 llamando al /aso : con el sub)rbol de la iz4uierda&

F >; F

(a/5tulo >

.l /a4uete ava&lang

.l /a4uete m)s im/ortante de $ava es (ava.la!,& .ste /a4uete a/orta interfaces # clases tan fundamentales /ara $ava 4ue est)n integradas con el /ro/io lengua e # no es /reciso im/ortarlas& .n este ca/5tulo se estudiar) la clase ab(ect 7clase base de toda clase creada en $ava83 se estudiar)n las envolturas 7recubrimientos de los ti/os /rimitivos83 se estudiar) la clase Exceptio! 74ue /ermitir) mane ar errores8 # se introducen las interfaces Clo!able # Comparable # las clases de refle0in 74ue /ermiten obtener informacin sobre las /ro/ias clases en tiem/o de e ecucin8&

>&:& "a clase Object


Toda clase 4ue se declara en $ava # 4ue no se es/ecifica de 4u clase deriva lo *ace de la clase ab(ect& .sto tiene como consecuencia 4ue todas las clases de $ava tienen como ti/o comHn la clase ab(ect& "as venta as de una erar4u5a de ra5z Hnica son enormes& .ntre ellas se /ueden destacar dos: Todos los ob etos en Hltima instancia son del mismo ti/o # /or lo tanto /uede garantizarse ciertas o/eraciones sobre todos ellos& Por e em/lo sim/lific la creacin del recolector de basura3 #a 4ue slo *ubo 4ue im/lementar el com/ortamiento /ara la clase ab(ect& Pro/orciona muc*a fle0ibilidad a la *ora de /rogramar& Por e em/lo /ermite definir estructuras de datos 4ue almacenen ob etos de ti/o ab(ect 7# /or tanto cual4uier clase de ob etos3 /ues todas derivan de ab(ect8&

"a clase ab(ect define una serie de mtodos 4ue /ueden utilizarse sobre todos los ob etos 4ue se creen en $ava& .stos mtodos son: clo!e143 e.uals143 "i!ali&e143 ,etClass143 hashCode143 to%tri!,143 ;ait143 !oti"514 # !oti"5All14& .l mtodo to%tri!,14 devuelve una cadena asociada al ob eto& De esta forma todos los ob etos en $ava tienen una re/resentacin en forma de cadena de te0to& .l mtodo hashCode14 devuelve un entero 4ue /uede utilizarse como identificador Hnico del ob eto en la m)4uina virtual& De los mtodos ;ait143 !oti"514 # !oti"5All14 *ablaremos cuando estudiemos la concurrencia& 6efle0in (asi todos los mtodos de ab(ect utilizan los mecanismos de ref le0in de $ava& "a refle0in es una /ro/iedad mu# /otente 4ue /ermite a un /rograma revisar su /ro/io cdigo de manera din)mica3 e incluso /ermite aadir clases # miembros nuevos durante la fase de e ecucin& .l mtodo ,etClass14 de ab(ect es mu# im/ortante en este mecanismo de refle0in3 /ues devuelve un ob eto de la clase Class 4ue re/resenta la clase a la 4ue /ertenece el ob eto& "a clase Class /ermite 4ue un /rograma /ueda realizar multitud de o/eraciones con clases desconocidas en tiem/o de com/ilacin& As53 esta clase /ermite ins/eccionar los miembros de un ob eto 7,etMethod143 ,etFields143 isAbstract14&&&83 /ermite crear ob etos /ertenecientes a la clase 4ue re/resenta 7usando !e;I!sta!ce1483 e incluso /ermite ser cargada din)micamente 7mediante un ob eto de ti/o Class oader8&
clo!e14 es un mtodo /rotegido 4ue /ermite sacar una co/ia de un ob eto& .sto es im/ortante debido a 4ue3 recordemos3

el o/erador de asignacin slo co/ia la referencia& (uando la co/ia de un ob eto no slo consista en igualar los valores de sus /ro/iedades se deber) redefinir el mtodo clo!e14 en la clase derivada3 aadiendo el com/ortamiento necesario& "a im/lementacin de este mtodo realizada en la clase ab(ect solo es /osible mediante mecanismos de refle0in3 los cuales3 obsrvese3 violan la enca/sulacin3 /ues deben /ermitir acceder a /artes /rivadas de la clase derivada /ara co/iarlas& .l mtodo e.uals14 se /ro/orciona /ara realizar la com/aracin de un ob eto con otro& "a im/lementacin /or defecto3 /ro/orcionada /or ab(ect3 devuelve true slo si se est) com/arando el ob eto consigo mismo& (uando se re4uiera 4ue la com/aracin de dos ob etos no se base sim/lemente en su identidad se deber) redefinir el mtodo& .n caso de 4ue se o/te /or redefinir el mtodo e.uals tambin deber) redefinirse el mtodo hash3 de tal modo 4ue dos ob etos devuelvan el mismo hash cuando al com/rarlos con e.uals se devuelva true&

>&:&: "a clase ClassLoader


"a clase Class oader crea la /osibilidad de cargar din)micamente una clase a /artir de su cdigo com/ilado& .l siguiente fragmento de cdigo carga de disco la clase 4ue se le es/ecifica /or /ar)metros& Para ello se crea una clase 4ue *ereda de F >D F

(a/5tulo >

.l /a4uete ava&lang

Class oader # 4ue im/lementa el mtodo loadClassData de manera 4ue crea desde disco un flu o de b#tes 4ue

contiene los b#tecodes de la clase a cargar&


import (ava.io.*7 import (ava.util.Aector7

public class Car,ador extends Class oader / public Class F?< "i!dClass1%tri!, !ame4 / byte23 b G loadClassData1!ame47 return de"i!eClass1!ameE bE CE b.le!,th47 8 private byte23 loadClassData1%tri!, !ame4 / try / %tri!, !ombreG6.::6O!ameO6.class67 I!put%tream i! G new FileI!put%tream1!ombre47 Aector FB5te< bu""er G new AectorFB5te<147 int i G i!.read147 while1i UG =B4 / bu""er.add11b5te4i47 i G i!.read147 8 byte 23 aux G new b5te2bu""er.si&e1437 for 1int co!t G C7 co!t F bu""er.si&e147 co!tOO4 aux2co!t3Gbu""er.,et1co!t47 return aux7

8 catch1Exceptio! e4 / return null7 8

.l siguiente cdigo carga la clase Deportivo 4ue corres/onde a una im/lementacin de la clase Coche&
public static void mai!1%tri!,23 ar,s4 / try / Class oader loader G new Car,ador147 Class u!#coche G loader.loadClass16Deportivo647 Coche c G 1Coche4 u!#coche.!e;I!sta!ce147 c.acelerar147 8 catch1Exceptio! e4 / %5stem.out.pri!t1e.,etMessa,e1447 8 8

>&<& (lases /ara el mane o de cadenas de caracteres


$ava /ro/orciona varias clases /ara facilitar la mani/ulacin de cadenas caracteres frente al uso directo de arra#s de caracteres& .stas clases son: CharBu""er3 %e,me!t3 %tri!,3 %tri!,Builder # %tri!,Bu""er&
(om/arten todas ellas 4ue im/lementan la interfaz Char%e.ue!ce3 la cual se caracteriza /rinci/almente /or ofrecer el mtodo charAt14 # le!,th14. (ada una de estas clases a/orta ciertas venta as de uso 4ue desgraciadamente tienen un coste en eficiencia3 /or lo 4ue no se /uede elegir un enfo4ue como el menor3 sino 4ue es conveniente estudiar cu)l es la clase m)s adecuada /ara cada caso& "a clase CharBu""er es la m)s eficiente tras el arra#s de caracteres3 /ero tambin es la 4ue menos mtodos de tratamiento a/orta& "a clase %tri!, es la m)s conocida debido a 4ue todos los ob etos /oseen un mtodo to%tri!,14 /ro/orciona multitud de mtodos /ara facilitar el tratamiento de cadenas de caracteres: substri!,14E trim14E compareTo14E toCharArra514E valuea"14& "os arra#s de caracteres res/ecto a la clase %tri!, dis/onen de las /ro/iedades autobo0ing # autounbo0ing 3 de manera 4ue el com/ilador convierte un arra# de caracteres en un %tri!, # un %tri!, en un arra# de caracteres autom)ticamente& Adem)s3 se *an sobrecargado los o/eradores O # OG /ara /ermitir una notacin sim/le /ara la concatenacin de un %tri!, con otro o con cual4uier ti/o /rimitivo& Adem)s la clase %tri!, /ro/orciona mtodos est)ticos 7como valuea"148 4ue /ermiten realizar o/eraciones sin tener 4ue crear ob etos de la clase %tri!,&

F 9C F

Disear # Programar todo es em/ezar Por otro lado *a# 4ue tener en cuenta 4ue cual4uier cadena entre comillas es convertida en un %tri!, autom)ticamente /or el com/ilador3 de manera 4ue no se /ueden com/arar dos ob etos %tri!, usando el o/erador GG /ues se est) com/arando la referencia a un ob eto %tri!, # no el ob eto en si mismo&
%tri!, texto G 6^! arra5 de caracteres se co!vierte e! %tri!,67 %tri!, !umero G cade!a O 6E(emplo67 ))El operador O est@ sobrecar,ado !umero OG J7 ))El operador OG co!vierte el J e! cade!a

Una caracter5stica im/ortante de la clase %tri!, es 4ue es inmutable3 es decir3 un %tri!, no se /uede modificar& As53 aadir un car)cter a un %tri!, im/lica la creacin de un %tri!, nuevo& .ste com/ortamiento es adecuado en algunos casos3 /ero mu# /oco eficiente cuando /or e em/lo se desea construir una cadena mediante la adicin de caracteres& Por ello $ava /ro/orciona las clases %tri!,Builder # %tri!,Bu""er& .stas clases no son inmutables # /or tanto s5 /ermiten la adicin de caracteres& "a diferencia entre ambas consiste en 4ue %tri!,Builder no es resistente a colisiones cuando se utiliza desde mHlti/les *ilos simult)neamente3 mientras 4ue %tri!,Bu""er s5 lo es3 a coste de una menor eficiencia&

%igura <=&F $erar4u5a de clases de usadas /ara mani/ulacin de cadenas de te0to&

%inalmente3 la clase %e,me!t se utiliza /ara mani/ular segmentos de otras cadenas de caracteres sin necesidad de co/iarlos en un nuevo ob eto&

>&=& "as e0ce /ciones


.l mane o de errores siem/re *a constituido un as/ecto dif5cil de abordar& "a ma#or5a de es4uemas de tratamiento de errores de/enden de la disci/lina del /rogramador # se basan en la devolucin de valores o en el uso de elementos comunes a todo el cdigo 7variables o fic*eros comunes3 como el stderr de (8& Si no se sigue de forma rigurosa una estrategia bien definida res/ecto al tratamiento de errores el resultado suele ser un /rograma inestable debido a situaciones de error no contem/ladas& .n los lengua es de /rogramacin orientados a ob etos el conce/to de error se cambia /or el de la situacin e0ce/cional 4ue se /roduce cuando un ob eto no /uede cum/lir su contrato& Una e0ce/cin es un ob eto 4ue se lanza en el momento en el 4ue ocurre una situacin e0ce/cional # 4ue se ca/tura cuando esa situacin e0ce/cional /uede tratarse 7reintentando3 realizando una accin alternativa o interrum/iendo la e ecucin del /rograma8& .n $ava3 /ara lanzar una e0ce/cin se usa la /alabra reservada thro;3 # el ob eto 4ue se lanza debe ser *eredero de la clase Thro;able o de alguna subclase de sta& Al lanzar la e0ce/cin se interrum/e la secuencia normal de e ecucin3 recorrindose la /ila de llamadas *asta 4ue se encuentra un )mbito en el 4ue se ca/ture ese ti/o de e0ce/cin& Por e em/lo3 cuando el siguiente fragmento de cdigo detecta 4ue /odr5a /roducirse una divisin /or cero lanza una e0ce/cin&
... int obte!erRatioDeCo!sumo 14 / if 1$ilometrosRecorridos GG C4 throw new ArithmeticExceptio! 147 return litros ) $ilometrosRecorridos7 8

Para definir el )mbito en el 4ue se ca/tura una e0ce/cin # el )mbito de su tratamiento se utiliza la una estructura basada en los toEens tr5FcatchF"i!all5 4ue se e0/one a continuacin&
Fblo.ue tr5< 99G tr5 S/S 2FCdi,o .ue puede producir la excepci!<3 S8S 2catchS1SFtipo de excepci!<S4S S/S 2FCdi,o .ue trata la excepci!<3 S8S3O 2"i!all5 S/S 2FCdi,o .ue se e(ecuta tras el tr5 o tras los catch<3 S8S3

F 9:F

(a/5tulo >

.l /a4uete ava&lang

.l blo4ue tr5 contiene el fragmento de cdigo 4ue se 1intenta2 e ecutar& "a idea consiste en 4ue si la e ecucin de ese cdigo3 o de algHn mtodo e ecutado /or ese cdigo3 a cual4uier nivel3 genera una e0ce/cin3 /ueda ser ca/turada en el blo4ue catch corres/ondiente a su ti/o& Una e0ce/cin del ti/o T slo /uede ser ca/turada /or un gestor del ti/o T o de un ti/o ascendiente de T& .n otras /alabras3 un blo4ue catch ca/tura las e0ce/ciones del ti/o 4ue declara # de los ti/os 4ue de l deriven& .ste com/ortamiento /olimrfico *ace 4ue los catch deban situarse de m)s es/ec5ficos a m)s generales res/ecto al ti/o 4ue declaren& .n otro caso3 nunca recibir)n entradas3 al estar ecli/sados /or ti/os m)s generales& Una vez 4ue un blo4ue catch ca/tura una e0ce/cin3 la e ecucin continHa de manera normal a no ser 4ue se lance otra e0ce/cin& .s decir3 la situacin e0ce/cional desa/arece& Por ello los blo4ues catch deben situarse donde sean Htiles /ara gestionar los errores 4ue ca/turan # no antes& .l blo4ue "i!all5 contiene cdigo 4ue se desea 4ue siem/re se e ecute antes de abandonar el blo4ue tr5Icatch& .sto significa 4ue el blo4ue "i!all5 se e ecuta se /roduzca e0ce/cin o no se /roduzca3 # se ca/ture o no se ca/ture& .l blo4ue "i!all5 se e ecutar) incluso si en alguno de los blo4ues se e ecuta una instruccin retur!& Para el e em/lo anterior el tratamiento de e0ce/ciones 4uedar5a como sigue:
EEE try / obte!erRatioDeCo!sumo147 8 catch1ArithmeticExceptio! e4 / tratamie!toDeError+orExcepcio!Aritmetica1e47 8 catch1Thro;able t4 / tratamie!toDeError+orCual.uieratraExcepcio!1t47 8 finally / codi,obue%iempre%eE(ecuta147 8

>&=&: Ti/os de e0ce/ciones


.n $ava *a# dos ti/os de e0ce/ciones: controladas 7c*ecEed e0ce/tions8 # no controladas 7unc*ecEed e0ce/tions8& Si e0iste la /osibilidad de 4ue un mtodo lance e0ce/ciones controladas debe indicarlo obligatoriamente en su definicin utilizando la /alabra reservada t*rows seguida de los ti/os de ob etos 4ue /uede lanzar& Adem)s3 si un mtodo M llama a otro 4ue /uede lanzar cierta e0ce/cin E3 M debe tratar esa e0ce/cin o avisar de 4ue l tambin /uede lanzar la e0ce/cin E& "os mtodos 4ue lancen e0ce/ciones no controladas no tienen /or4u declarar 4ue lanzan ningHn ti/o de e0ce/cin& Derivada de Thro;able *a# dos clases: Error # Exceptio!& A su vez3 derivada de Exceptio! encontramos la clase Ru!timeExceptio!& (ual4uier clase 4ue derive de Error o de Ru!timeExceptio! /odr) ser utilizada /ara generar e0ce/ciones no controladas& Por otro lado3 las clases 4ue deriven directamente de .0ce/tion /ermitir)n crear e0ce/ciones controladas&

%igura <>&F $erar4u5a de clases de e0ce/cin&

Una e0ce/cin no es un valor devuelto /or una funcin& .sto *ace 4ue el tratamiento de errores se sim/lifi4ue res/ecto al mtodo de devolucin de valores3 /ues no es necesario ir com/robando tras cada llamada a cada mtodo si todo va bien o no& Adem)s3 una e0ce/cin no /uede ser ignorada3 lo 4ue garantiza 4ue la situacin e0ce/cional ser) tratada antes o des/us3 # 4ue /osiblemente ser) restablecida la e ecucin normal del /rograma&

F 9< F

Disear # Programar todo es em/ezar . em/lo de e0ce/ciones en el ParEing Si se e0amina el mtodo desocupar+la&a143 en el e em/lo de la clase +ar$i!, del /unto <&=&:C3 se com/robar) .ue cuando no /ueda cum/lir su contrato3 /or estar el ob eto +ar$i!, vac5o3 se lanzar) una e0ce/cin de ti/o !ull+oi!terExceptio!& Si se desease 4ue el /rogramador3 usuario de la clase +ar$i!,3 obtuviese una e0/licacin m)s detallada del /roblema se /odr5a utilizarse una e0ce/cin es/ec5fica& .l siguiente fragmento de cdigo define una clase derivada de Ru!timeExceptio! /ara e em/lificar este caso&
import (ava.util.*7 class Error+ar$i!, extends Ru!timeExceptio! / public %tri!, ,etMessa,e14 / return 6El par$i!, est@ vac>o67 8 8

A continuacin se /resenta como deber5a ser el mtodo desocupar+la&a14 /ara 4ue lanzase e0ce/ciones Error+ar$i!, cuando le sea im/osible desarrollar su cometido&
class +ar$i!, / ... public void desocupar+la&a14 throws Error+ar$i!,/ if 1pla&aActual GG null4 / throw new Error+ar$i!,147 8 ... 8 ... 8

%inalmente se /resenta el cdigo de un /rograma 4ue usa la clase +ar$i!,&


class +ar$i!,Mai! / public static void mai! 1%tri!, 2 3 ar,4 / +ar$i!, par$i!, G new +ar$i!,147 par$i!,.ocupar+la&a147 try / par$i!,.desocupar+la&a147 8 catch 1Error+ar$i!, e4 / %5stem.out.pri!tl! 1e.,etMessa,e1447 8

>&=&< .l uso /r)ctico de las e0ce/ciones


"as e0ce/ciones deben utilizarse con /recaucin /ara evitar 4ue su uso se transforme en algo /eor 4ue lo 4ue se intenta sim/lificar3 es decir /eor 4ue tratar los errores mediante el uso de los valores devueltos /or los mtodos& A continuacin se e0/onen algunos criterios 4ue deben seguirse:

"imitar el uso de e0ce/ciones controladas& "a e0ce/ciones controladas deben utilizarse solo cuando su tratamiento /or un tercero im/li4ue tomar una decisin o 4ue como consecuencia de la e0ce/cin se deba realizar algHn tratamiento lgico im/rescindible& .n el resto de casos deben utilizarse e0ce/ciones no controladas 7derivadas de Ru!timeExceptio!8& .n /articular no deben utilizarse e0ce/ciones controladas /ara e0/resar errores relativos al mal uso de una clase /or /arte del /rogramador& "a e0ce/cin IaExceptio! lanzada /or read cuando se /roduce un error en la lectura de un disco debe ser controlada3 /ues un fallo de lectura es algo 4ue3 aun4ue ines/erado3 no im/lica un fallo de /rogramacin # siem/re necesita un tratamiento 4ue no debe omitirse& Por otro lado3 la e0ce/cin Arra5I!dexauta"Bou!ds es una e0ce/cin no controlada enviada /or $ava cuando se intenta acceder m)s all) del l5mite de un arra#& Si la e0ce/cin fuese controlada cada mtodo 4ue usase un arra# tendr5a 4ue tratarla o avisar 4ue la lanza3 cosa inHtil si tenemos en cuenta 4ue un /rograma bien escrito nunca deber5a sobre/asar el l5mite de un arra#& Obsrvese 4ue3 cum/liendo este criterio3 en el e em/lo de la clase +ar$i!, 4ue se *a /ro/uesto en el /unto anterior3 la clase Error+ar$i!, deriva de Ru!timeExcepcio!& Utilizar e0ce/ciones de $ava &F (uando el ti/o de error de una a/licacin sea similar a un error definido en el AP+ de $ava debe usarse la clase de $ava& De esta forma se facilita al usuario de la clase la com/resin del error& .ntre las e0ce/ciones m)s comunes del AP+ de $ava /odemos destacar: Ille,alAr,ume!tExceptio!E ArithmeticExceptio!3 %ecurit5Exceptio!3 `ull+oi!terExceptio!E Ille,al%tateExceptio!3 Ille,alAr,ume!tExceptio! # I!dexauta"=Bou!dsExceptio!&

F 9=F

(a/5tulo >

.l /a4uete ava&lang

(ambiar el nivel de abstraccin de las e0ce/ciones& "as e0ce/ciones lanzadas /or un mtodo deben estar al mismo nivel de abstraccin 4ue la clase 4ue im/lementa el mtodo& Por e em/lo3 la clase Tabla de un *i/ottico /a4uete BaseDeDatos no debe lanzar e0ce/ciones de ti/o IaExceptio! cuando falle una o/eracin interna contra un fic*ero au0iliar& Tal error se deber5a a un detalle interno de im/lementacin # /ara fomentar la enca/sulacin no deber5a traslucir& .n vez de esto deber5a ca/turarse la IaExceptio! # definirse una clase es/ecifica /ara las e0ce/ciones de la base de datos 4ue ser5a la 4ue se lanzar5a& Jo seguir esta norma *ar5a 4ue los usuarios de la base de datos /udiesen no entender los mensa es de error& Jo lanzar e0ce/ciones innecesarias& .l enfo4ue de /rogramacin defensiva consiste en com/robar los /ar)metros 4ue se reciben # en caso de ser incorrectos lanzar e0ce/ciones& .ste enfo4ue es errneo /or dos razones: /rimero3 cuando el /rograma est bien construido esas com/robaciones ser)n innecesarias3 # segundo3 el usuario del mtodo incorrectamente invocado no /uede *ace nada con el error3 slo corregir el /rograma& SegHn esta recomendacin3 4uiz)s no fue tan buena la idea de definir la e0ce/cin Error+ar$i!, en el e em/lo anterior3 #a 4ue el cdigo anterior #a /roduc5a `ull+oi!terExceptio!& .ncadenar los mensa es de las e0ce/ciones& "as e0ce/ciones no controladas 4ue se generen deben contener informacin suficiente /ara 4ue el /rogramador /ueda trazar el error& Para ello3 cuando se ca/tura una e0ce/cin /ara cambiar su nivel de abstraccin3 se debe aadir3 al mensa e de la e0ce/cin de alto nivel3 la informacin de la e0ce/cin de ba o nivel 4ue le dio origen&

. em/lo del uso de diferentes ti/os de e0ce/ciones .n el siguiente e em/lo se utilizan los dos ti/os de e0ce/ciones& "a e0ce/cin Excepcio!+or`ocasoli!a de ti/o controlada # las Excepcio!+or`oArra!cado e Ille,alAr,ume!tExceptio! no controladas& Obsrvese 4ue mientras 4ue la /rimera obligatoriamente debe ser indicada # ca/turada3 las siguientes no&
)** * Clase coche * ?versio! P.C *) public class Coche / private boolean motorE!ce!dido7 private int velocidad7 private int litroscasoli!a7

))I!dica si el motor est@ e!ce!dido ))I!dica la velocidad del coche

)** * Co!structor de coche co! el motor apa,ado 5 velocidad !ula * ?param litroscasoli!a itros de ,asoli!a co! los .ue se i!icia el coche *) public Coche1final int litroscasoli!a4 / this.litroscasoli!a G litroscasoli!a7 8 )** * E!cie!de el motor del coche. * ?thro;s Excepcio!+orbuedare%i!casoli!a %i !os hemos .uedado si! ,asoli!a *) void arra!car14 throws Excepcio!+or`ocasoli!a / ))Comprobamos .ue te!emos ,asoli!a if 1litroscasoli!a GG C4 / throw new Excepcio!+or`ocasoli!a147 8 ))E!ce!demos el motor motorE!ce!dido G true7 8 )** * Acelera el cocheE au!.ue se impide! valores superiores a BLC * ?thro;s Excepcio!+or`oEstarArra!cado %i !o hemos arra!cado el coche * se la!&a esta excepc>o!. * Como es ru!time !o se declara e! el thro;s. * ?thro;s Ille,alAr,ume!tExceptio! `o se puede pasar de BLC *) void acelerar1final int i!creme!to4 / ))Comprobamos .ue el motor est@ e!ce!dido if 1UmotorE!ce!dido4 / throw new Excepcio!+or`oArra!cado147 8 if 1velocidad O i!creme!to < BLC4 / throw new Ille,alAr,ume!tExceptio!147 8 8 velocidad OG i!creme!to7 ))Aume!tamos la velocidad

F 9> F

Disear # Programar todo es em/ezar .l cdigo /ara las e0ce/ciones ser5a:


public class Excepcio!+or`ocasoli!a extends Exceptio!/ ))Como deriva de Exceptio! se debe declarar su la!&amie!to ))Adem@sE do!de se use es obli,atoria su captura o la delaraci! de la!&amie!to 8 public class Excepcio!+or`oArra!cado extends Ru!timeExceptio!/ 8

.l cdigo de mai! /ara este e em/lo es:


package libro.e(emplos.cuatro.tres.u!o7 public class CocheMai! / public static void mai!1%tri!,23 ar,s4 / final Coche coche G new Coche1C47 ))Creamos u! coche si! ,asoli!a try / coche.arra!car147 ))i!te!tamos arra!car el coche si! ,asoli!a 8 catch 1Excepcio!+or`ocasoli!a e4 / %5stem.out.pri!tl!16[`os hemos .uedado si! ,asoli!aU647 8 try / coche.acelerar147 ))i!te!tamos acelerar el coche si! haberlo arra!cado 8 catch 1Excepcio!+or`oArra!cado e4 / %5stem.out.pri!tl!16[El motor !o est@ arra!cadoU647 8 catch 1Exceptio! e4 / ))Esta captura debe ser la _ltima %5stem.out.pri!tl!16[Al,_! otro errorU647 ))e! otro caso lo captura todo 8 8 8

T la salida obtenida /or este /rograma ser):


(ava CocheMai! [`os hemos .uedado si! ,asoli!aU [El motor !o est@ arra!cadoU

Problem)tica de las e0ce/ciones controladas "as e0ce/ciones controladas *an creado muc*a controversia en el mundo del desarrollo de software& (uando a/arecieron como /arte del lengua e $ava /r)cticamente toda la comunidad estaba de acuerdo en lo Htil # necesarias 4ue eran /ara un buen tratamiento de los errores& Parec5a una forma sencilla de *acer 4ue las clases fueran usadas de forma correcta incluso cuando lanzaran e0ce/ciones& Sin embargo3 ese sentimiento de 1esto es lo 4ue #o necesitaba2 /rovoc 4ue se abusara de ellas3 ocasionando usto lo contrario de lo 4ue se 4uer5a /romover& Obligar al tratamiento de una e0ce/cin3 mediante las e0ce/ciones controladas3 en muc*as ocasiones se convierte en algo engorroso # /oco Htil3 #a 4ue el usuario de dic*a clase no /uede *acer nada /ara solucionar dic*a e0ce/cin salvo relanzarla a un nivel su/erior& (uando esto ocurre las e0ce/ciones controladas solo sirven /ara oscurecer el cdigo fuente con innecesarios blo4ues tr5 # catch 4ue dificultan su com/resin # mantenimiento& Por ello3 muc*os o/inan 4ue las e0ce/ciones controladas no son necesarias #a 4ue3 adem)s de los /roblemas comentados3 ningHn otro lengua e las *a vuelto a im/lementar& Solo unos /ocos aHn las defienden3 aun4ue /untualizando 4ue no debe abusarse de ellas como se *a *ec*o en ocasiones& .n general se recomienda no utilizar e0ce/ciones controladas3 #a 4ue el uso de e0ce/ciones no controladas es suficiente /ara mane ar los errores # no a/arecen los /roblemas descritos&

>&>& Sobrecarg a de los mtodos b)sicos de object


"os siguientes /untos tratan en detalle algunos de los mtodos m)s im/ortantes de $ava 4ue suelen sobrecargarse /ara dar una funcionalidad adecuada a las clases 4ue se constru#en&

>&>&: +nterfaz

Cloneable

Ta se *a dic*o 4ue cuando en $ava se utiliza el o/erador de asignacin entre dos referencias3 el ob eto involucrado no se co/ia3 sino 4ue se obtienen dos referencias al mismo ob eto& .n algunas situaciones esto /uede no ser deseable& Por e em/lo3 imaginemos cuando se /asa un ob eto como /ar)metro a un mtodo& Si el mtodo modifica el ob eto3 esta modificacin afectar) tambin al ob eto del invocador del mtodo /or4ue en realidad es el mismo& Si fuese necesario evitar esto se deber5a realizar una co/ia de tal ob eto& "a alternativa cl)sica /ara resolver este /roblema consiste en la im/lementacin del constructor de co/ia& Rste es un constructor 4ue recibe como /ar)metro un ob eto de la /ro/ia clase3 /ara construir a /artir de l una co/ia& Sin embargo3 F 99F

(a/5tulo >

.l /a4uete ava&lang

esta solucin no es v)lida cuando se desea 4ue una interfaz refle e la /osibilidad de co/iar 7recordemos 4ue en las interfaces no se /ueden declarar constructores8& Para *acer 4ue este ti/o de co/ias se realicen con un formato comHn3 $ava /ro/orciona en la clase ab(ect el mtodo /rotegido clo!e14& .l mtodo se declara como protected /ara im/edir 4ue se clonen ob etos si el diseador de una clase no lo desea& Por eso3 si se desea 4ue se /uedan clonar ob etos es /reciso *acer /Hblico un mtodo 4ue lo invo4ue& "a ma#or5a de las clases del AP+ de $ava lo tienen /Hblico& .l mtodo clo!e14 im/lementado en la clase ab(ect utiliza la refle0in /ara co/iar los valores de las /ro/iedades del ob eto& As53 las referencias de un ob eto clonado a/untan a los mismos ob etos 4ue el original& .sto es3 /or defecto al clonar un ob eto no se realiza un clonado recursivo de los ob etos en l contenidos& (uando no se desea este com/ortamiento es /reciso sobrecargar clo!e143 # /rogramar e0/l5citamente 4ue se clonen los ob etos referenciados /or las /ro/iedades& Por defecto no es /osible clonar los ob etos de una clase& Para em/ezar se debe declarar el mtodo como public3 #a 4ue en ab(ect es protected& Adem)s3 se debe indicar 4ue dic*a clase im/lementa la interfaz Clo!eable& .sta interfaz3 cu#a declaracin est) vac5a3 se utiliza /ara indicar 4ue sobre esa clase est) /ermitido invocar al mtodo clo!e143 en otro caso $ava lanzar) una e0ce/cin del ti/o Clo!e`ot%upportedExceptio!& .l siguiente e em/lo *ace /Hblico un mtodo /ara clonar ob etos de la clase Coche& "a /ro/iedad velocidad se co/ia al invocar a clo!e14 de ab(ect3 /ero el ob eto Rueda no se clona3 sino 4ue sim/lemente se co/ia su referencia& Por eso3 en el e em/lo se aade el cdigo /reciso /ara 4ue se clone tambin el ob eto rueda&
class Rueda implements Clo!eable / public Rueda clo!e14 throws Clo!e`ot%upportedExceptio! / return 1Rueda4 super.clo!e147 8 8 class Coche implements Clo!eable / public int velocidad7 public Rueda r G new Rueda147 public Coche clo!e14 throws Clo!e`ot%upportedExceptio! / Coche c G 1Coche4 super.clo!e147 c.r G r.clo!e147 return c7 8

(lone /resenta una serie de /roblemas 4ue deben tenerse en cuenta& Para em/ezar *a# recordar 4ue si clo!e no se im/lementa correctamente en una clase base3 las clases derivadas ser)n inca/aces de co/iar correctamente a4uellas /ro/iedades /rivadas 4ue re4uieran un tratamiento es/ecial& Adem)s3 clo!e no /odr) modificar las /ro/iedades finales de ningHn ob eto clonado3 /ues las /ro/iedades finales solo se /ueden modificar en los constructores& Por todo esto3 se recomienda utilizar un constructor co/ia3 # slo cuando sea im/rescindible im/lementar clo!e *aciendo 4ue invo4ue a dic*o constructor&

>&>&< "os mtodos

e uals

hashCode

Ta se *a comentado 4ue3 en su im/lementacin /or defecto3 e.uals14 solo devuelve true si se com/ara un ob eto consigo mismo& .sta im/lementacin del mtodo e.uals143 /or /arte de $ava3 /uede resultar insuficiente en muc*os usos /r)cticos& Por e em/lo3 /uede ser deseable 4ue la com/aracin de dos ob etos clonados devuelva true 7/or defecto3 la com/aracin de dos ob etos clonados devolver) "alse3 debido a 4ue son dos instancias diferentes8& Para 4ue las bibliotecas de $ava funcionen correctamente sobre una clase 4ue redefine e.uals143 dic*a im/lementacin debe cum/lir las siguientes /ro/iedades:

+dentidad&F a.e.uals1a4 debe devolver true3 /ara todo a& Simetr5a&F a.e.uals1b4 si # solo si b.e.uals1a43 /ara todo a # b& Transitividad&F Si a.e.uals1b4 # b.e.uals1c4 entonces a.e.uals1c43 /ara todo a b # c& .lemento neutro&F a.e.uals1!ull4 debe devolver "alse3 /ara todo a& +nmutabilidad&F Si en algHn momento se cum/le a.e.uals1b4 o Ua.e.uals1b4 su valor no /uede cambiar&

Adem)s3 toda sobrecarga del mtodo e.uals14 debe ir acom/aada de una reim/lementacin del mtodo hashCode14 sobre las mismas /ro/iedades3 de manera 4ue si e.uals devuelve true /ara dos ob etos3 hashCode14 devuelva un valor idntico al ser invocado sobre esos ob etos& .l siguiente fragmento de cdigo muestra un e em/lo donde se a/recian estos detalles&

F 9? F

Disear # Programar todo es em/ezar

class Coche / private final int matricula7 public Coche 1int matricula4 / this.matricula G matricula7 8 public boolean e.uals1ab(ect o4 / if 1Uo instanceof Coche4 ))%i o es !ull i!sta!ceo" devuelve "alse return "alse7 return 11Coche4o4.matricula GG matricula7 8 public int hashCode14 / return matricula7 8

>&>&= +nterfaz Comparable


"a interfaz (om/arable3 4ue tambin se encuentra en el /a4uete (ava.la!,3 /ermite realizar com/aracin entre los ob etos de a4uellas clases 4ue la im/lementan& "a interfaz Comparable tiene slo un mtodo: i!t compareTo1ab(ect4& .ste mtodo tiene /or ob eto devolver un valor igual a cero si el resultado de la com/aracin es la igualdad3 un valor negativo si el ob eto 4ue recibe el mensa e es menor 4ue el 4ue se le /asa como argumento3 # un valor /ositivo si es ma#or&
class Coche implements Comparable / private final int matricula7 public int compareTo1ab(ect o4 / Coche c G 1Coche4 o7 if 1this. matricula GG c.matricula 4 return C7 else if 1this. matricula < c.matricula 4 return B7 else return =B7 8

Todas las clases definidas en los /a4uetes est)ndar de $ava suelen im/lementar esta interfaz& Por e em/lo la clase %tri!, cum/le la interfaz Comparable& Al igual 4ue en e.uals143 es im/ortante 4ue la com/aracin se base en /ro/iedades inmutables del ob eto3 en otro caso3 una lista ordenada de ob etos /odr5a de ar de estarlo como consecuencia del cambio de una /ro/iedad de uno de los ob etos contenidos&

>&9& "a concur rencia


$ava a/orta varios elementos 4ue facilitan la concurrencia en los /rogramas& .l /rinci/al consiste en 4ue /ara crear un *ilo se/arado de e ecucin 7o t*read8 basta con *eredar de la clase Thread e im/lementar el mtodo ru!14 4ue en la clase Thread es abstracto&
Una vez e ecutado el constructor de un ob eto de una clase derivada de la clase Thread se debe invocar al mtodo start14 /ara iniciar su e ecucin& Tras esta llamada3 la m)4uina virtual de $ava llama al mtodo ru!14 # este comienza su e ecucin en el nuevo t*read& Si no se desea *eredar de la clase Thread tambin es /osible im/lementar la interfaz Ru!!able3 aun4ue en este caso el t*read ser) iniciado inmediatamente tras la creacin del ob eto llam)ndose al mtodo ru!14& .n /rogramacin concurrente se suelen /roducir diferentes ti/os de /roblemas& Podemos citar tres /rinci/ales:

"as condiciones de car rera 3 4ue ocurren cuando dos *ilos acceden a un recurso simult)neamente # como consecuencia el resultado del acceso es indeterminado& "os blo4ueos mutuos 7o deadlocEs 83 4ue /aralizan la e ecucin de un /rograma3 debido a 4ue los *ilos 4uedan es/erando sucesos 4ue nunca se /roducir)n3 /or4ue de/enden unos de otros # est)n todos es/erando& "a inanicin 7o star vation 83 4ue ocurre cuando un *ilo se 4ueda es/erando un suceso 4ue /uede no ocurrir o 4ue ocurre /oco frecuentemente&

Para evitar estos /roblemas3 # /ara facilitar el desarrollo de /rogramas concurrentes3 $ava a/orta varios mecanismos& As53 $ava dis/one de mecanismos /ara marcar regiones de e0clusin mutua 7en las 4ue solo un *ilo /uede estar activo8 # /aso de F 9@F

(a/5tulo >

.l /a4uete ava&lang

mensa es 7/ara 4ue los *ilos se comuni4uen # eviten los /roblemas8& Adem)s3 el /a4uete (ava.util.co!curre!t3 aade sobre estos mecanismos otros m)s sofisticados 7como sem)foros3 colas blo4ueantes o contadores8& Adem)s3 muc*as clases de $ava son inmutables3 como /or e em/lo %tri!,& .l uso de clases inmutables evita muc*os /roblemas en )mbitos concurrentes3 /ues como los ob etos no /ueden cambiar3 no se /ueden /roducir condiciones de carrera en ellos&

>&9&: "a /alabra reser vada

synchroni!ed

.ste mecanismo /ermite asegurar 4ue dos *ilos de e ecucin no /odr)n /enetrar a la vez en cierta regin de un ob eto3 creando lo 4ue se conoce como una regin de e0clusin mutua & .l siguiente cdigo ilustra como definir un )mbito 4ue contenga la /arte donde se /uedan /roducir colisiones&
class Coche / int velocidad7 public void acelerar1int v4 / if 1v < C4 synchroni!ed / velocidad OG v7 8 8 8

"a /alabra reservada s5!chro!i&ed se /uede utilizar tambin /ara crear monitores& Un monitor /ermite la e ecucin en e0clusin mutua de los mtodos o )mbitos eti4uetados como s5!chro!i&ed dentro de una instancia de una clase& .l *ilo 4ue no /ueda entrar en una regin marcada /or s5!chro!i&ed es/erar) a 4ue el otro *ilo abandone la regin& As53 $ava /ermite dotar a la /arte est)tica # a cada ob eto de una clase con un monitor diferente& As53 como la siguiente clase es/ecifica acelerar14 como s5!chro!i&ed3 se /uede invocar dic*o mtodo desde dos *ilos de e ecucin sin 4ue se /roduzcan colisiones&
class Coche / int velocidad7 public synchroni!ed void acelerar1int v4 / velocidad OG v7 8 8

"a /alabra reservada s5!chro!i&ed tambin se /uede utilizar al crear un )mbito3 /as)ndole un ob eto sobre el 4ue realizar la sincronizacin& .n este caso /ara iniciar un blo4ue de cdigo 4ue se desea 4ue se e ecute en e0clusin mutua& .sta e0clusin mutua se realiza a nivel de la instancia del ob eto 4ue la e ecuta& .l siguiente fragmento de cdigo ilustra este uso sobre un ob eto de la clase Aparcamie!to del ca/5tulo <&
class Coche / Aparcamie!to aparcamie!to G new Aparcamie!to147 public void aparcar14 / synchroni!ed 1aparcamie!to4/ aparcamie!to.Aparcar1this47 8 8 8

>&9&< (omunicacin entre *ilos


$ava define cuatro valores diferentes /ara definir el estado de un t*read dentro de un ob eto o de la /arte est)tica de una clase: nuevo3 e ecutable 3 muer to # blo4ueado&
Un *ilo est) en estado nuevo cuando acaba de iniciarse # aHn no *a comenzado a e ecutarse& .st) en estado e ecutable cuando se est) e ecutando o cuando no lo est) /ero nada im/ide 4ue estuviese e ecut)ndose& T est) muerto cuando *a finalizado su mtodo ru!& Un t*read en un ob eto est) blo4ueado si:

,a llamado a sleep143 indicando el la/so de tiem/o 4ue duerme el *ilo& Si se est) es/erando /or algHn evento de .ntradaISalida& Si est) es/erando /ara e ecutar cdigo eti4uetado como s5!chro!i&ed # aHn no *a /odido *acerlo&

F 9; F

Disear # Programar todo es em/ezar

T finalmente3 si se *a llamado a ;ait14 # est) es/erando 4ue otro t*read realice una llamada al mtodo !oti"514 del ob eto& .ste caso es el 4ue /ermite la comunicacin entre *ilos3 siendo en realidad la llamada a !oti"514 un mensa e 4ue env5a un *ilo a otro 7o a otros si se usa !oti"5All148&

%inalmente cabe decir 4ue $ava tambin /ermite asignar a los t*reads un nivel de /rioridad mediante los mtodos ,et+riorit514 # set+riorit514& As53 el /lanificador de la !)4uina 'irtual de $ava dis/one de un criterio con el 4ue distribuir el tiem/o de e ecucin entre los diferentes t*reads&

>&?& "os ti/os enumerados


"os ti/os enumerados tambin *an sido aadidos en la versin 9 de $ava& Antes3 la definicin de ti/os enumerados no estaba so/ortada en $ava& (omo sustituto sim/le3 algunos /rogramadores utilizaban /ro/iedades enteras est)ticas # finales& .sta solucin ten5a el /roblema de 4ue no aseguraba el ti/ado3 /ermitiendo mezclar estos /rimitivos enumerados con enteros& .l siguiente e em/lo muestra una definicin t5/ica sobre $ava :&> /ara el enumerado Dia&
class Dia public public public public public public public 8 / final final final final final final final static static static static static static static int int int int int int int lu!es martes miercoles (ueves vier!es sabado domi!,o G G G G G G G C7 B7 H7 K7 L7 J7 D7

(omo se ve en el siguiente e em/lo3 esta solucin e4uivale en ca/acidad a los enumerados de ( # (OO&
int dB G Dia.lu!es7 int dH G Dia.martes7 boolean posterior G 1dH < dB47

"a sinta0is de estos enumerados resultaba com/le a& Pero3 lo /eor es 4ue /otenciaban ciertos efectos indeseables3 como mezclar el valor entero del enumerado con su sem)ntica& Por e em/lo3 al sumar : al lu!es obtenemos el martes3 /ero al sumar : al domi!,o obtenemos un valor fuera del enumerado& .ste /roblema se deriva de la mezcla de ti/os& Otra /osibilidad3 m)s com/le a3 consist5a en utilizar una clase de la 4ue slo se creaban un nHmero limitado de ob etos3 4ue corres/ond5an a los valores enumerados 7/atrn de diseo .num8& Para *acer esto se necesita 4ue el constructor sea /rivado # 4ue se creen est)ticamente los ob etos como /arte de la clase& .l siguiente fragmento de cdigo muestra el caso&
class Dia / private Dia14 /8 public final static public final static public final static public final static public final static public final static public final static 8

Dia Dia Dia Dia Dia Dia Dia

lu!es martes miercoles (ueves vier!es sabado sabado

G G G G G G G

new new new new new new new

Dia147 Dia147 Dia147 Dia147 Dia147 Dia147 Dia147

.sta solucin resuelve el /roblema del ti/ado& Adem)s3 /ermite aadir mtodos 4ue /ueden ser convenientes /ara com/arar elementos del enumerado o /ara describir sus /ro/iedades& Sin embargo3 la definicin sigue siendo demasiado com/le a& "a sinta0is introducida con la versin 9 /ermite definir un ti/o enumerado con una sinta0is similar a la de (OO& !ientras 4ue3 internamente3 se crea una estructura similar a la comentada&
e!um FIde!ti"icador del tipo< /2ide!ti"icadores3*87

.l siguiente e em/lo define el ti/o Dia # lo usa&


enum Dia / ^`E%E MARTE%E MIERCa E%E -^EAE%E AIER`E%E %ABADaE DaMI`ca87 Dia d G ^`E%7

F 9DF

(a/5tulo >

.l /a4uete ava&lang

Adem)s3 como com/lemento a la introduccin de los ti/os enumerados la instruccin s;itch se am/li /ara /ermitir su uso sobre ellos # no solo sobre e0/resiones aritmticas enteras& .n la im/lementacin de e!um en $ava lo 4ue estamos *aciendo en realidad es definir una clase # /or ello un enumerado /uede tener mtodos # /ro/iedades& De *ec*o3 como todas las clases en $ava3 el ti/o e!um *ereda de la clase ab(ect # /or ello #a trae de serie varios mtodos& .sto *ace 4ue los enumerados en $ava sean mu# /otentes3 #a 4ue /ermiten 4ue se le /uedan aadir com/ortamiento como a cual4uier otra clase& 'eamos el e em/lo del enumerado de los d5as de la semana /ero con algo m)s de com/ortamiento&
enum Dias%ema!a / ^`E%16 u!es64E MARTE%16Martes64E MIERCa E%16Miercoles64E -^EAE%16-ueves64E AIER`E%16Aier!es64E %ABADa16%abado64E DaMI`ca16Domi!,o647 private final %tri!, !ombre7 private Dias%ema!a1%tri!, !ombre4 / this.!ombre G !ombre7 8 ?averride public %tri!, to%tri!,14 / return !ombre7 8 public Dias%ema!a si,uie!te14 / switch1this4 / case ^`E% 9 return MARTE%7 case MARTE% 9 return MIERCa E%7 case MIERCa E% 9 return -^EAE%7 case -^EAE% 9 return AIER`E%7 case AIER`E% 9 return %ABADa7 case %ABADa 9 return DaMI`ca7 case DaMI`ca 9 return ^`E%7 default 9 throw new Ille,al%tateExceptio!147 8 8

Si observamos las diferencias con la anterior im/lementacin /odemos ver 4ue se *an aadido varias funcionalidades al enumerado& Para em/ezar3 se *a creado un constructor /ara guardar la cadena con la 4ue se desea 4ue se escriba dic*o enumerado al invocar to%tri!, 7recordemos 4ue e!um *ereda de ab(ect /or lo 4ue /odemos sobreescribir to%tri!,8& Adem)s3 se *a aadido un mtodo a la clase /ara 4ue devuelva el d5a siguiente al actual&
boolean iguales " MIERCa E%.si,uie!te14 GG -^EAE%7

Tal # como se *a visto3 se /ueden definir constructores /ara los enumerados de forma 4ue cada ob eto del enumerado guarde una /ro/iedad 4ue lo defina& Una muestra de la /otencia de los enumerados en $ava est) en 4ue dic*a variable /uede a su vez ser un enumerado de otro ti/o& 'eamos un e em/lo /r)ctico&
enum TipoDia / ABaRAB EE `a# ABaRAB E7 8 enum Dias%ema!aClasi"icados / ^`E%16 u!es6E TipoDia. ABaRAB E4E MARTE%16Martes6E TipoDia. ABaRAB E4E MIERCa E%16Miercoles6E TipoDia. ABaRAB E4E -^EAE%16-ueves6E TipoDia. ABaRAB E4E AIER`E%16Aier!es6E TipoDia. ABaRAB E4E %ABADa16%abado6E TipoDia.`a# ABaRAB E4E DaMI`ca16Domi!,o6E TipoDia.`a# ABaRAB E47 private final %tri!, !ombre7 private final TipoDia tipoDia7 private Dias%ema!aClasi"icados1%tri!, !ombreE TipoDia tipoDia4 / this.!ombre G !ombre7 this.tipoDia G tipoDia7 8 ?averride public %tri!, to%tri!,14 / return !ombre7 8

F ?C F

Disear # Programar todo es em/ezar


public Dias%ema!aClasi"icados si,uie!te14 / switch1this4 / case ^`E% 9 return MARTE%7 case MARTE% 9 return MIERCa E%7 case MIERCa E% 9 return -^EAE%7 case -^EAE% 9 return AIER`E%7 case AIER`E% 9 return %ABADa7 case %ABADa 9 return DaMI`ca7 case DaMI`ca 9 return ^`E%7 default 9 throw new Ille,al%tateExceptio!147 8 8 public boolean so5 aborable14 / return tipoDia.e.uals1TipoDia. ABaRAB E47 8

Aun4ue3 tal # como *emos visto3 los enumerados son una *erramienta mu# /otente3 no es bueno abusar de ellos3 #a 4ue son ob etos est)ticos 4ue dificultan la /rueba de los com/onentes 4ue los usan& Se deben usar enumerados cuando e0iste un gru/o finito # conocido de ob etos 4ue no van a modificar su estado nunca 7los d5as de la semana o los /lanetas del sistema solar son un con unto finito # conocido8&

>&@& .nvolturas
Ta se *a comentado 4ue los ti/os /rimitivos en $ava no son clases& .sta /articularidad *a sido criticada /or los /uristas de la Programacin Orientada a Ob etos # alabada con la misma intensidad /or los /rogramadores /reocu/ados /or la eficiencia del cdigo& Para sosla#ar este as/ecto3 $ava introduce las clases de envoltura & .stas clases recubren cada uno de los ti/os /rimitivos en una clase3 /ara 4ue se /uedan utilizar como ob etos& Adem)s3 asociado a cada una de estas clases3 $ava /ro/orciona un con unto de mtodos 4ue facilitan las transformaciones # el resto de o/eraciones 4ue con frecuencia es /reciso realizar con los ti/os /rimitivos 7como conversiones entre ti/os o conversiones a te0to8& Obsrvese 4ue como la definicin de los genricos en $ava im/ide su uso sobre los ti/os /rimitivos3 los envoltorios /asan a ser im/rescindibles& .l diagrama de la %igura <9 muestra las relaciones de *erencia entre las diferentes clases de envoltura # algunos de sus mtodos&
:inter;ace< Co)para/le +compareTo() +equals()

Character +%i3it01 +3et4umeric"alue01 +u$$erCase01 +lo5erCase01

Nu)/er +!alue=;01 +to/trin301 +to=ctal/trin301 +toHex/trin301 +$arse>nte3er01 +$arse9on301 +$arse#&te01 +$arse9on301

Boolean -T67E -F89/E

Long +$arse9on301

Integer +$arse>nte3er01

Short +$arse/'ort01

B+te -4a4 +$arse#&te01

Float +is4an01 +is>n;inite01 +;loatTo>nt#its01 +int#itsToFloat01 +$arseFloat01

Dou/le +is4an01 +is>n;inite01 +%oubleto>nt#its01 +int#itsToDouble01 +$arseDouble01

%igura <9&F Diagrama con los envoltorios de los ti/os /rimitivos&

A /artir de la versin :&93 # al igual 4ue ocurr5a con la clase %tri!, # los arra#s de caracteres 7ver ca/5tulo <83 a la relacin entre los ti/os /rimitivos # las clases de envoltura se les *a dotado de la /ro/iedad de autobo0ing # autounbo0ing& De esta

F ?:F

(a/5tulo >

.l /a4uete ava&lang

forma es /osible crear un ob eto de una clase de envoltura utilizando directamente una asignacin desde un ti/o /rimitivo& Tambin es /osible el /aso inverso3 es decir obtener un ti/o /rimitivo desde un ob eto de envoltura&
I!te,er a G HJ7 int b G P7 a==7 I!te,er c G a O b7

(omo se /uede observar en el e em/lo anterior3 los o/eradores aritmticos # lgicos tambin se *an sobrecargado /ara 4ue actHen sobre las clases de envoltura de la misma forma3 /ara aadir nuevas funcionalidades3 en 4ue lo *ac5an sobre los ti/os /rimitivos& ,a# 4ue tener cuidado es/ecialmente con el o/erador de igualdad 7 GG8 #a 4ue al usarlo sobre ob etos de envoltura *a# 4ue recordar 4ue son ob etos # 4ue /ueden com/artir el mismo valor a/arente3 /ero no la misma direccin de memoria&
I!te,er a G HPJ7 I!te,er b G HPJ7 boolean c G 1a GG b47 ))Devulve "also

De igual forma las /ro/iedades de autobo0ing # autounbo0ing facilitan el uso de contenedores con ti/os /rimitivos& Debe observarse 4ue al declarar el contenedor se debe utilizar la clase envoltorio corres/ondiente en vez el ti/o /rimitivo directamente3 /ues se /recisa un ti/o no /rimitivo& Sin embargo3 luego se /ueden utilizar las funciones de insercin # recu/eracin directamente sobre el ti/o /rimitivo3 /ues el autobo0ing # el autounbo0ing se encargan de las conversiones&
AectorDi!amico FI!te,er< v G new AectorDi!amico FI!te,er<147 v.po!er1J47 int x G v.obte!er147

>&;& "ecturas recomendadas


1.ffective $ava23 <V edicin3 $os*ua Aloc*3 AddisonFGesle#3 <CC;& -ran libro /ara /rofundizar en la /rogramacin en $ava 4ue todo entendido debe leer de /rinci/io a fin& .l libro se divide en /e4ueos ca/5tulos 4ue tratan as/ectos es/ec5ficos del lengua e # de su correcto uso& .l ca/5tulo = trata la im/lementacin de algunos de los mtodos de ob(ect comentados a4u5&

>&D& . ercicios
. ercicio : Se desea crear la clase ista 4ue im/lementa una lista de ob etos de la clase ab(ect # 4ue im/lementa de manera /Hblica al menos los mtodos 4ue se detallan a continuacin&
void pushBac$1ab(ect o4 void pushFro!t1ab(ect o4 void popBac$14 void popFro!t14 ab(ect "ro!t14 ab(ect bac$14 int si&e14 void clear14 )) )) )) )) )) )) )) )) I!serta por I!serta por Elimi!a por Elimi!a por Devuelve el Devuelve el Devuelve el Borra todos el "i!al el pri!cipio el "i!al el pri!cipio valor .ue est@ e! el pri!cipio valor .ue est@ e! el "i!al !_mero de eleme!tos de la lista los eleme!tos de la lista

a8

.scribir en $ava el cdigo corres/ondiente a la clase ista 4ue im/lementa una lista de ob etos de la clase ab(ect& .sta clase debe contener al menos los mtodos 4ue se detallan a continuacin&

b8 (onstruir una clase istaE!terosB 4ue cuente con mtodos an)logos a los de la clase "ista /ero 4ue aada otros 4ue slo /ermitan almacenar enteros 7ob etos de la clase envoltorio I!te,er8& Para ello usar *erencia3 es decir3 *acer 4ue istaE!terosB *erede de ista& c8 (onstruir una clase istaE!terosH 4ue cuente con mtodos an)logos a los de la clase ista /ero 4ue slo /ermita almacenar enteros 7ob etos de la clase envoltorio I!te,er8& Para ello usar com/osicin3 es decir *acer 4ue istaE!terosH tenga dentro un ob eto de la clase ista& Decidir 4u enfo4ue es me or /ara construir la lista de enteros 7ti/o istaE!terosB o ti/o istaE!terosH8 # /or 4u razn& .0/licar tambin /or 4u se debe usar la clase envoltorio I!te,er en vez de usar directamente el ti/o /rimitivo i!t al almacenar los enteros en la lista&

d8

F ?< F

(a/5tulo 9

Diseo de (lases

A)sicamente3 la construccin de /rogramas orientados a ob etos consiste en la definicin de clases& .n este ca/5tulo se e0/ondr)n diferentes *erramientas utilizables en un enfo4ue to/Fdown a/o#ado en las diferentes *erramientas 4ue U!" /ro/orciona&

9&:& Diseo to/Fdown a/o#ado en U!"


Ta se *a comentado 4ue la creacin de clases a/orta numerosas venta as: es un buen mecanismo /ara enca/sular # reutilizar el cdigo3 acerca el vocabulario del lengua e de /rogramacin al del /roblema a resolver3 etc& .n las eta/as iniciales de desarrollo de un /ro#ecto se suelen usar algunos mtodos /ara descubrir las clases 4ue se deben crear& Uno de ellos consiste en identificar las clases con los sustantivos de una descri/cin del /roblema& Otro consiste en escribir tar etas 4ue re/resentan las clases # acom/aarlas de una descri/cin de sus res/onsabilidades& .n cual4uier caso3 estos /rimeros /asos /ermiten obtener un con unto de clases 4ue luego se va com/letando con nuevas clases siguiendo un enfo4ue to/Fdown& Desde un /unto de vista /uramente constructivo3 la creacin de una clase nueva se realiza utilizando tres ti/os de relaciones: "as relaciones de de/endencia entre ob etos& (reando una clase 4ue utiliza a otras como /arte de sus mtodos 7en la im/lementacin o en los /ar)metros 4ue recibe8& "as relaciones de asociacin entre ob etos & .nsamblando diferentes ob etos se constru#e un ob eto ma#or 4ue los contiene& "as relaciones entre clases e interfaces& Utilizando *erencia se constru#en erar4u5as de abstracciones 4ue se basan unas en otras&

.n esta seccin se estudiar) en detalle cada uno de estos ti/os de relaciones& Su estudio se *ar) desde dos /ers/ectivas: una est)tica # otra din)mica& "a est)tica mostrar) cmo se estructuran las clases # los ob etos& "a din)mica cmo interactHan los ob etos # las clases /ara resolver diferentes situaciones& Adem)s3 estos tres ti/os de relaciones se revisar)n res/ecto a tres as/ectos: la versatilidad 3 la tem/oralidad # la visibilidad& .l estudio de estos as/ectos3 en cada /roblema /articular3 /uede a#udar a elegir el ti/o de relacin 4ue debe usarse al crear nuevas clases& 'ersatilidad Un ob eto se dice 4ue es vers)til si /uede combinarse con otros ob etos de diversas maneras /ara dar lugar a diferentes com/ortamientos& Por e em/lo3 una clase +ila 4ue /ueda almacenar cual4uier ti/o de ob etos es una clase m)s vers)til 4ue una clase +ila 4ue slo /ermita almacenar nHmeros enteros& .n general3 es /referible *acer cdigo vers)til3 /ues facilita su reutilizacin en diferentes /roblemas& Sin embargo3 un cdigo e0cesivamente vers)til /uede ser 4ue se a uste /oco a un /roblema /articular 4ue se est resolviendo # 4ue3 con ello3 se dificulte la /rogramacin en vez de sim/lificarla& Por tanto3 al desarrollar un /rograma3 es im/ortante estudiar cu)l es el nivel de versatilidad 4ue interesa /ara las clases e interfaces 4ue se van a crear3 en el conte0to del /roblema 4ue se est) resolviendo& Tem/oralidad (ual4uier relacin entre ob etos o entre clases tiene una duracin tem/oral& ,a# relaciones entre ob etos 4ue se dan en un )mbito mu# restringido 7/or e em/lo dentro de un mtodo8 # *a# relaciones entre ob etos 4ue abarcan toda la vida de los ob etos 7/or e em/lo en las /ro/iedades8& 'eremos 4ue debe /restarse atencin al estudio de la tem/oralidad de una relacin /or4ue a#uda a definir el ti/o de relacin3 aun4ue en igualdad de condiciones se /refiere una ba a tem/oralidad3 /ues esto im/lica ma#or inde/endencia # menor coste de recursos& 'isibilidad (on ob eto de ma0imizar el nivel de enca/sulacin3 la visibilidad 4ue una clase tiene de otra es otro as/ecto 4ue debe tenerse en cuenta al crear relaciones& "a visibilidad se restringe definiendo cu)les son los miembros /Hblicos3 /rivados # /rotegidos3 # cu)les son las interfaces # clases /Hblicas&

F ?= F

(a/5tulo 9

Diseo de (lases

.sta claro 4ue en una relacin entre dos clases u ob etos siem/re es /reciso 4ue e0ista algHn nivel de visibilidad /ara 4ue /uedan realizarse interacciones& .n general3 se debe seguir el criterio de definir la m5nima visibilidad /osible 4ue /ermita obtener la funcionalidad re4uerida& De esta forma se reduce la com/le idad manteniendo la funcionalidad& Otros criterios .0isten otros as/ectos3 como la econom5a # la eficiencia3 4ue /ueden condicionar el diseo de una relacin& .l utilizar estos criterios /uede c*ocar frontalmente con un buen diseo orientado a ob etos& Por e em/lo3 se /uede imaginar un caso en el 4ue tras detectar un /roblema se /ro/onen dos soluciones& "a /rimera consiste en redisear una clase& "a segunda en /ermitir el acceso a cierta variable desde fuera de la clase& "a /rimera solucin /odr5a ser /tima en cuanto a cum/lir el contrato del ob eto3 mientras 4ue la segunda /odr5a crear consecuencias ines/eradas si los ob etos clientes utilizan la variable sin cuidado& Sin embargo la /rimera im/lica varias *oras de desarrollo # la segunda slo unos segundos& Si los /lazos son a ustados seguramente se o/tar) /or la segunda o/cin& .s decir3 en los /ro#ectos comerciales3 la e0istencia de /lazos definidos su etos a /enalizaciones econmicas suele condicionar detalles de la im/lementacin&

9&<& 6elaciones de de /endencia entre ob etos&


"a relacin de de/endencia se da cuando una clase de/ende de la interfaz de otra& "as de/endencias entre clases e0isten /or dos motivos:

Un mtodo de una clase recibe como /ar)metro un ob eto de otra clase Una clase crea ob etos de otra dentro de un mtodo&

Dimensin est)tica .n U!" la re/resentacin est)tica de las relaciones de de/endencia entre dos clases se realiza utilizando una flec*a discontinua& .sta flec*a /arte de la ca a 4ue re/resenta a la clase de los ob etos 4ue usan3 # termina en la clase de los ob etos usados&
A B

%igura <?&F "a clase A de/ende de la clase B&

Dimensin din)mica "a dimensin din)mica se /lasma en U!" mediante los Diag ramas de +nteraccin entre ob etos 7ver %igura <@8& .stos diagramas describen3 utilizando flec*as # ca as3 cmo interactHan los ob etos de una relacin de de/endencia&

U!" define dos ti/os de Diagramas de +nteraccin: los Diag ramas de Secuencia # los Diag ramas de (olaboracin& "a %igura <@ muestra un Diagrama de Secuencia # la %igura <; muestra uno de colaboracin& .n ambos diagramas se describe la siguiente situacin: un ob eto de la clase Trafico3 identificado como t3 invoca al mtodo frenar de un ob eto de la clase (oc*e3 identificado como c& Dentro de ese mtodo "re!ar143 se invoca al mtodo reducirE!tradacasoli!a14 de un ob eto de la clase !otor referenciado como m& "uego3 aHn dentro del mtodo frenar de Coche3 se invoca3 sobre el /ro/io c al mtodo "re!arRuedas14& %inalmente3 el control retorna al invocador de los mtodos&
(omo se /uede a/reciar ambos ti/os de diagramas son e4uivalentes& Sin embargo3 en el Diagrama de Secuencia3 se ve me or el orden de llamada a los mtodos& !ientras 4ue el Diagrama de (olaboracin es m)s com/acto # 4uiz)s m)s cmodo /ara realizar la /rimera a/ro0imacin a un /roblema& "os Diagramas de +nteraccin /lantean escenarios sobre los 4ue se descubren los mtodos de las clases3 su visibilidad # las relaciones e0istentes entre clases # ob etos& Al /lantear un Diagrama de +nteraccin se le suele /oner un t5tulo descri/tivo 7/or e em/lo: 1secuencia de frenado28& .l diagrama se limita a describir las llamadas 4ue se /roducen entre los ob etos /ara conseguir el ob etivo enunciado en dic*o t5tulo&

F ?> F

Disear # Programar todo es em/ezar

%igura <@&F Diagrama de Secuencia&

%igura <;&F Diagrama de (olaboracin&

Sobre los Diagramas de Secuencia se /ueden es/ecificar varios detalles adicionales& .n la %igura <D se /resenta la creacin de un ob eto desde otro # su /osterior destruccin3 en este caso /or de ar de estar referenciado& .n la %igura =C se muestra la devolucin de un /ar)metro # el uso de una instruccin condicional3 obsrvese 4ue la condicin se escribe entre corc*etes& %inalmente3 la %igura =: muestra un caso 4ue inclu#e un bucle& A /esar de la ri4ueza de estos detalles3 no debe /retenderse 4ue los Diagramas de Secuencia sean com/letos& .s decir3 cual4uier omisin en un Diagrama de Secuencia solo indica 4ue dic*o detalle no se considera im/ortante3 no 4ue deba omitirse en la im/lementacin& Siem/re debe recordarse 4ue los Diagramas U!" no son un fin3 sino una *erramienta /ara entender los /roblemas&

%igura <D&F . em/lo de Diagrama de Secuencia con creacin # finalizacin de ob etos&

F ?9F

(a/5tulo 9

Diseo de (lases

%igura =C&F . em/lo de Diagrama de Secuencia con retorno de valores # con instruccin condicional&

%igura =:&F . em/lo de Diagrama de Secuencia con un bucle&

(u)ndo # cmo usar relaciones de de /endencia Debe utilizarse cuando la tem/oralidad de una relacin sea ba a& Si la relacin entre dos ob etos se limita al )mbito de un mtodo3 la relacin de de/endencia es ideal& Si la relacin entre dos ob etos es m)s larga3 debe buscarse una relacin con ma#or tem/oralidad3 como las relaciones de asociacin& .n la relaciones de de/endencia debe fomentarse la versatilidad3 utilizando el /olimorfismo en el /aso de /ar)metros& (uanto m)s b)sicos sean los ti/os de los /ar)metros de un mtodo3 m)s vers)til ser) el ob eto& Desde el /unto de vista de la visibilidad las relaciones de de/endencia favorecen la enca/sulacin de los /artici/antes en la relacin3 #a 4ue los ob etos slo se conocen a travs de su interfaz /Hblica&

F ?? F

Disear # Programar todo es em/ezar . em/lo de relaciones de de/endencia .s *abitual 4ue el /rogramador sin e0/eriencia en Programacin Orientada a Ob etos tienda a construir ob etos grandes3 con multitud de mtodos 4ue le /ermiten desem/ear cierta tarea& .stos ob etos3 4ue /odr5amos denominar monol5ticos3 son com/le os # en general menos vers)tiles 4ue si se *ubiesen construido mHlti/les ob etos 4ue se utilizasen entre ellos& Si deseamos construir una a/licacin /ara formatear te0tos de manera 4ue /ermita eliminar es/acios consecutivos innecesarios3 /oner en ma#Hsculas la /rimera letra tras un /unto3 obtener el nHmero de /alabras del te0to3 eliminar /alabras re/etidas resultado de un error al escribir3 etc& Podr5amos *acerlo de dos formas:

!ediante una clase Formateador 4ue dis/usiese de un mtodo formatear te0to # de los siguientes mtodos /rivados: elimi!arEspacios3 capitali&ar3 elimi!arRepeticio!es3 obte!er`umero+alabras& (reando una clase diferente /or cada o/eracin 4ue se desea crear 7 Elimi!adorDeEspacios3 Capitali&ador3 Elimi!adorDeRepeticio!es3 Co!tadorDe+alabras8 # luego creando una clase Formateador 4ue utiliza esas clases /ara formatear un te0to&

Si ado/tamos la /rimera solucin ser) dif5cil 4ue varias /ersonas aborden el desarrollo simult)neamente3 debido a 4ue todo el cdigo estar) en un Hnico fic*ero& Adem)s3 dic*o fic*ero ser) grande # com/le o& !ientras 4ue la segunda solucin /ermite 4ue diferentes /rogramadores aborden el desarrollo de cada una de las diferentes clases3 las cuales adem)s ser)n relativamente sim/les& Por otro lado3 si /osteriormente se desea utilizar una de las caracter5sticas /or se/arado 7/or e em/lo la de eliminacin de /alabras re/etidas83 en el caso de la /rimera solucin deberemos *acer /Hblico el mtodo corres/ondiente o com/licar la configuracin del ob eto Formateador /ara 4ue /ermita elegir 4u o/eraciones se a/lican en cada caso& Por contra3 la segunda solucin no e0ige ningHn cambio& Puiz)s el /rogramador novel /iense 4ue la segunda solucin tender) a sobrecargar el sistema debido a la multitud de ob etos involucrados en cada formateo de te0to3 /ero siem/re se debe recordar 4ue el coste de creacin de un ob eto es des/reciable res/ecto a la versatilidad 4ue a/orta el enfo4ue& Se /uede concluir 4ue la segunda solucin es /referible /or sim/licidad de desarrollo3 /or4ue /ro/orciona una coleccin de ob etos muc*o m)s vers)til # f)cil de mantener 4ue la /rimera solucin&

9&=& 6elaciones de asociacin entre ob etos


"as relaciones de asociacin surgen cuando se unen varios ob etos /ara formar uno nuevo& "a interaccin entre los ob etos 4ue se unen *ace 4ue emer a un com/ortamiento ma#or 4ue la sim/le suma de los com/ortamientos de sus elementos& Aun4ue una asociacin entre ob etos /uede ser algo meramente conce/tual3 en muc*as ocasiones la asociacin se materializa en /ro/iedades de clase& .n estos casos3 como consecuencia de 4ue un ob eto a de la clase A est asociado a un ob eto b de la clase B3 la clase A tendr) una /ro/iedad 4ue /ermite referenciar a ob etos de la clase B& Una asociacin entre ob etos se /uede estudiar desde dos /ers/ectivas diferentes: una /ers/ectiva estructural 7est)tica8 # otra de com/ortamiento 7din)mica8& Dimensin est)tica "a dimensin est)tica debe mostrar cmo se relacionan las clases # las interfaces de los ob etos 4ue se asocian& Ta vimos en el ca/5tulo : 4ue los Diagramas .st)ticos de (lases muestran la asociacin entre dos ob etos de dos formas:

!ediante una l5nea 4ue une las ca as 4ue re/resentan a cada clase de ob etos& !ediante una /ro/iedad&

Se usa una l5nea cuando se desea recalcar la im/ortancia de la asociacin # una /ro/iedad cuando se considera menos im/ortante& Por e em/lo3 imaginemos un /rograma de contabilidad en el 4ue /ara almacenar los em/leados de una em/resa los ob etos de una clase llamada Empresa tienen una asociacin con los ob etos de una clase llamada +erso!a& Su/ongamos 4ue /ara guardar el nombre de las /ersonas tambin sea necesaria una asociacin entre los ob etos de la clase +erso!a # los de la clase %tri!,& .n el /rimer caso /odr5a ser interesante re/resentar las clases Empresa # +erso!a # una l5nea entre ellas /ara remarcar la asociacin& Por otro lado3 la asociacin entre +erso!a # %tri!, no /arece tan im/ortante # /odr5a e0/resarse mediante una /ro/iedad&
E)presa !ersona -nombre : /trin3

%igura =<&F Algunas asociaciones entre ob etos se /lasman en U!" con una l5nea de asociacin # otras3 menos im/ortantes3 a/arecen como /ro/iedades&

F ?@F

(a/5tulo 9

Diseo de (lases

.n las l5neas de asociacin se /ueden aadir una serie de adornos /ara aumentar el detalle de la descri/cin de la asociacin&

Por e em/lo3 como vimos en el ca/5tulo :3 se /ueden indicar las cardinalidades de los ob etos 4ue se asocian& Adem)s3 en ambos e0tremos de la l5nea /ueden /onerse identificadores 4ue se corres/ondan con las /ro/iedades 4ue en el cdigo im/lementar)n la asociacin& .stos identificadores /ueden ir /recedidos del s5mbolo negativo3 /ositivo o de la almo*adilla /ara indicar res/ectivamente 4ue son /rivadas3 /Hblicas o /rotegidas& Tambin /uede aadirse un identificador 4ue da nombre a la asociacin # 4ue lleva asociado un marcador en forma de flec*a 4ue indica el sentido de lectura& %inalmente3 se /ueden aadir terminaciones en flec*a en ambos e0tremos de la l5nea de asociacin /ara indicar 4ue desde la clase origen de la flec*a e0iste un acceso a los ob etos de la clase destino de la flec*a&

.l diagrama de la %igura == muestra una asociacin entre las clases A # B& De l se des/rende 4ue un ob eto de la clase A se asocia a un ob eto de la clase B utilizando una /ro/iedad cu#o identificador es /rivado # se llama ob(etoB& Tambin /uede leerse en este diagrama 4ue un ob eto de la clase B se asocia a un Hnico ob eto de la clase A& Adem)s3 la flec*a indica 4ue en la clase A debe de *aber mtodos /ara acceder a la /ro/iedad ob(etoB3 # el as/a indica 4ue en la clase B no los *a# /ara acceder a la A& Por e em/lo3 si se tiene la clase Coche # la clase Rueda3 se /uede establecer una relacin de asociacin entre ambas 4ue diga: un coc*e tiene > ruedas& As53 la %igura => muestra 4ue un coc*e tiene cuatro ruedas # 4ue una rueda /uede /ertenecer a un slo coc*e o a ninguno& Adem)s3 la clase coc*e tiene una /ro/iedad /rivada3 llamada rueda3 4ue almacena > referencias a ob etos de la clase Rueda&

%igura ==&F 6elacin de asociacin entre las clases A # B en la 4ue B es navegable desde A3 /ero no viceversa&
Coche -rue%a *))1 4 Rueda

%igura =>&F Asociacin entre la clase Coche # la clase

Rueda& .n ocasiones es Htil distinguir entre dos ti/os de relaciones de asociacin:


6elaciones de Agregacin& 6elaciones de (om/osicin&

6elaciones de Ag reg acin&F Son asociaciones en las 4ue una /arte contiene a elementos de otra /arte& Jormalmente res/onden a la /regunta 1tiene un2& .l diagrama de la %igura =9 /resenta una agregacin en la 4ue un ob eto de la clase A /uede contener otros de la clase B& SegHn U!" la relacin de agregacin solo aade informacin sem)ntica3 aun4ue suele significar 4ue el ob eto contenedor tiene una referencia al ob eto /arte& Por e em/lo3 la relacin Fun Coche tiene > RuedasF es una relacin de agregacin&
A B

%igura =9&F 6elacin de agregacin& "os ob etos de la clase A tiene referencias a ob etos de la clase B&

6elaciones de (om/osicin&F Son relaciones de agregacin con una relacin de /ertenencia fuerte& .sta /ertenencia suele im/licar 4ue el ob eto contenido se im/lementa como una /ro/iedad del ob eto contenedor& (omo consecuencia3 tanto contenedor como contenido3 una vez creados /ermanecen untos *asta su destruccin& Por e em/lo3 si se tiene la clase Empresa # la clase Departame!tos3 la relacin Funa em/resa 1tiene varios2 de/artamentosF es una relacin de com/osicin& (laramente la eliminacin de un ob eto de ti/o Empresa im/lica eliminar los ob etos de la clase Departame!to&

F ?; F

Disear # Programar todo es em/ezar

A 1

%igura =?&F 6elacin de com/osicin& "os ob etos de la clase A son /ro/ietarios de ob etos de la clase B&

Por otro lado3 en el e em/lo de agregacin anterior e0iste una relacin de /ertenencia m)s dbil entre los ob etos Rueda # los ob etos Coche& "a e0istencia de un ob eto Coche es inde/endiente de la e0istencia de ob etos Rueda& Si se destru#e un ob eto Coche el ob eto Rueda /uede seguir e0istiendo3 /or e em/lo /ara utilizarse en otro ob eto Coche& %inalmente se debe decir 4ue la ausencia de estos adornos en un diagrama no im/lica 4ue luego en el cdigo no se im/lementen los elementos 4ue no se detallan& Su ausencia slo significa 4ue no se *a considerado im/ortante su inclusin en ese diagrama& Dimensin din)mica Al igual 4ue en el caso de las relaciones de de/endencia3 la dimensin din)mica de las relaciones de asociacin se re/resentan en U!" dentro de los Diagramas de +nteraccin& (u)ndo # cmo usar las relaciones de asociacin "as relaciones de asociacin deben usarse cuando se /rev una tem/oralidad alta en la relacin de dos ob etos& 6es/ecto a la visibilidad debe fomentarse el uso de /ro/iedades /rivadas& .n caso necesario deber)n definirse mtodos con ma#or visibilidad /ara consultar o cambiar el valor de tales /ro/iedades& Por Hltimo se debe /otenciar la versatilidad utilizando el /olimorfismo& Para ello3 en la definicin de las /ro/iedades3 debe /referirse utilizar referencias a clases bases frente a clases derivadas& . em/lo del /rog rama de facturacin Para ilustrar los conce/tos de asociacin # de/endencia recin e0/uestos se /ro/one disear un /rograma 4ue /ermita crear e im/rimir las facturas de una tienda de venta de recambios de automviles& .l /rograma deber) /ermitir crear facturas e im/rimirlas& "as facturas contendr)n la informacin relativa al cliente 7nombre e identificacin fiscal8 # a las /iezas 4ue com/ra 7nombre # /recio8& Primeramente se realiza el Diagrama .st)tico de (lases de la %igura =@& .ste diagrama inclu#e varios elementos 4ue se deducen directamente del enunciado& As53 inclu#e la clase Facturacio!Recambios 4ue contiene el mtodo mai!3 donde comienza la e ecucin del /rograma& Tambin se deducen del enunciado las clases +ie&a # Clie!te& .stas clases se encargan res/ectivamente de recoger # mantener la informacin relativa a las /iezas # al cliente& "a clase Factura3 4ue se encarga de contener /iezas # clientes # de im/rimir el resultado3 tambin se deduce del enunciado& %inalmente3 la clase Me!u se encarga de /ermitir navegar entre las o/ciones de crear facturas e im/rimir&

%igura =@&F Diagrama de clases inicial /ara el /rograma de facturacin&

F ?DF

(a/5tulo 9

Diseo de (lases

Tras este diagrama de clases /reliminar3 se /rocede a crear Diagramas de Secuencia basados en diferentes escenarios& As5 se crean diagramas /ara los escenarios de: creacin de una factura desde el menH 7%igura =;83 rellenado de los datos de una factura 7%igura =D8 e im/resin de la misma 7%igura >C8& Para ilustrar el car)cter iterativo del /roceso de descubrimiento de clases # mtodos3 finalmente3 en la %igura >:3 se /resenta un diagrama de clases 4ue recoge los mtodos descubiertos al crear los Diagramas de Secuencia& .ste /roceso iterativo de descubrimiento # refinamiento es la base del diseo basado en el an)lisis del /roblema&

%igura =;&F Diagrama de secuencia 4ue refle a la creacin de una nueva factura desde el menH&

%igura =D&F Diagrama de secuencia 4ue refle a cmo se rellenan los datos de una factura&

F @C F

Disear # Programar todo es em/ezar

%igura >C&F Diagrama de secuencia 4ue refle a la im/resin de una factura desde el menH&

%igura >:&F Diagrama de clases con los mtodos encontrados en los diagramas de secuencia&

9&>& 6elaciones entre clases


Ta *emos visto 4ue la *erencia es un mecanismo3 /ro/orcionado /or los lengua es orientados a ob etos3 4ue /ermite crear erar4u5as entre clases e interfaces& 6es/ecto a la *erencia de im/lementacin3 las erar4u5as deben buscar las similitudes 4ue deben im/lementarse en las clases bases /ara 4ue las clases derivadas las a/rovec*en& 6es/ecto a la *erencia de interfaces3 las erar4u5as deben definirse de manera 4ue las interfaces derivadas se consideren casos concretos de las interfaces bases3 facilitando los com/ortamientos /olimrficos& (u)ndo utilizar el /olimorfismo Al *ablar de cmo se deben construir las erar4u5as de clases resulta im/rescindible tener en cuenta el /olimorfismo& Por un lado3 el /olimorfismo est)tico3 es decir3 el uso de varios mtodos con el mismo nombre /ero con diferentes /ar)metros dentro de una clase3 debe utilizarse /ara /ro/orcionar uniformidad a a4uellos mtodos 4ue conce/tualmente *acen lo mismo /ero 4ue lo *acen /artiendo de diferentes elementos&

F @:F

(a/5tulo 9

Diseo de (lases

Por otro lado3 al tratar con erar4u5as de clases3 a menudo se desea tratar un ob eto de una forma genrica e inde/endiente del ti/o es/ec5fico al 4ue /ertenece& .l /olimorfismo din)mico se utiliza en este caso /ara usar una misma referencia sobre distintos ob etos de una erar4u5a de clases& .sto /ermite realizar o/eraciones genricas sobre diferentes clases de ob etos 74ue com/arten una misma interfaz8 sin tener 4ue estar /endiente en cada momento de 4u ti/o de ob eto est) siendo tratado& As53 cuando se necesite 4ue un mtodo de una clase se com/orte de una forma u otra de/endiendo de una /ro/iedad de la clase3 /uede ser me or *eredar # crear diferentes clases con diferentes im/lementaciones /ara tal mtodo& .sto *ar5a 4ue si a/areciesen nuevos com/ortamientos no fuese necesario tocar el cdigo #a e0istente3 sino aadir nuevas clases& De esta forma3 el /olimorfismo din)mico fomenta la reutilizacin de cdigo sin rom/er la enca/sulacin& (rear clases abstractas o crear interfaces Ta se *a dic*o 4ue una clase abstracta es una clase de la 4ue no se /ueden crear instancias de ob etos debido a la ine0istencia de im/lementacin /ara alguno de sus mtodos& (rear clases abstractas sim/lifica las interacciones con con untos de ob etos 4ue com/arten cierto ti/o /or4ue abstraen interfaz # com/ortamiento& Por e em/lo3 si de la clase abstracta Coche *eredan varias clases 7Ford3 Re!ault3 %eat3 Citrde!83 se /odr5a definir la clase cara(e 4ue interactHa con ob etos 4ue cum/lan el ti/o definido /or la clase Coche sin conocer e0actamente de 4u clase /articular son estos ob etos& Tambin se *a dic*o 4ue en $ava slo e0iste *erencia sim/le entre clases3 es decir3 una clase no /uede *eredar de m)s de una clase simult)neamente& Al disear $ava se tom esta decisin /ara eliminar el /roblema de la ambigQedad 7ver :&<&=8& As53 los diseadores de $ava3 en su af)n /or sim/lificar a4uellos as/ectos de otros lengua es 7como (OO8 4ue com/licaban la /rogramacin3 /ro*ibieron la *erencia mHlti/le de clases& Sin embargo3 esta restriccin afecta de manera im/ortante al /olimorfismo din)mico3 al im/edir 4ue un mismo ob eto se com/orte como un elemento genrico de dos o m)s erar4u5as de clases diferentes& Por otro lado3 si las clases de las 4ue se *ereda no tuviesen im/lementado ningHn mtodo3 el /roblema de ambigQedad no e0istir5a& Por eso3 en $ava se /ermiti 4ue una clase /udiese *eredar de varias interfaces simult)neamente3 #a 4ue esto no im/lica ninguna ambigQedad3 # elimina los efectos negativos sobre el /olimorfismo derivados de la /ro*ibicin de la *erencia mHlti/le de clases& De nuevo3 usar adecuadamente la *erencia de interfaz abstrae las interacciones3 al /ermitir 4ue un mismo ob eto cum/la varios ti/os simult)neamente& .n general3 suelen utilizarse clases abstractas cuando adem)s de una interfaz genrica se desea aadir cierto com/ortamiento a todos los elementos de una erar4u5a& Por otro lado3 suelen utilizarse interfaces cuando slo se desea asegurar 4ue un con unto de ob etos cum/le cierta caracter5stica 4ue lo *ace tratable /or otro con unto de ob etos& Dimensin est)tica Ta se *a e0/licado 4ue en U!" la *erencia se re/resenta3 en el Diagrama .st)tico de (lases3 mediante una flec*a de /unta *ueca 4ue /arte de la clase 4ue *ereda # termina en la clase /adre3 # 4ue esta flec*a es /unteada si la *erencia es de interfaz& .n la %igura >< tenemos tres interfaces # dos clases& "a clase buad *ereda de AehiculoAMotorE /ero adem)s im/lementa las interfaces definidas /or Automovil # MotocicletaE las cuales a su vez derivan de Aehiculo& Adem)s3 el e em/lo ilustra la ine0istencia del /roblema de ambigQedad cuando solo e0iste *erencia sim/le de clases 7 buad *ereda de una sola clase8 aun4ue e0ista *erencia mHlti/le de interfaz 7buad im/lementa varias interfaces8& Obsrvese 4ue3 cuando un mtodo es abstracto se re/resenta en letras cursivas3 /or lo 4ue el mtodo "re!ar14 solo est) im/lementado en la clase buad. De la misma forma3 el mtodo acelerar14 solo /uede *eredarlo buad de AehiculoAMotor. Dimensin din)mica Un Diag rama de Actividad es fundamentalmente un diagrama de flu o 4ue muestra la secuencia de control entre diferentes acciones3 mostrando tanto la concurrencia como las bifurcaciones de control& "os Diagramas de Actividades /ueden servir /ara visualizar3 es/ecificar3 construir # documentar desde la din)mica de una sociedad de ob etos3 *asta el flu o de control de una Hnica o/eracin& "a e ecucin de una actividad se descom/one en la e ecucin de varias acciones individuales cada una de las cuales /ueden cambiar el estado de un ob eto o /ueden comunicar mensa es a otros ob etos& "os elementos b)sicos de un Diagrama de Actividad son:

"as acciones # nodos de actividad Ob etos de valor %lu os de control # de ob etos

"os sucesos 4ue describe un Diagrama de Actividad ocurren en las acciones # en los nodos de actividad& (uando el suceso es atmico3 no /uede descom/onerse3 es una accin& !ientras 4ue3 cuando el suceso /uede descom/onerse en sucesos m)s elementales es un nodo de actividad o actividad&

F @< F

Disear # Programar todo es em/ezar

%igura ><&F . em/lo de *erencia interfaces& Obsrvese 4ue no *a# /roblema de ambigQedad /or4ue las interfaces no im/lementan ninguno de los mtodos 4ue declaran&

Tanto las acciones como los nodos de actividad se re/resentan mediante un rect)ngulo con las es4uinas redondeadas 7vase la %igura >=8 # un te0to descri/tivo en su interior& .n el caso de las acciones el te0to se corres/onde a una o/eracin sim/le o a una e0/resin3 mientras 4ue en los nodos de actividad el te0to se corres/onde al nombre de otra actividad& .n general3 una accin /uede verse como un caso /articular de una actividad& .n adelante3 /or sim/licidad se *ablar) e0clusivamente de actividades3 aun4ue todo ser5a igualmente a/licable a acciones& .n los Diagramas de Actividad se /ueden re/resentar instancias de los ob etos involucrados mediante rect)ngulos 7vase la %igura >=8& .n el interior de estos rect)ngulos se describe mediante te0to la naturaleza del ob eto # su valor& Adem)s se /uede eti4uetar3 mediante un te0to entrecomillado3 4ue se denomina estereoti/o3 categor5as es/ecialmente im/ortantes de ob etos 7como /or e em/lo los almacenes8& "os ob etos de un Diagrama de Actividad /ueden corres/onder a elementos /roducidos3 consumidos o utilizados /or una actividad& "os flu os de control dentro de un Diagrama de Actividad marcan el orden en el 4ue se /asa de una actividad a otra& "os flu os de control se detallan mediante flec*as 4ue unen las ca as de las actividades 7vase la %igura >>8& .s /osible es/ecificar el /rinci/io de un flu o de control mediante un c5rculo relleno& +gualmente3 el fin de un flu o de control se /uede es/ecificar mediante un c5rculo relleno concntrico a una circunferencia e0terior& Dentro de los flu os de control es /osible es/ecificar bifurcaciones mediante rombos *uecos& Al rombo llega una flec*a de flu o de control # salen tantas flec*as como bifurcaciones se /roduzcan& Acom/aando a cada flec*a de salida del rombo se escribe un te0to entre corc*etes3 4ue se denomina guarda3 con la condicin 4ue determina 4ue se siga ese camino&

%igura >=&F Jodos de un Diagrama de Actividad& "os rect)ngulos redondeados corres/onden a acciones o a actividades3 mientras 4ue los rect)ngulos normales corres/onden a ob etos& Obsrvese 4ue se suelen /ermitir licencias como sombreados o colores&

F @=F

(a/5tulo 9

Diseo de (lases

%igura >>&F . em/lo de flu o de control& .l /unto relleno muestra el /unto de inicio de flu o de control3 los /untos concntricos son /untos de fin del flu o3 el rombo es una bifurcacin # las barras verticales son /untos de sincronizacin donde se crean o se unifican *ilos se/arados de e ecucin&

Tambin es /osible es/ecificar flu os concurrentes en los Diagramas de Actividades& "os /untos en los 4ue el control se divide o se une en mHlti/les *ilos se denominan barras de sincronizacin # se re/resentan mediante un segmento *orizontal o vertical de trazo grueso& (uando en un Diagrama de Actividad se involucran ob etos es /reciso detallar 4u actividad los /roduce o consume& As53 cuando un ob eto recibe una flec*a de una actividad3 significa 4ue el ob eto es /roducido /or ella& Por otro lado3 cuando e0iste una flec*a de un ob eto a una actividad significa 4ue la actividad consume dic*o ob eto& A /artir de la versin <&: de U!"3 es /osible aadir una /e4uea ca a3 denominada /in3 al contorno de una actividad /ara indicar de manera abreviada 4ue esa actividad crea o consume un ob eto& .n este caso3 sobre la flec*a se escribe un te0to 4ue describe al ob eto involucrado 7vase la %igura >98& %inalmente3 es /osible enlazar dos ob etos mediante una flec*a /ara indicar 4ue los ob etos interaccionan entre s5& "os Diagramas de Actividad se /ueden usar /ara detallar el com/ortamiento din)mico de un ob eto cuando su vida transcurre a travs de mtodos im/lementados en diferentes clases3 incluso cuando una /arte est) en una clase base # otra /arte est) en una clase derivada& Para ello3 las o/eraciones se anidan dentro rect)ngulos llamados calles& (ada calle dis/one de una eti4ueta 4ue indica cu)l es el mtodo # la clase en la 4ue se encuentra esa /arte de la im/lementacin&

=b?eto P

&

%igura >9&F . em/lo de flu o de ob etos& Arriba una 1actividad creadora2 crea un ob eto # se lo env5a al ob eto OE ste a su vez genera un ob eto 4ue lo consume la 1actividad consumidora2& Aba o otra 1actividad creadora2 crea un ob eto P 4ue lo env5a a la 1actividad consumidora2&

F @> F

Disear # Programar todo es em/ezar


@to%o 8+ %e la Clase #

acciAn sim$le

@to%o 8+ %e la clase 8

>n!ocar un mto%o ex$resion

@to%o 81 %e la clase #
-/>.

-4=.

Crear ob?eto

%igura >?&F . em/lo de Diagrama de Actividad con calles&

(u)ndo # cmo utilizar las relaciones de *erencia& "as relaciones de *erencia tienen una alta tem/oralidad en com/aracin con las relaciones de asociacin # de uso& Si una clase deriva de otra3 lo seguir) *aciendo mientras e0ista el /rograma& .n algunas ocasiones esta alta tem/oralidad es Htil& Por e em/lo3 si en el sistema educativo /uede *aber dos ti/os de /rofesores 7fi os e interinos83 # /ara cada uno se calcula el sueldo de una forma diferente se /uede usar *erencia /ara im/lementar los dos ti/os de /rofesores 7#a 4ue esta caracter5stica del sistema educativo no cambiar)8 # se /articularizar) la forma de c)lculo del sueldo en cada clase derivada& "a *erencia debe a/ortar versatilidad a los lengua es de /rogramacin& .n /articular3 el /olimorfismo din)mico debe /romover la versatilidad en los elementos 4ue se desarrollan3 mediante la definicin de referencias comunes a ob etos 4ue com/arten la misma erar4u5a& Desde el /unto de vista de la visibilidad la *erencia normalmente viola los /rinci/ios de enca/sulacin& .sto se debe a 4ue suele ser /reciso conocer bastante a fondo la clase de la 4ue se *ereda& Para conseguir 4ue esta visibilidad se restrin a slo a las clases derivadas debe cuidarse la seleccin de los mtodos /rotegidos& Adem)s3 debe limitarse en lo /osible la visibilidad de las /ro/iedades3 fomentando el acceso a las mismas a travs de mtodos3 de forma 4ue se im/idan un mal uso de la clase base& Por ello3 en $ava3 se recomienda el uso del modificador "i!al3 tanto al declarar las clases3 como en los mtodos3 /ues con ello se im/ide la *erencia& Solo en los casos en los 4ue se /iense 4ue la *erencia a/orta cierta venta a se debe omitir el modificador "i!al # documentando claramente cmo debe realizarse dic*a *erencia& (ontinuacin del e em/lo de la a/licacin de facturacin Se desea am/liar el /rograma de facturacin de recambios con mecanismos de /ersistencia sobre una base de datos& As53 el /rograma deber) /ermitir la consulta de /recios3 la consulta de clientes3 el almacenamiento de clientes # el almacenamiento de las facturas& (on este ob eto se crea una clase Co!sultaBD& De esta clase3 *eredar)n diversas clases 4ue im/lementaran las diferentes o/eraciones a realizar contra la base de datos 7ver %igura >@8& .sta clase3 4ue se utilizar) desde la clase Factura3 gestionar) la cone0in con la base de datos& "as clases derivadas se encargar)n de im/lementar los detalles relativos a cada o/eracin& .ste enfo4ue tiene diferentes venta as& Por un lado3 /ermite aumentar el nHmero de o/eraciones sin aumentar la com/le idad de una sola clase& Por otro lado3 /ermite centralizar o/eraciones comunes3 como la cone0in con la base de datos& .l Diagrama de Actividad de la %igura >; ilustra esta Hltima /osibilidad&

F @9F

(a/5tulo 9

Diseo de (lases

%igura >@&F (lases usadas /ara introducir /ersistencia en la a/licacin de facturacin&

%igura >;&F Diagrama de Actividad 4ue ilustra la divisin de tareas a travs de la *erencia en la /ersistencia del /roblema de facturacin&

9&9& (onclusiones
Se *a visto 4ue las relaciones de asociacin a#udan a mantener la enca/sulacin3 mientras 4ue las relaciones de *erencia tienden a violarla al /recisar muc*a visibilidad& Adem)s3 la *erencia suele *acer crecer las interfaces de las clases dis/ersando su com/ortamiento3 convirtindolas en elementos dif5ciles de gestionar # utilizar& Por ello3 debe favorecerse la asociacin de ob etos frente a la *erencia de clases cuando el ob etivo es crear ob etos con nuevas funcionalidades& Por otro lado3 la *erencia debe utilizarse /ara crear interfaces comunes a con untos de clases 4ue com/arten cierta funcionalidad& .n estos casos3 las clases derivadas no *acen m)s 4ue im/lementar o es/ecializar el com/ortamiento de las clases /adres& %inalmente se debe sealar 4ue la e0/eriencia *a demostrado 4ue el diseo no debe llegar a l5mites absurdos& .s decir3 el diseo es una buena *erramienta en las /rimeras eta/as de desarrollo3 /ara /ensar sobre el desarrollo3 /ara coordinar al e4ui/o de traba o # /ara estimar la cantidad de traba o a realizar& Tambin es una buena *erramienta de documentacin3 /ues /ermite entender m)s f)cilmente la estructura de un /rograma 4ue mediante la ins/eccin del cdigo o la lectura de descri/ciones te0tuales& Sin embargo3 es innecesario3 # aHn contra/roducente3 4ue el diseo abar4ue todas las /articularidades de cada clase # de cada mtodo&

9&?& "ecturas recomendadas


1U!" -ota a gota23 !artin %owler3 Pearson3:DDD& .s un libro breve de im/rescindible lectura /ara introducirse en el diseo orientado a ob etos mediante U!"&

9&@& . ercicios
. ercicio : KPu utilidad /uede tener un Diagrama de ActividadL KT uno de secuenciaL KSon e4uivalentes los Diagramas de Actividad # de SecuenciaL KPor 4uL . ercicio < Utilizando el /aradigma de orientacin a ob etos se desea disear el software de control de una m)4uina e0/endedora de billetes de metro& "a m)4uina ser) ca/az de e0/ender diferentes ti/os de billetes 7ti/o :3 ti/o <3 ti/o =&&&8 4ue se im/rimen en F @? F

Disear # Programar todo es em/ezar diferentes ti/os de /a/el 7ti/o a3 ti/o b3 ti/o c&&&8& Adem)s cada ti/o de billete tendr) un nombre # un /recio diferente& Debiendo ser todas estas caracter5sticas de los billetes 4ue e0/ende la m)4uina configurables desde un menH a/ro/iado& Para ser ca/az de realizar sus funciones la m)4uina dis/one de dos elementos *ardware es/ec5ficos: una im/resora de billetes # un monedero autom)tico& "a clase +mpresora&F Para controlar la im/resora de billetes el fabricante de la misma suministra una biblioteca 4ue consta de la clase Impresora& .sta clase /ermite controlar si la im/resora tiene tinta # si tiene billetes de un ti/o de /a/el determinado& Adem)s /ermite ordenar a la im/resora la im/resin3 grabacin magntica # e0/ulsin de un billete de un determinado ti/o& .l ti/o de billete 4ue se im/rima corres/onder) a un valor entero 4ue ser) grabado en la banda magntica del billete /ara 4ue sea reconocido /or los torni4uetes de la red de metro& "a clase Mo!edero&F .l fabricante del monedero autom)tico tambin suministra una biblioteca& Rsta consta de la clase Mo!edero 4ue /ermite controlar el monedero autom)tico& "a clase /ermite verificar el dinero 4ue un cliente *a introducido /or la ranura # si el monedero /uede devolver cierta cantidad de dinero& Adem)s /ermite ordenar al monedero suministrar cierta cantidad de dinero # devolver el dinero 4ue *a entrado /or la ranura&

.s4uema de funcionamiento&F Jormalmente la m)4uina /resentar) un dialogo a los clientes /ara 4ue stos eli an el ti/o de billete 4ue desean com/rar& Des/us la m)4uina /edir) 4ue se introduzca el dinero # 4ue se /ulse .JT.6 cuando se termine de introducir el dinero& Seguidamente la m)4uina efectuar) las o/eraciones necesarias /ara im/rimir el billete # devolver el cambio o devolver el dinero3 volviendo finalmente al /unto inicial& "a m)4uina tambin /odr) /resentar un mensa e de servicio no dis/onible debido a falta de tinta o billetes& Por otro lado3 la m)4uina tambin deber) /ermitir entrar en modo mantenimiento /ara 4ue un o/erador /ueda introducir nuevos ti/os de billetes3 modificar o eliminar los ti/os actuales3 o mani/ular la im/resora 7/ara recargarla8 # el monedero 7/ara recoger o introducir dinero8& Se /ide: a8 Pro/oner las clases necesarias 4ue3 aadidas a la clase Mo!edero # a la clase Impresora3 /ermiten construir el e0/endedor de billetes& $ustificar a grandes rasgos /ara 4u sirve cada una de las clases /ro/uestas& b8 Dibu ar el Diagrama .st)tico de (lases /resentando las clases /ro/uestas3 inclu#endo los mtodos # /ro/iedades 4ue a /riori se consideren interesantes 7indicando su visibilidad8& Presentar en este diagrama tambin la clase monedero # la clase im/resora # las relaciones de asociacin3 de/endencia # *erencia 4ue a /riori e0istan entre todas 7/recisando su cardinalidad cuando corres/onda8& c8 Dibu ar un Diagrama de Secuencia en el cual se refle e el escenario en el 4ue un cliente interactHa con la m)4uina /ara obtener un billete3 introduciendo dinero de sobra3 # la o/eracin se realiza con 0ito3 devolviendo el cambio la m)4uina& . ercicio = Disear un /rograma 4ue /ermita a dos /ersonas ugar una /artida de tres en ra#a& .l uego debe desarrollarse de manera 4ue los ugadores3 en turnos alternados3 dis/ongan tres fic*as cada uno sobre un tablero de =0= casillas& "uego3 el uego tambin sigue turnos alternados3 de forma 4ue los ugadores /ueden mover una fic*a cada vez entre casillas dos ad#acentes& .l uego finaliza cuando un ugador consigue dis/oner sus tres fic*as en l5nea& . ercicio > +m/lementar el cdigo corres/ondiente al e ercicio anterior& . ercicio 9 Am/liar el diseo del e ercicio = /ara 4ue /ermita a dos /ersonas ugar una /artida de a edrez usando el ordenador como instrumento de la /artida& Se debe intentar /otenciar la construccin de elementos reutilizables 4ue /uedan servir /ara im/lementar m)s uegos similares 7como las Damas3 el 6eversi3 el Tres en 6a#a&&&8&

F @@F

(a/5tulo ?

.ntradaIsalida en $ava

.l /a4uete (ava.io contiene un con unto de clases 4ue /osibilitan las o/eraciones de entrada salida& .n /articular3 en este ca/5tulo3 veremos el so/orte 4ue /ro/orciona /ara el acceso a dis/ositivos /ermanentes de almacenamiento # /ara la serializacin& Para la gestin de los flu os de datos 7fic*eros3 /erifricos&&&8 $ava define un mecanismo mu# /otente conocido como stream & Un stream es un flu o ordenado de datos 4ue tienen una fuente # un destino& "a /otencia 4ue a/ortan los streams se fundamenta en 4ue /or su estructura /ermiten ser concatenados incrementando su funcionalidad& Por e em/lo3 es /osible abrir un stream desde un fic*ero3 concatenarlo a un stream 4ue /ro/orciona un buffer /ara *acer m)s eficiente la lectura3 # concatenarlo a otro stream 4ue va seleccionando las /alabras 4ue est)n se/aradas /or es/acios& De esta forma se consigue /or e em/lo 4ue un /rograma 4ue *a abierto un fic*ero /ara lectura reciba una secuencia de /alabras en vez de una secuencia de b#tes& "os streams3 4ue $ava /ro/orciona /ara gestionar la entrada # salida de datos desde los dis/ositivos *abituales3 se encuentran definidos dentro de los /a4uetes contenidos en (ava.io& Atendiendo a la naturaleza de los datos 4ue mane an los streams de io se dividen en dos gru/os:

Streams de b#tes& Streams de caracteres&

Por otro lado3 atendiendo a la direccin de los datos los streams de io se dividen en dos gru/os:

Streams de entrada& Streams de salida&

As5 /ues3 /odemos tener streams de b#tes de entrada3 streams de b#tes de salida3 streams de caracteres de entrada # streams de caracteres de salida&

?&:& Streams de b#tes


(ada dato 4ue flu#e a travs de un stream de b#tes es gestionado /or la interfaz como un entero de =< bits3 usando solo el rango com/rendido entre C # <99 /ara el valor del dato3 # utilizando el valor F: como seal de fin del flu o& "os streams de b#tes /ueden ser de entrada o de salida& "os streams de entrada derivan de la clase abstracta I!put%tream3 # los de salida de autput%tream& "os diagramas est)ticos de la %igura 9C ilustran algunas de las clases 4ue derivan de I!put%tream # autput%tream& "os mtodos /rinci/ales de I!put%tream son: read143 close143 available143 s$ip143 mar$143 reset14&
read14 /ermite leer cada vez un b#te o un con unto de b#tes mediante un arra#& close14 cierra el flu o im/idiendo cual4uier lectura /osterior& avaiable14 devuelve el nHmero de elementos 4ue se /ueden leer del stream sin de arlo blo4ueado& s$ip18 /ermite saltar la lectura de un nHmero variable de b#tes& mar$14 # reset14 /ermiten marcar la /osicin actual de lectura sobre el stream # volver a ella m)s tarde&

%igura >D&F 6e/resentacin de la clase I!put%tream con algunos de sus miembros&

F @D F

(a/5tulo ?

.ntradaIsalida en $ava

Todas las clases 4ue derivan de I!put%tream /ermiten a un /rograma en $ava obtener datos desde algHn dis/ositivo o bien transformar datos 4ue /rovengan de otro I!put%tream. Derivando de I!put%tream el /a4uete (ava.io define:
FileI!put%tream 4ue /ermite leer desde fic*ero& B5teArra5I!put%tream # %tri!,Bu""erI!put%tream 4ue /ermite obtener un flu o de un arra# # de un %tri!, res/ectivamente& +ipedI!put%tream 4ue /ermite recibir datos 4ue se estn escribiendo en un tubo 7 /i/e8 normalmente desde

otro *ilo de e ecucin&


ab(ectI!put%tream /ermite leer un ob eto 4ue *a sido serializado& FilterI!put%tream /ermite transformar los flu os /rocedentes de otras fuentes& .sta clase es abstracta3 #

de ella derivan una serie de clases 4ue constitu#en filtros concretos& As5:
Bu""eredI!put%tream inter/one un buffer entre un stream de entrada # un usuario del flu o /ara evitar

leer los b#tes de uno en uno3 acelerando la lectura&

DataI!put%tream transforma un flu o de b#tes en un flu o de ti/os /rimitivos& eI+I!put%tream # ceI+I!put%tream /ermiten obtener datos en claro de flu os de datos com/rimidos& Se encuentran en el /a4uete (ava.util&

"a clase abstracta autput%tream tiene los siguientes mtodos: close143 "lush14 # ;rite14& .stos mtodos /ermiten res/ectivamente: cerrar un stream3 volcar los datos 4ue 4uedan /endientes # escribir un b#te o arra# de b#tes& Adem)s3 de autput%tream derivan clases an)logas a las de entrada /ero con el flu o en sentido o/uesto& .s decir3 clases 4ue tienen /or ob eto e0/ortar en forma de b#tes datos de un /rograma *acia otro lugar&
"utputStrea) Filter"utputStrea)
InputStrea) FilterInputStrea) DataInputStrrea) Bu00eredInputStrea)

Bu00ered"utputStrea) Data"utputStrrea) De0later"utputStrea) 91I!"utputStrea)


In0laterInputStrea) 91I!InputStrea) 1I!InputStrea)

1I!"utputStrea) File"utputStrea) B+teArra+"utputStrea)

FileInputStrea)

%igura 9C&F Diagrama con los /rinci/ales streams de entrada # salida de b#tes&

.l siguiente fragmento de cdigo ilustra la a/ertura de un stream desde fic*ero # la lectura de los datos del mismo& Para ello se utiliza un ob eto de la clase FileI!put%tream # la clase AectorDi!amico definida en =&<&: /ara almacenarlos&
I!put%tream i! G new FileI!put%tream16)home)user)`ombreFichero647 AectorDi!amico vector G new AectorDi!amico147 int co!t G C7 I!te,er dato G i!.read147 if 1dato UG =B4 vector.po!er1co!tOOEdato47 while1dato UG =B4 / dato G i!.read147 vector.po!er1co!tOOEdato47 8

"os siguientes diagramas ilustran algunos de los mtodos de los streams de b#tes 4ue tratan la com/resin&

F ;C F

Disear # Programar todo es em/ezar

Filter"utputStrea) -out

FilterInputStrea) -in

De0later"utputStrea) +%e;late01

In0laterInputStrea) +in;late01 +;ill01

1I!"utputStrea) +setComment01 +set4extEntr&01 +set9e!el01 +set@et'o%01

91I!"utputStrea) -crc

1I!InputStrea) +createBi$Entr&01 +3et4extEntr&01

91I!InputStrea) -crc -eos -CB>P2@8C>C

%igura 9:&F Streams de entrada # salida de b#tes com/rimidos con algunos de sus miembros&

?&<& Streams de caracteres


"os datos 4ue via an a travs de un stream de caracteres corres/onden a sucesiones legibles de caracteres Unicode 7de :? bits binarios8& .stos datos se gestionan en la interfaz de stream usando enteros de =< bits& "os datos slo toman valores entre C # ?99=93 # el valor F: se usa /ara indicar el fin de flu o& "os streams de caracteres /ueden ser de entrada o de salida& "os streams de entrada derivan de la clase Reader3 # los de salida de ]riter& "os Diagramas .st)ticos de (lases de la %igura 9< ilustran algunas de las clases 4ue derivan de Reader # ]riter& Todas las clases 4ue derivan de Reader tienen /or ob eto introducir caracteres en un /rograma $ava desde otro sitio& "as /rinci/ales clases derivadas de Reader son:
Bu""eredReader /ara construir un buffer 4ue me ore el rendimiento en el acceso a otro flu o de entrada& Adem)s aade el mtodo read i!e14 4ue devuelve un %tri!, /or cada invocacin& CharArra5Reader # %tri!,Reader /ara transformar arra#s de caracteres # ob etos %tri!, en flu os de

caracteres res/ectivamente& "a clase I!put%treamReader es un /uente entre un I!put%tream # un Reader3 4ue /ermite transforma flu os de b#tes en flu os de caracteres& "a clase FileReader derivada de I!put%treamReader /ermite leer caracteres de fic*ero&
Reader CharArra+Reader StringReader Bu00erdReader InputStrea)Reader FileReader

-riter Bu00erd-riter CharArra+-riter String-riter "utputStrea)-riter File-riter

%igura 9<&F Diagrama con los /rinci/ales streams de entrada # salida de caracteres&

De la clase abstracta ]riter derivan clases an)logas a las de entrada /ero en sentido o/uesto& Su ob etivo es e0/ortar en forma de caracteres los datos /roducidos /or un /rograma $ava& .l siguiente e em/lo crea un FileReader 4ue lee un fic*ero car)cter a car)cter&
char cr7 Reader i! G new FileReader16`ombre "ichero647 do / cr G i!.read147 8 while 1cr UG =B47

F ;:F

(a/5tulo ?

.ntradaIsalida en $ava

Reader +rea%01 +reset01 +ski$01 +close01 +rea%&01

StringReader

InputStrea)Reader

Bu00erdReader

CharArra+Reader FileReader +toC'ar8rra&01 +siDe01 +reset01 +o$eration101 +to/trin301 +5riteTo01

%igura 9=&F Steams de entrada de caracteres con algunos de sus miembros&


-riter String-riter +3et#u;;er01 +to/trin301 +5rite01 +;lus'01 +close01

"utputStrea)-riter

Bu00erd-riter +ne59ine01

File-riter

CharArra+-riter

%igura 9>&F Streams de salida de caracteres con algunos de sus miembros&

"as o/eraciones de lectura # escritura en un fic*ero utilizando directamente FileReader # File]riter /ueden ser mu# ineficaces /or4ue en cada o/eracin de entradaIsalida slo se lee un b#te # se /uede desa/rovec*ar la ca/acidad del /erifrico de tratar una serie de datos de una vez& Para agilizar el /roceso se debe utilizar un buffer 4ue /ermita tratar un con unto de b#tes en cada o/eracin de entradaIsalida& .l tamao del buffer debe a ustarse teniendo en cuenta la ca/acidad de almacenamiento en memoria /rinci/al del ordenador # las necesidades de lectura o escritura& "as clases Bu""reReader # Bu""er]riter /ueden ser concatenadas a FileReader # File]riter res/ectivamente3 # /ermiten definir el tamao del buffer 4ue se utilizar) en cada o/eracin de entradaIsalida& A continuacin se /resenta un e em/lo en el 4ue se utiliza un buffer de :C datos /ara leer de disco& (on ello las o/eraciones f5sicas contra disco se reducen en media a : de cada :C&
int c7 Reader i! G new FileReader16C9::prueba.txt647 Reader bu" G new Bu""eredReader1i!EBC47 do / c G bu".read147 char cr G 1char4 c7 %5stem.out.pri!t1cr47 8 while 1c UG =B47

F ;< F

Disear # Programar todo es em/ezar

?&<&: Streams del sistema


Uni0 introdu o el conce/to de entradaIsalida est)ndar /ara definir los flu os de entrada3 salida # error 4ue /or defecto utiliza un /rograma& Uni0 defini tres flu os: la entrada3 la salida # la salida de error& Por eso en $ava e0isten esos mismos tres streams de b#tes:
%5stem.i! %5stem.out %5stem.err

A lo largo de los temas /recedentes *emos utilizado %5stem.out /ara mostrar mensa es /or /antalla& A*ora sabemos 4ue %5stem.out no es la /antalla sino la salida est)ndar3 4ue /or defecto es la /antalla& .n caso de 4ue la salida de nuestro /rograma en $ava estuviese conectada 7mediante un /i/e del s*ell8 con otro /rograma los datos enviados a %5stem.out se dirigir5an a la entrada de ese /rograma& De la misma forma3 los datos 4ue se env5en al flu o %5stem.err se dirigir)n a la salida de error est)ndar 4ue tenga definido nuestro sistema o/erativo& .l flu o de entrada %5stem.i! es m)s dif5cil de usar& %5stem.i! es un I!put%tream3 /or lo 4ue los elementos 4ue devuelve son b#tes& (uando se *ace read sobre l3 la e ecucin se sus/ende *asta 4ue /or la entrada est)ndar entra un flu o de b#tes& .n el caso del teclado esto ocurre al /ulsar una serie de teclas # finalmente la tecla E!ter&
int c G %5stem.i!.read147 %5stem.out.pri!tl!1c47

Si 4ueremos utilizar %5stem.i! /ara leer caracteres lo m)s sencillo es transformarlo en un Reader 7#a *emos visto 4ue eso es /osible utilizando la clase I!put%treamReader4& Adem)s es conveniente conectar este flu o a Bu""eredReader /ara 4ue nos devuelva cada cadena introducida /or teclado como un %tri!,3 en vez de como una sucesin de nHmeros& .l siguiente e em/lo define un Reader sobre %5stem.i! # le aco/la un Bu""eredReader /ara leer una cadena del teclado # luego im/rimirla /or /antalla&
Reader i G new I!put%treamReader1%5stem.i!47 Bu""eredReader r G new Bu""eredReader1i47 %tri!, s G r.read i!e147 %5stem.out.pri!t16'a escrito9 647 %5stem.out.pri!tl!1s47

?&<&< #tream$okeni!er # #canner


"a clase %treamTo$e!i&er /ermite transformar un I!put%tream en una secuencia de toEens m)s f)cilmente utilizable /or un /rograma& "os toEens /or defecto son /alabras o nHmeros se/arados /or es/acios& (uando se le env5a un mensa e de !extTo$e!14 a un %treamTo$e!i&er se 4ueda es/erando a 4ue lleguen b#tes /or el flu o 4ue se le *a asociado en su creacin& (onforme va llegando ese flu o se es/era a 4ue se /ueda com/letar una /alabra o un nHmero& .n cuanto se tiene una de las dos3 la e ecucin continHa con la siguiente instruccin a !extTo$e!14&
Strea)&o*eni3er -s!al -n!al -TT2E=9 -TT2E=F -TT247@#E6 -TT2F=6D -tt&$e +nextToken01 +lineno01 +$arse4umbers01 +commentC'ar01 +eol>s/i3ni;icant01 +lo5erCase@o%e01 +or%inar&C'ar01 +$us'#ack01 +EuoteC'ar01 +)))01

%igura 99&F Algunas de las /ro/iedades de la clase 4ue divide un stream en toEens&

.l siguiente e em/lo ilustra el uso de un %treamTo$e!i&er /ara leer una cadena desde teclado3 le#endo # distinguiendo cada vez nHmeros o /alabras& F ;=F

(a/5tulo ?

.ntradaIsalida en $ava

%treamTo$e!i&er /ermite seleccionar el car)cter 4ue se utiliza como se/arador de toEens3 como fin de l5nea e incluso

elegir un car)cter /ara identificar comentarios 4ue no se asocian a ningHn toEen& (uando el stream /roviene de fic*ero la condicin de .O% 7end of file8 se /roduce de manera natural3 sin embargo cuando el stream /roviene del teclado es necesario forzar .O% mediante la combinacin (6T"O(&
int resultadoGC7 %treamTo$e!i&er !ums G new %treamTo$e!i&er1%5stem.i!47 while 1!ums.!extTo$e!14 UG %treamTo$e!i&er.TT#EaF4 / if 1!ums.tt5pe GG %treamTo$e!i&er.TT#]aRD4 %5stem.out.pri!tl!1!ums.sval47 else if 1!ums.tt5pe GG %treamTo$e!i&er.TT#`^MBER4 %5stem.out.pri!tl!1!ums.!val47 8

"a clase %ca!!er se califica *abitualmente como el relevo de %treamTo$e!i&er& %ca!!er /ermite definir la e0/resin regular 4ue toEeniza el stream& "a /rofundidad de las e0/resiones regulares est) m)s all) del ob eto de este te0to3 /or lo 4ue se recomienda la lectura de un te0to es/ec5fico&

?&=& !ane o de fic*eros


$ava3 adem)s de los streams /ro/orciona tres clases m)s /ara el mane o de fic*eros:
File&F .sta clase /ro/orciona mtodos Htiles /ara traba ar con fic*eros 7crear directorios3 renombrarlos3

consultar el tamao3 borrar fic*eros # directorios3 listar elementos de un directorio3 etc&8&


+ri!t]riter&F (lase 4ue /ermite escribir en un fic*ero utilizando una sinta0is similar a la de la funcin pri!t"14 de (& Ra!domAccessFile&F .sta clase /ermite tratar un fic*ero como un gran arra# de caracteres de entrada # salida

al 4ue se tiene una referencia& "os siguientes diagramas describen los /rinci/ales miembros de las clases File # Ra!domAccessFile&
File -se$arator -$at'/$erator -se$aratorC'ar +len3t'01 +renameTo01 +%elete01 +create4e5File01 +mk%ir01 +list01 +ser6ea%=nl&01 +can6ea%01 +canFrite01 +com$areTo01 +3et4ame01 +'as'Co%e01 +3etParent01 +isFile01 +isDirector&01 +)))01 Rando)AccessFile +3etFilePointer01 +seek01 +len3t'01 +ski$#&tes01 +set9en3t'01 +rea%C'ar01 +rea%#&te01 +rea%Float01 +rea%>nt01 +rea%9on301 +rea%9ine01 +5riteC'ar01 +5rite#&te01 +)))01

%igura 9?&F Algunas de las /ro/iedades de clases Htiles /ara mane o de fic*eros&

?&>& "a interfaz Serializable


"a /ersistencia se *a descrito en el /rimer ca/5tulo como una de las ca/acidades 4ue deber5a /ro/orcionar un lengua e de /rogramacin orientado a ob etos& $ava da so/orte a la /ersistencia mediante la serializacin& Se llama serializacin al /roceso de convertir un ob eto en un flu o de b#tes # se llama deserializacin a la reconstruccin del ob eto a /artir del flu o de b#tes& Para /ermitir un /roceso de serializacin comHn a todas las clases de ob etos $ava /ro/orciona la interfaz %eriali&able& .sta interfaz no define mtodos # slo sirve /ara indicar a los mtodos de la clase ab(ectautput%tream 4ue /ueden actuar sobre a4uel 4ue la im/lemente& "a clase ab(ectautput%tream define el mtodo ;riteab(ect143 4ue /ermite convertir un ob eto serializable en un flu o de datos de salida& Por otro lado3 la clase ab(ectI!put%tream /ermite transformar un flu o de datos de entrada en un ob eto gracias al mtodo readab(ect14& "os ob etos se serializan llamando a ;riteab(ect14 # se deserializan con el mtodo readab(ect14& (asi todas las clases definidas en los /a4uetes est)ndar de $ava se /ueden serializar 7/or e em/lo %tri!,3 los envoltorios&&&8& A)sicamente3 la F ;> F

Disear # Programar todo es em/ezar serializacin de una clase consiste en enviar a un flu o sus /ro/iedades no est)ticas3 # la deserializacin el /roceso contrario& Para evitar 4ue una /ro/iedad determinada se serialice 7/or e em/lo una contrasea8 se /uede utilizar en su declaracin la eti4ueta de /ro*ibicin de serializacin tra!sie!t& Para 4ue una clase /ueda serializarse3 todas las /ro/iedades contenidas en la clase deben corres/onder a ti/os /rimitivos o a ob etos cu#as clases cum/lan a su vez la interfaz serializable& .n otro caso3 al e ecutar ;riteab(ect14 obtendremos una e0ce/cin del ti/o `ot%eriali&ableExceptio! de (ava.io& Por eso3 en el e em/lo siguiente3 tanto la clase Coche3 como la clase Rueda3 utilizada /or Coche3 son serializables& (uando un ob eto se deserializa no se obtiene el mismo ob eto sino una co/ia de a4ul 4ue se serializ& .s decir3 tanto sus /ro/iedades como su com/ortamiento son iguales3 /ero no conserva la misma identidad& .l siguiente e em/lo ilustra este as/ecto&
class Rueda implements %eriali&able / public int presio! G B7 8 class Coche implements %eriali&able / public int velocidad7 public Rueda rB G new Rueda147 public Rueda rH G new Rueda147 public Rueda rK G new Rueda147 public Rueda rL G new Rueda147 8 public class E(emplo / public static void mai!1%tri!,23 ar,s4 / try / Coche c G new Coche147 c.rB.presio! G HL7 %tri!, "ic G 6c9::Coche.txt67 ab(ectautput%tream salida G new ab(ectautput%tream1new Fileautput%tream1"ic447 c.velocidad G H7 c.rB.presio! G K7 salida.;riteab(ect1c47 ))%e escribe el ob(eto a disco %5stem.out.pri!tl!1c.r.presio!47 )) a presio! valdr@ K salida.close147 ab(ectI!put%tream e!trada G new ab(ectI!put%tream1new FileI!put%tream1"ic447 Coche c#copia G 1Coche4 e!trada.readab(ect147 %5stem.out.pri!tl!1c#copia.velocidad47 ))Estas l>!eas imprimir@! u! B 5 %5stem.out.pri!tl!1c#copia.rB.presio!47 )) a presi! valdr@ HL por.ue el valor 8 ))se ,uard a!tes de cambiarlo a K catch1Exceptio! e4 / %5stem.out.pri!tl!1e47 8

Si se desea tener un control ma#or sobre el /roceso de serializacin se /uede im/lementar la interfaz Exter!ali&able3 en vez de %eriali&able& .sta interfaz3 derivada de %eriali&able3 /ermite definir los mtodos ;riteExter!al14 # readExter!al14& .stos mtodos se invocan autom)ticamente durante la serializacin # la deserializacin /ara /ermitir al /rogramador controlar el /roceso&

?&9& (onclusiones
.n este ca/5tulo se *a visto 4ue $ava /ro/orciona dos mecanismos b)sicos de mane o de fic*eros3 uno de acceso aleatorio # otro de acceso mediante flu os& Ser) tarea del /rogramado decidir 4u mecanismo es m)s conveniente en cada caso& Adem)s3 /ro/orciona mecanismos de serializacin # deserializacin 4ue sim/lifican la tarea de dotar de /ersistencia a las a/licaciones 4ue se desarrollen&

?&?& . ercicios
. ercicio : (on ob eto de sustituir en un aero/uerto unas /antallas analgicas de 6adar3 se desea construir un /rograma en $ava 4ue /ermita gestionar una /antalla digital de 6adar& Un fabricante de /antallas digitales *a /ro/orcionado unas /antallas t)ctiles de gran tamao 4ue vienen acom/aadas de un software de control de las mismas& .ste software consta de la clase Radar%cree! # de la interfaz RadarButto!& "os mtodos de la clase Radar%cree!3 orientados a la interaccin con las /antallas3 son:
void radar%cree!1double latitudE double lo!,itud4&F (onstructor donde se le indica a la /antalla la latitud #

la longitud de la ubicacin del radar& De esta forma la /antalla conoce autom)ticamente el ma/a 4ue debe /resentar& F ;9F

(a/5tulo ?

.ntradaIsalida en $ava

void dra;1i!t colorE double latitudE double lo!,itudE %tri!, eti.ueta4 &F .ste mtodo /ermite

dibu ar en la /antalla un ob eto& "a /ro/iedad color indica al sistema el color 4ue tendr) el ob eto 4ue se re/resente # 4ue ser) distinto /ara cada entero& "as /ro/iedades latitud # longitud /ermiten es/ecificar la latitud # la longitud del ob eto 4ue se desea re/resentar& Por Hltimo3 la /ro/iedad eti4ueta /ermite asociar un te0to a este ob eto /ara 4ue se visualice unto a l&
void clear%cree!14&F "im/ia la /antalla3 /re/ar)ndola /ara /intar los ob etos& void setButto!1RadarButto! butto!4&F Permite aadir un botn a la /antalla& .l botn ser) cual4uier ob eto 4ue im/lemente la interfaz RadarButto!&

"a interfaz RadarButto! define dos mtodos:


%tri!, label14&F Devuelve la eti4ueta 4ue mostrar) la /antalla al /intar el botn& clic$14&F .st mtodo ser) llamado /or la /antalla cuando alguien /ulse el botn asociado& "a im/lementacin de este

mtodo contendr) el cdigo 4ue im/lementar) el com/ortamiento 4ue se desee /ara el botn& A su vez3 el fabricante del radar *a /ro/orcionado una clase llamada Radar%treamReader 4ue /ermite la lectura de los datos transmitidos /or el radar& .sta clase se /uede concatenar a un %treamTo$e!i&er /ara obtener los datos sobre los aviones 4ue el radar detecta& .s decir3 se /uede ir /idiendo el valor 7 !val o sval8 a cada To$e! 7con !extTo$e!148 de manera indefinida& .l radar tiene un com/ortamiento c5clico3 4ue se re/ite a intervalos regulares& Por eso3 los datos /ro/orcionados /or la clase Radar%treamReader tambin son c5clicos& Debindose /intar los datos en cada ciclo3 # borrar la /antalla al /rinci/io del ciclo siguiente& "os datos 4ue /ro/orciona la clase se re/iten segHn la siguiente secuencia: identificador3 ti/o3 latitud3 longitud3 eti4ueta&
ide!ti"icador&F +dentificador del ob eto detectado /or el radar& Ser) un entero ma#or o igual a cero& .l /rimer ob eto

volante ser) el C& .l siguiente el :& T as5 sucesivamente *asta 4ue vuelva a a/arecer el elemento con identificador C&
tipo&F .ntero 4ue identifica los diferentes ti/os de ob etos volantes 7 militares G B3 civiles G H # !o#ide!ti"icados G K8& (ada ti/o deber) /resentarse de un color diferente en la /antalla3 4ue se corres/onder) con el

nHmero asociado al ti/o&


latitud # lo!,itud&F "atitud # longitud del ob eto detectado& eti.ueta&F (adena identificativa 7%tri!,8 transmitida /or el ob eto volante al radar /ara su /resentacin en /antalla&

Se /ide: a8 Presentar las clases 4ue a /riori se crean necesarias /ara resolver el /roblema del bucle c5clico de /resentacin de ob etos volantes 7incluidas las clases 4ue vienen im/uestas /or los fabricantes # las nuevas 4ue se consideren8& .0/licar la razn de ser 7el contrato8 de las clases nuevas 4ue se inclu#an& Dibu ar los Diagramas .st)ticos de (lases 4ue /resenten las relaciones entre todas las clases3 inclu#endo /ro/iedades3 mtodos # visibilidad de cada uno de ellos& b8 Dibu ar un Diagrama de Secuencia con el escenario del bucle de /resentacin de im)genes 7slo es necesario /resentar una iteracin del bucle8& .scribir en $ava el cdigo de todos los mtodos involucrados en este diagrama& c8 Se desea aadir un botn /ara detectar las colisiones entre los ob etos volantes /resentes en la /antalla& Para ello3 se *a com/rado una nueva clase /ara detectar colisiones& .sta clase es un s tream llamado Collisio!Detector%treamReader # tiene un constructor al 4ue se le /asa como /ar)metro un Radar%treamReader& Por lo dem)s se com/orta igual a Radar%treamReader e0ce/to /or 4ue el ti/o asignado a los ob etos 4ue /ueden colisionar se /one a C& Por eso3 se desea 4ue al a/retar este botn de deteccin de colisiones3 los ob etos 4ue /ueden colisionar cambien a color C& Detallar las clases nuevas 4ue ser)n necesarias /ara lograr este com/ortamiento& !ostrar en un Diagrama .st)tico de (lases las relaciones con las clases e interfaces e0istentes& !ostrar en un Diagrama de Secuencia el com/ortamiento din)mico desde 4ue se a/rieta el botn *asta 4ue se inicia el bucle c5clico de /resentacin de ob etos volantes&

F ;? F

(a/5tulo @

.str ucturas de datos /redefinidas en $ava

(ava.util aade toda una erar4u5a de interfaces # clases enfocadas a /ermitir la creacin de ob etos contenedores de

Aun4ue en $ava la clase 4ue se utiliza como contenedor b)sico es el arra# 7#a descrito en el ca/5tulo <83 el /a4uete

otros ob etos& .stos contenedores /ermiten almacenar ob etos utilizando diferentes /ol5ticas de almacenamiento& "os contenedores 4ue se encuentran en el /a4uete (ava.util /ueden ser de dos ti/os b)sicos: ti/o collectio! # ti/o
map&

,asta la versin :&9 los contenedores no utilizaban genericidad # /or lo tanto no conoc5an el ti/o del ob eto 4ue conten5an& A /artir de la versin :&9 todos los contenedores /ermiten la /arametrizacin del ti/o 4ue contienen3 aun4ue /or razones de com/atibilidad se *a mantenido tambin la versin sin genericidad&

@&:& Collection
Todas las clases 4ue im/lementan la interfaz Collectio! se caracterizan /or constituir gru/os de ob etos individuales con una relacin de orden entre ellos& Todos los ob etos de ti/o Collectio! com/arten los siguientes mtodos: add1ob(eto43 isEmpt5143 co!tai!s1ob(eto43 clear143 remove143 si&e143 toArra514 e iterator14& .ntre los derivados de Collectio! se /ueden destacar:
#et&F +nterfaz 4ue /uede contener un con unto de elementos donde no se admiten re/eticiones& #orted#et&F +nterfaz 4ue deriva de %et cu#os elementos est)n ordenados& Aade los siguientes mtodos: "irst143 last143 sub%et143 head%et143 tail%et14& Precisa 4ue los elementos insertados cum/lan la interfaz Comparable #

utiliza la com/aracin 4ue esta interfaz define /ara determinar si dos ob etos son iguales& "os ob etos3 una vez insertados no /ueden cambiar su relacin de orden o los resultados ser)n im/revisibles&
$ree#et&F (lase 4ue im/lementa %orted%et en la 4ue los elementos internamente se mantienen ordenados mediante una

estructura de )rbol&
%ash#et&F (lase 4ue im/lementa %et con una tabla *as*& (omo venta a a/orta 4ue el nHmero de ob etos contenidos en la

estructura no re/ercute en la velocidad de las o/eraciones de bHs4ueda3 eliminacin e insercin& Adem)s los ob etos /ueden cambiar libremente /ues la relacin de orden no de/ende de su estado& "a desventa a estriba en 4ue no se /ueden recorrer segHn un orden fi ado /or el /rogramador& Utiliza el mtodo hashCode143 definido en la clase ab(ect3 /ara determinar si dos ob etos son iguales&
List&F +nterfaz de elementos ordenados& A/orta los siguientes mtodos a la interfaz Collectio! de la 4ue deriva: ,et1>!dice43 set1>!diceEob(eto43 add1>!diceEob(eto43 remove143 i!dexa"143 sub ist1mi!Emax4. &rrayList&F (lase 4ue im/lementa ist mediante un arra#& Tiene la venta a de /ermitir un acceso aleatorio r)/ido a los

elementos 4ue contiene& "a insercin tiene un coste mu# ba o3 e0ce/to cuando se sobre/asa el tamao actualmente reservado3 momento en el 4ue autom)ticamente se debe aumentar el tamao # co/iar su contenido& "as o/eraciones de insercin # eliminacin3 si no son /or el final3 tienen un coste elevado3 #a 4ue im/lican movimiento de memoria&
LinkedList&F (lase 4ue im/lementa ist usando un con unto de nodos doblemente enlazados& .l acceso aleatorio a los elementos de esta estructura es m)s lento 4ue en el caso del Arra5 ist& Sin embargo3 la insercin de elementos se realiza en tiem/o constante& A/orta los siguientes mtodos: ,et"irst143 ,et ast143 addFirst1ob(eto43 add ast1ob(eto43 removeFirst143 remove ast14& 'ector&F (lase 4ue im/lementa ist # 4ue /ermite construir vectores& .ntre otros mtodos aade algunos de acceso aleatorio como: eleme!tAt14 e i!sertEleme!tAt14& Aector es similar a Arra5 ist salvo /or dos diferencias im/ortantes& Aector est) diseada /ara un uso concurrente seguro # Arra5 ist no3 /or lo 4ue Aector es m)s segura /ero ofrece /eor rendimiento& Adem)s3 Aector /ermite es/ecificar cmo crece su ca/acidad cuando se agota su ca/acidad

actual&
#tack&F (lase 4ue e0tiende Aector /ara /ermitir usarla con las o/eraciones *abituales en /ilas& Aade mtodos como push # pop /ara insertar # obtener elementos de la /ila&

. em/lo de uso de &rrayList .l siguiente e em/lo ilustra el uso de la clase Arra5 ist /ara almacenar ob etos de la clase %tri!, sin usar ti/os genricos& F ;@ F

(a/5tulo @

.structuras de datos /redefinidas en $ava

ist lista G new Arra5 ist147 for 1int co!t G C7 co!t F BCC7 co!tOO4 lista.add16'ello647 %5stem.out.pri!tl!1lista47

A continuacin se /resenta el mismo e em/lo usando ti/os genricos&


ist F%tri!,< lista G new Arra5 istF%tri!,<147 for 1int co!t G C7 co!t F BCC7 co!tOO4 lista.add16'ello647 %5stem.out.pri!tl!1lista47

Obsrvese 4ue el ti/o de la variable suele definirse usando la interfaz3 inde/endizando de esta manera el cdigo de la im/lementacin /articular 4ue se eli a&

%igura 9@&F Diagrama con los /rinci/ales contenedores derivados de Collectio!&

@&:&: .l (num#et
Ta se coment3 cuando se *abl de ti/os enumerados3 4ue un enumerado es un con unto de ob etos finito # conocido #3 como tal3 /uede agru/arse en una Collectio!& Sin embargo3 dado 4ue el con unto de ob etos generado en un enumerado est) mu# controlado3 se *a creado un contenedor o/timizado /ara ellos& Dic*o contenedor es el E!um%et& .l E!um%et es una im/lementacin es/ecial de la interfaz %et& Todos los elementos contenidos en un E!um%et deben /ertenecer al mismo ti/o de enumerado3 indicando dic*o ti/o en la construccin del E!um%et& .sta im/lementacin es e0tremadamente com/acta # eficiente3 siendo el reem/lazo del tradicional arra# de bits 4ue se sol5a utilizar antes& 'eamos un e em/lo de uso del E!um%et.

F ;; F

Disear # Programar todo es em/ezar


))Creamos u! co!(u!to vacio de Dias%ema!a E!um%etFDias%ema!a< diasAacio G E!um%et.!o!ea"1Dias%ema!a.class47 ))ATadimos el miercoles diasAacio.add1Dias%ema!a.MIERCa E%47 ))Creamos u! co!(u!to co! todos los d>as de la sema!a E!um%etFDias%ema!a< dias%ema!a G E!um%et.alla"1Dias%ema!a.class47 ))Recorremos el E!um%et co! u! bucle "or=each for 1Dias%ema!a dia 9 dias%ema!a4 / %5stem.out.pri!tl!1dia.to%tri!,1447 8

@&<& )ap
"os contenedores de la clase Map se caracterizan /or constituir gru/os de /ares de ob etos claveFvalor3 de forma 4ue todo valor tiene asociado al menos una clave& Por e em/lo3 un vector /uede verse como un Map en los 4ue la clave es un entero 7el 5ndice8 # los valores cual4uier ti/o de ob etos& "os Map generalizan este conce/to /ermitiendo 4ue tambin el ti/o del 5ndice /ueda ser cual4uier clase de ob etos& Por e em/lo3 /ara construir un directorio telefnico3 se /odr5a utilizar un Map 4ue use /ara la clave el nombre # /ara el valor un entero con el nHmero telefnico&
)ap&F "os ob etos 4ue cum/len la interfaz Map tiene los siguiente mtodos: si&e143 isEmpt5143 co!tai!sfe51ob(ecto43 co!tai!sAalue1ob(eto43 ,et1ob(eto43 put7ob(eto3ob(eto83 remove1ob(eto43 clear14& #orted)ap&F +nterfaz derivada de Map 4ue obliga a 4ue los elementos 4ue lo constitu#en cum/lan la interfaz Comparable& $ree)ap&F (lase 4ue im/lementa %ortedMap con un Tree%et /ara los 5ndices& %ash)ap&F (lase 4ue im/lementa %ortedMap con 'ash%et /ara los 5ndices&

(omo #a *emos dic*o se debe cuidar 4ue los elementos almacenados en los Tree%et no cambien su criterio de com/aracin3 #a 4ue en ese caso el contenedor no garantiza su com/ortamiento& .videntemente esto se e0tiende a los 5ndices de un TreeMap& (uando forzosamente se deban utilizar como 5ndices ob etos mutables 4ue cambien su relacin de orden3 se deber) usar 'ashMap3 en otro caso se /uede /referir TreeMap /or el orden 4ue se obtiene al recorrerlos&

%igura 9;&F Diagrama con varios contenedores derivados de Map&

. em/lo de uso de %ash)ap .l siguiente e em/lo ilustra el uso de la clase 'ashMap /ara almacenar ob etos de la clase %tri!,3 utilizando a su vez como 5ndice un %tri!,&

F ;DF

(a/5tulo @

.structuras de datos /redefinidas en $ava

Map m G new 'ashMap147 m.put16+edro cutierre&6E6MB LHL BH BH647 m.put16-ua! co!&ale&6E6MB LKL LK BH647

@&=& +teradores
"os iteradores constitu#en el mecanismo /ro/orcionado /or la biblioteca de $ava /ara recorrer secuencialmente los elementos de cual4uier contenedor& "os iteradores tienen los siguientes mtodos: has`ext143 !ext143 # remove14& .l siguiente e em/lo ilustra el uso de un iterador /ara recorrer una lista de ob etos de la clase Coche3 a/licando luego un mtodo sobre ellos:
Iterator FCoche< e G mi#lista#coches.iterator147 while 1e.has`ext144 / Coche c G e.!ext147 c.acelerar147 8

A /artir de la versin 9 de $ava3 la estructura de control "or /ermite el uso de ob etos 4ue cum/lan la interfaz iterator /ara construir bucles de una manera sim/lificada 7es lo 4ue se denomina un blo4ue "or=each8&
"or 1Fparametro<9Fexpresio!<4 @mbito Y se!te!cia

.n esta estructura el identificador expresio! corres/onde a un arra# o un ob eto iterable3 mientras 4ue el identificador parametro corres/onde a una referencia de ti/o com/atible con los elementos 4ue com/onen el arra# o el ob eto iterable& .l siguiente fragmento de cdigo suma todos los elementos de un arra# de enteros&
int 23 arra5#e!teros G new int 2KC37 int suma G C7 for 1int v9arra5#e!teros4 / suma OG v7 8

.ste otro fragmento de cdigo suma el tamao de las cadenas contenidas en un vector&
Aector F%tri!,< vector#cade!as G new Aector F%tri!,<147 vector#cade!as.add16-ose647 vector#cade!as.add16A!dres647 int suma G C7 for 1%tri!, str9vector#cade!as4 / suma OG str.si&e147 8

.n el uso de iteradores sobre Collectio!s debe tenerse /recaucin si la estructura de datos cambia mientras 4ue se recorre& .n /articular3 Arra5 ist # Aector /or su diseo3 son m)s susce/tibles de 4ue se /roduzcan errores si su estructura cambia mientras se recorren con un iterador&

@&>& "a clase Collections


Para facilitar el uso de las colecciones se aadi a $ava la clase Collectio!s& .sta clase est) formada e0clusivamente /or mtodos est)ticos 4ue devuelven u o/eran sobre colecciones& .n algunas ocasiones es interesante dis/oner de colecciones de solo lectura& Por e em/lo3 si un mtodo devuelve un Arra5 ist3 /uede interesar 4ue el rece/tor de dic*a coleccin no /uede modificarla& Para /osibilitar este com/ortamiento3 la clase Collectio!s dis/one de mtodos 4ue /ermiten envolver cual4uier coleccin # devolver una versin de solo lectura3 tal 4ue si se intenta aadir un ob eto a cual4uiera de ellos se /roduce una ^!supportedaperatio!Exceptio!& .stas colecciones de solo lectura tambin se dice 4ue son inmutables& Una /ro/iedad interesante de tales clases es 4ue3 al ser im/osible su modificacin es /osible su uso simult)neo desde varios *ilos sin riesgo de condiciones de carrera&

F DC F

Disear # Programar todo es em/ezar Adem)s3 la clase Collectio!s /osee mtodos est)ticos /arametrizados mu# Htiles /ara sim/lificar la devolucin de colecciones vac5as& Dic*os mtodos son empt5 ist143 empt5%et14 # empt5Map14& "os ob etos devueltos son inmutables& "a clase Collectio!s tambin /osee mtodos /ara: encontrar los m)0imos # m5nimos de los elementos contenidos en una collectio!3 co/iar una lista en otra3 realizar bHs4uedas binarias sobre listas3 etc& (onocer los mtodos de utilidad 4ue ofrece esta clase /uede a*orrar muc*o traba o a la *ora de traba ar con colecciones # ma/as # es bueno tenerla en cuenta&

@&9& .l resto del /a4uete java*util


.l /a4uete (ava.util es un /e4ueo ca n de sastre 4ue contiene multitud de clases 4ue nos *acen m)s f)cil construir /rogramas en $ava& A /arte de los contenedores encontramos clases /ara el tratamiento de fec*as 7 Date3 Cale!dar83 /ara definir alarmas 7Timer3 TimerTas$83 /ara el tratamiento de cadenas de te0to 7 %ca!!er3 Formatter3 %tri!,To$e!i&er83 /ara la generacin de nHmeros aleatorios 7 Ra!dom83 /ara utilizar elementos relativos a la configuracin local del e4ui/o 7 ocale3 Timeeo!e3 Curre!c583 /ara facilitar la concurrencia 7%emaphores3 Arra5Bloc$i!,bueue3 %5!chro!ousbueue&&&8&

@&?& (onclusiones
Se /uede /ensar 4ue conocer un lengua e de /rogramacin consiste en conocer las /rimitivas del mismo # /oco m)s3 /ues la fle0ibilidad de los lengua es de /rogramacin /ermite 4ue el /rogramador desarrolle todo cuanto necesite /artiendo de cero& Adem)s3 como #a se di o en el /rimer ca/5tulo3 los desarrolladores suelen /referir usar sus /ro/ios desarrollos a los construidos /or terceros& .ste *ec*o se deriva de la /oca confianza 4ue e0iste en los desarrollos de otras /ersonas3 # tambin3 de los /roblemas de comunicacin relativos al tras/aso de software& Para ata ar la creciente com/le idad del software este *ec*o debe cambiar& (onocer las bibliotecas est)ndar de un lengua e resulta im/rescindible /ara obtener resultados garantizados& ,a# 4ue entender 4ue es me or no crear todo /artiendo de cero cada vez& "a asociacin # la *erencia deben ser los ve*5culos 4ue /ermitan es/ecializar las clases /ro/orcionadas /or estas bibliotecas3 ada/t)ndolas a los com/ortamientos /articulares 4ue un diseo /articular /recisa&

@&@& "ecturas recomendadas


1.l lengua e de /rogramacin $ava23 =V .dicin3 Arnold -osling3 Addison Gesle#3 <CC:& 1Piensa en $ava23 <V .dicin3 Aruce .cEel3 Addison Gesle#3 <CC<& 1+ntroduccin a la Programacin Orientada a Ob etos con $A'A23 (& T*omas Gu3 !c -raw ,ill3 <CC:&

@&;& . ercicios
. ercicio : Disear3 a/o#)ndose en la clase %et3 una clase Bombo oteria 4ue /ermita construir un /rograma /ara ugar al bingo&

F D:F

(a/5tulo ;

Patrones # /rinci/ios de diseo

Ta se *an revisado los /rinci/ales elementos 4ue /ermiten la Programacin Orientada a Ob etos& Sin embargo3 *a# 4ue sealar 4ue un buen diseo orientado a ob etos no slo consiste en utilizar los elementos 4ue se *an e0/licado sin orden ni concierto3 sino 4ue uega un /a/el fundamental la e0/eriencia del diseador& ,a# 4ue encontrar las abstracciones adecuadas3 construir interfaces eficaces # establecer las relaciones necesarias entre ellas& Adem)s3 todo ello debe *acerse de manera es/ec5fica /ara el /roblema 4ue se /retende resolver3 /ara 4ue la /rogramacin ofrezca la venta a de acercarse al dominio del /roblema& Por otro lado3 # tambin debe *acerse de manera genrica3 /ara 4ue sea f)cil incor/orar nuevos re4uisitos o resolver /roblemas distintos con los mismos ob etos& .n este tema se esboza el /rinci/io del camino 4ue un diseador de /rogramas orientados a ob etos debe recorrer& Para ello se introduce el conce/to de Patrn de Diseo # se /resentan unos cuantos de los m)s im/ortantes& Posteriormente se enuncian algunos /rinci/ios 4ue a#udan a crear un buen diseo&

;&:& Princi/ales Patrones de Diseo


.s un *ec*o 4ue3 en general3 los diseadores noveles no son ca/aces de *acer buenos diseos3 /ues no utilizan adecuadamente las *erramientas 4ue la Programacin Orientada a Ob etos /ro/orciona& !ientras3 los diseadores e0/erimentados se caracterizan /or conocer multitud de buenas soluciones a /roblemas 4ue #a *an tenido 4ue resolver3 # reutilizan estas soluciones ada/t)ndolas a los nuevos /roblemas 4ue abordan& "os Patrones de Diseo intentan ca/turar esa e0/eriencia en un con unto de diseos genricos 4ue sean a/licables a un sin fin de /roblemas& SegHn (*risto/*er Ale0ander3 destacado ar4uitecto del siglo aa3 1cada /atrn de diseo describe un /roblema 4ue ocurre una # otra vez en nuestro entorno3 as5 como la solucin a ese /roblema de tal modo 4ue se /ueda a/licar esta solucin una # otra vez3 sin re/etir cada vez lo mismo2& .sta descri/cin es v)lida tambin /ara los Patrones de Diseo de la Programacin Orientada a Ob etos& .n los siguientes /untos se analizan algunos de los Patrones de Diseo m)s utilizados&

;&:&: %)brica Abstracta 7 Abstract %actor # 8


Una de las o/eraciones m)s comunes al /rogramar con ob etos es3 lgicamente3 la creacin de los ob etos& Sin embargo3 esta o/eracin es en si misma un foco de aco/lamiento& (uando desde un fragmento de cdigo C invocamos la creacin de un ob eto de la clase A estamos aco/lando ese cdigo con el de la clase A& Si /osteriormente deseamos cambiar el ob eto de clase A /or otro de otra clase 4ue cum/la su misma interfaz no /odremos *acerlo sin cambiar el cdigo C& Para evitar este /roblema se suele delegar la creacin de los ob etos a otro ob eto 4ue se denomina f)brica 7 factor#8& De esta manera desde el cdigo C no creamos el ob eto A directamente3 sino 4ue se lo /edimos a la clase f)brica& .videntemente3 /ara evitar el aco/lamiento de la f)brica con el cdigo C3 la /ro/ia f)brica deber) obtenerse /or /ar)metros&

%igura 9D&F (ada /roducto concreto se crea desde un constructor es/ecifico&

F D= F

(a/5tulo ;

Patrones # /rinci/ios de diseo

Adem)s3 el /atrn %)brica /ermite ocultar los constructores de las clases 4ue crea3 de manera 4ue solo se /uedan crear los ob etos a travs de la f)brica3 im/idiendo de esta forma su creacin de una forma no /revista& A continuacin se /resenta un e em/lo en el 4ue el /atrn mtodo de fabricacin se utiliza /ara 4ue un sistema gr)fico /ueda crear diferentes ti/os de registros en una a/licacin de gestin de /iezas en un taller& .n este caso3 la se/aracin entre los ob etos f)brica # la a/licacin de gestin /ermite aadir nuevos ti/os de /iezas # 4ue la a/licacin no deba ser modificada&

%igura ?C&F .n este e em/lo se dis/one de un constructor 4ue /ermite crear cone0iones con las diferentes bases de datos de los fabricantes a un /rograma de facturacin de un taller&

%igura ?:&F Diagrama de secuencia 4ue muestra el uso de una f)brica /ara el mane o /olimrfico de diferentes ti/os de cone0iones&

.0isten otros Patrones de Diseo /ara la creacin de ob etos& .n /articular se /uede destacar al /atrn (onstr uctor 7Auilder 8 # al /atrn !todo de (onstr uccin 7%actor # !et*od 8& .l /atrn (onstructor es similar al /atrn %)brica Abstracta salvo en 4ue una %)brica suele crear colecciones de ob etos3 mientras 4ue un constructor solo crea un ti/o de ob etos& Por otro lado3 el /atrn !todo de (onstruccin se diferencia del /atrn %)brica en 4ue son los /ro/ios ob etos derivados los 4ue crean3 mediante un mtodo de construccin3 los ob etos concretos 4ue se necesitan en cada momento& Otra alternativa al uso del /atrn %abrica Abstracta consiste en el uso de in#ectores de de/endencias& Son ob etos 4ue se /rograman o se configuran /ara 4ue devuelvan familias concretas de /roductos cuando cual4uier clase de la a/licacin le

F D> F

Disear # Programar todo es em/ezar solicita cierto ti/o de /roducto& .stas tcnicas se a/o#an en las caracter5sticas de intros/eccin de $ava # /ueden ser com/lementarias al uso de %)bricas Abstractas&

;&:&< Ada/tador o .nvoltorio 7 Ada/ter o Gra//er 8


.l /atrn .nvoltorio se utiliza cuando se desea 4ue una clase utilice otra aun4ue sta no cum/le cierta interfaz obligatoria& Por e em/lo3 en el diagrama ad unto la clase Clie!te solo /uede utilizar ob etos 4ue cum/lan la interfaz I!ter"a&Ami,a3 /ero se desea utilizar sobre la clase ExtraTa& Para ello3 se crea la clase Adaptador3 4ue contiene un ob eto de la clase ExtraTa /ero 4ue im/lementa la interfaz Ami,a& De esta forma3 la clase ^suaria utiliza3 indirectamente3 la clase ExtraTa&

%igura ?<&F .l cliente accede a la clase e0traa utilizando una interfaz 4ue conoce # 4ue envuelve a la clase e0traa&

.ste /atrn se utiliza cuando deseamos almacenar un ti/o /rimitivo de $ava en un derivado de Collectio!& Por e em/lo3 su/ongamos 4ue deseamos almacenar un i!t en un Aector& (omo los enteros no son elementos de la clase ab(ect es necesario envolverlos en otra clase 4ue contenga el entero # 4ue3 al derivar de ab(ect3 s5 /ueda ser insertada en el vector& Por eso3 # /or otras razones3 en $ava e0isten clases como I!te,er3 Float3 Boolea! o Character 4ue son envoltorios de los ti/os /rimitivos&

%igura ?=&F .n este caso el ada/tador es I!te,er # ada/ta al ti/o /rimitivo i!t /ara 4ue /ueda ser usado como un ab(ect&

;&:&= Decorador 7 Decorator 8


.l /atrn Decorador /ermite aadir nueva funcionalidad a una familia de com/onentes manteniendo la interfaz del com/onente& .l siguiente diagrama ilustra este /atrn& "a clase Compo!e!te es abstracta3 la clase Compo!e!teCo!creto im/lementa un com/ortamiento determinado& "a clase Decorador contiene un Compo!e!te en su interior& (uando se solicita una o/eracin al ob eto de la clase Decorador esta la deriva al Compo!e!te 4ue contiene& "as clases derivadas de Decorador son los verdaderos Decoradores 4ue im/lementan una nueva funcionalidad aadida al Compo!e!te 4ue contienen&

F D9F

(a/5tulo ;

Patrones # /rinci/ios de diseo

Componente + operacion() 1

ComponenteConcreto + operacion()

Decorador + operacion()

DecoradorADeComponenteConcreto + operacion()

DecoradorBDeComponenteConcreto + operacion()

%igura ?>&F .l decorador A aade cierta funcionalidad a cual4uier com/onente manteniendo la interfaz de tal com/onente&

Por e em/lo3 el /atrn Decorador se /uede utilizar3 /ara aadir cifrado o com/resin a las clases de escritura en Streams& As53 la clase de la 4ue derivan todas ser5a ]riter& Un ]riter concreto3 /or e em/lo3 es el File]riter& "a misin de ]riterDecorator es la de redirigir las llamadas a los diferentes mtodos de la interfaz ]riter *acia el ]riter concreto 4ue contiene 7File]riter3 +ri!ter]riter&&&8& %inalmente3 las clases E!cript]riter # eip]riter im/lementan cierta o/eracin sobre el flu o de salida 4ue se dirige *acia el ]riter concreto contenido en el Decorador&

%igura ?9&F Decorador /ara aadir un buffer # com/resin a un ]riter&

.l siguiente Diagrama de Actividad muestra el com/ortamiento es/erado /ara este /atrn&

%igura ??&F "a escritura /asa /rimero /or el decorador 7el eip]riter83 el cual decide cu)ndo enviarla al elemento decorado 7el File]riter en este caso8&

F D? F

Disear # Programar todo es em/ezar

;&:&> (om/osicin 7 (om/osite 8


.s mu# comHn la necesidad de crear grafos dirigidos en los 4ue cada nodo /uede re/resentar ciertos elementos de un modelo inform)tico& .stos grafos suelen crearse utilizando el /atrn (om/osicin& .ste /atrn se /uede definir como erar4u5as de ob etos 4ue com/arten una interfaz # tales 4ue algunos de los ob etos /ueden formar /arte de otros& "a siguiente figura describe este /atrn& Obsrvese 4ue tanto los ob etos de la clase Eleme!to como los de Compuesto cum/len la interfaz Compo!e!te3 /ero los de clase Compuesto adem)s /uede contener dentro otros ob etos de la clase Compo!e!te&

%igura ?@&F "a clase com/onente /ro/orciona la interfaz comHn& "as clases derivadas /ueden ser de dos ti/os: com/uestos 74ue a su vez agru/an a otros com/onentes8 o sim/les *o as&

Por e em/lo3 en una erar4u5a de com/onentes de dibu o /uede ser im/ortante 4ue todos los elementos 4ue se /uedan dibu ar com/artan cierta interfaz3 /ero adem)s tambin es im/ortante 4ue unos elementos /uedan formar /arte de otros 7los ob etos l5nea forman /arte del ob eto cuadrado8&

;&:&9 +terador 7 +terator 8


,abitualmente3 cuando se dis/one de una coleccin de ob etos se desea recorrerlos& .l /atrn +terador /ermite definir ob etos /ara realizar esta tarea& Un ob eto iterador es una es/ecie de a/untador 4ue se /uede iniciar a/untando al /rimer elemento de una coleccin # 4ue /uede des/lazarse *asta el Hltimo elemento de la misma&

$ava dis/one de la interfaz Iterator3 la cual est) im/lementado /or las diferentes clases de Collectio!& .n realidad3 estas clases son f)bricas de iteradores 4ue /ermiten recorrerlas&

%igura ?;&F .l iterador concreto /ermite recorrer el contenedor concreto&

F D@F

(a/5tulo ;

Patrones # /rinci/ios de diseo

;&:&? .strategia 7 Strateg # 8


.n cual4uier /rograma es *abitual dis/oner de un con unto de algoritmos 4ue com/arten alguna /ro/iedad3 como 4ue /ueden e ecutarse indistintamente sobre unos datos de entrada o 4ue sean de determinado ti/o& . em/los de tales familias ser5an las funciones matem)ticas 7seno3 coseno3 ra5z&&&8 o los filtros gr)ficos de un /rograma de dibu o& .l /atrn .strategia /ermite organizar dic*as familias de algoritmos3 de manera 4ue com/artan una interfaz /ara 4ue luego los clientes de dic*as clases /uedan utilizarlos indistintamente&

%igura ?D&F "os ob etos de la clase de conte0to 4ue acceden a la familia de algoritmos los *acen de forma abstracta3 sin im/ortarles el algoritmo es/ec5fico 4ue se est) utilizando&

Un e em/lo de uso del /atrn .strategia /uede ser la im/lementacin de los diferentes algoritmos de ordenacin de una lista de nHmeros 7ver %igura @C8& -racias al /atrn .strategia el usuario del conte0to /uede modificar su criterio de ordenacin de forma din)mica&

%igura @C&F Un usuario /uede utilizar cual4uiera de los algoritmos 4ue cum/lan la interfaz de ordenacin a travs del ob eto Co!texto&

;&:&@ (omando 7 (ommand 8


.ste /atrn enca/sula las o/eraciones 4ue realiza un ob eto de forma 4ue stas sean a su vez ob etos 4ue cum/len una misma interfaz& .sto /ermite realizar3 de manera sencilla3 tareas como: agru/ar o encolar o/eraciones3 des*acer o/eraciones # /arametrizar otros ob etos con dic*as o/eraciones de forma sencilla& Adem)s3 fomenta 4ue aadir nuevos comandos sea una tarea sim/le # aislada& .l Diagrama .st)tico de (lases ad unto describe su estructura est)tica # el Diagrama de Secuencia de la %igura @< e0/lica su com/ortamiento din)mico& .l /atrn (omando se /odr5a utilizar3 /or e em/lo3 /ara ordenar los comandos 4ue se /ueden e ecutar desde un intr/rete de consola 7ver %igura @=8& Si el inter/rete utiliza los comandos solo a travs de la interfaz comHn3 sin conocer en cada momento el comando concreto 4ue se est) e ecutando3 una de las venta as 4ue se obtienen consiste en 4ue el nHmero de comandos /uede crecer sin modificar dic*o inter/rete&

F D; F

Disear # Programar todo es em/ezar

%igura @:&F Diagrama de clases del /atrn (omando&

%igura @<&F .l cliente crea los comandos # los asocia al e ecutor& !)s tarde3 e ecuta el comando 4ue corres/onda& Dic*o comando3 4ue conoce al rece/tor de su orden3 e ecuta la accin asociada al rece/tor 4ue conoce &

%igura @=&F .l ob eto de clase +nter/rete slo necesita conocer la interfaz de la clase Coma!do%hell& .n este caso3 el sistema o/erativo ser5a el rece/tor # el inter/rete ser5a el e ecutor&

F DDF

(a/5tulo ;

Patrones # /rinci/ios de diseo

;&:&; Obser vador 7 Obser ver 8


.ste /atrn crea una relacin entre ob etos en la 4ue uno de ellos es observado /or el resto3 de manera 4ue cuando el ob eto observado cambia el resto /uede autom)ticamente realiza alguna accin& .n la %igura @> se /resenta el Diagrama .st)tico de (lases de este /atrn& Din)micamente3 cuando cambia el estado del ob eto Eleme!toabservadoCo!creto se e ecuta el mtodo avisar143 el cual llama al mtodo actuar14 de cada observador&

%igura @>&F .l .lemento observado avisa a los observadores cuando su estado cambia&

.l /atrn Observador lo utiliza $ava /ara im/lementar el cdigo 4ue se e ecuta cuando un ob eto de ti/o com/onente cambia de estado& $ava crea un ob eto de clase iste!er 7escuc*ador en vez de observador8 /ara cada o/eracin 4ue se realiza con un botn 7elemento observado en este caso8& .se ob eto iste!er contiene el cdigo 4ue se e ecuta al realizar la o/eracin sobre el botn& As53 cuando un usuario /ulsa un botn # el estado del com/onente botn cambia el iste!er 4ue lo observa es ca/az de e ecutar cierto cdigo&

;&<& Algunos /rinci/ios Htiles en POO


.n este a/artado se /resentan algunos /rinci/ios 4ue se deben seguir al realizar el diseo de un /rograma orientado a ob etos&

;&<&: .l /rinci/io abiertoFcerrado


Aertrand !e#er estableci el siguiente /rinci/io en :DD;:

Todas las entidades de software 7clases3 mdulos3 funciones&&&8 deben estar abiertas /ara e0tensiones # cerradas /ara modificaciones&
.ste /rinci/io intenta evitar 4ue un cambio en un /rograma /roduzca una cascada de cambios en mdulos de/endientes& "os /rogramas 4ue se *agan siguiendo este /rinci/io deber)n tener v5as /ara 4ue cuando los re4uisitos cambien /odamos e0tender el com/ortamiento aadiendo nuevo cdigo 7abierto a e0tensin83 /ero sin cambiar el cdigo 4ue #a funciona 7cerrado a modificacin8& "a me or forma de conseguir 4ue un cdigo siga este /rinci/io consiste en fomentar el uso de clases abstractas o interfaces en las relaciones entre ob etos&

%igura @9&F .n una relacin entre clases debe /referirse siem/re el es4uema 7b8 al 7a8&

(omo consecuencia del /rinci/io abiertoFcerrado a/arecen dos corolarios:

Todas las /ro/iedades deben ser /rivadas&F Si una /ro/iedad no es /rivada ningHn mdulo e0terno 4ue de/enda de esa variable /odr) estar cerrada a modificaciones cuando /or e em/lo se cambie el com/ortamiento de la /ro/iedad o se elimine& Adem)s cual4uier modulo e0terno 4ue utilice la variable de una forma no es/erada /or el resto de mdulos clientes de la variable *ar) 4ue stos fallen&

F :CC F

Disear # Programar todo es em/ezar

.vitar la identificacin din)mica 7uso del casting de referencias # de i!sta!ceo"8& Si un mdulo necesita identificar el ti/o de un ob eto en tiem/o de e ecucin /ara tomar una decisin3 este mdulo /odr5a no estar cerrado a modificaciones 4ue ocurrir5an cuando a/areciesen nuevas clases de ob etos&

;&<&< .l /rinci/io de "isEov


Aarbara "isEov estableci el siguiente /rinci/io:

Toda funcin 4ue utiliza referencias a un ob eto de una clase A debe ser ca/az de usar ob etos de clases derivadas de A sin saberlo&
.ste /rinci/io ofrece un camino /ara 4ue el cdigo sea m)s f)cil de e0tender3 #a 4ue fomenta la creacin de mtodos 4ue /ueden funcionar con clases 4ue aHn no *an sido creadas&

;&<&= .l /rinci/io de seg reg acin de interfaces


6obert (& !artin estableci el siguiente /rinci/io:

.s /referible varias interfaces es/ec5ficas 4ue una Hnica interfaz general&


Seguir este /rinci/io minimiza el im/acto del cambio de una interfaz3 #a 4ue no e0isten grandes interfaces de las 4ue de/enden multitud mdulos&

;&<&> !a0imizar el uso de clases inmutables


"as clases inmutables son a4uellas cu#os ob etos no cambian de estado una vez creados& Por e em/lo3 %tri!, es una clase inmutable& (on ob eto de forzar este com/ortamiento todas las /ro/iedades de la clase deben ser finales& "a inmutabilidad sim/lifica enormemente la im/lementacin de una clase& Adem)s *ace /osible el uso de un mismo ob eto desde diferentes t*reads simult)neamente sin usar mecanismos de e0clusin& .videntemente3 es im/osible 4ue ciertas clases3 las 4ue mantienen el estado de un /rograma3 sean inmutables&

;&<&9 Preferir com/osicin frente a *erencia


Ta se *a comentado 4ue la *erencia rom/e la enca/sulacin& Tal # como se *a com/robado con el /atrn Decorador3 siem/re es /osible obtener un com/ortamiento similar a la *erencia utilizando com/osicin& Para forzar esta /referencia es una buena /r)ctica siem/re definir las clases # los mtodos como finales3 evitando de esta forma 4ue se /ueda *eredar de ellos& Solo en los casos en los 4ue la *erencia se /lanifi4ue3 como en el /atrn .strategia3 se debe omitir el modificador "i!al&

;&<&? Princi/io de res/onsabilidad Hnica


Una clase debe tener una Hnica res/onsabilidad # dic*a res/onsabilidad debe estar com/letamente enca/sulada en dic*a clase& 6obert (& !artin define este /rinci/io como sigue:

Una clase debe tener un Hnico motivo /ara cambiar de estado&

;&<&@ .liminar du/licaciones


And# ,unt denomin a este /rinci/io D6T 7 Don`t re/eat #our self8& Siem/re 4ue e0iste una du/licacin se debe a 4ue no se *a abstra5do lo suficiente& Probablemente3 la du/licacin se /ueda eliminar con la introduccin de un nuevo mtodo o una nueva clase& "a ma#or5a de los /atrones 4ue *an a/arecido en los Hltimos :9 aos *an sido creados /ara eliminar las du/licaciones en el cdigo&

;&<&; Princi/io de inversin de de/endencia


"os mdulos de alto nivel no deben de/ender de los mdulos de ba o nivel& Ambos deben de/ender de abstracciones&

;&<&D Preferir el /olimorfismo a los blo4ues

ifI else

switchI case

Jormalmente3 el uso de uno de estos blo4ues indica 4ue la clase est) rom/iendo el /rinci/io de res/onsabilidad Hnica& Si en una clase tenemos un blo4ue i"Ielse3 esa clase unas veces tendr) una res/onsabilidad 7cuando entre /or la rama i"8 # otras veces tendr) otra diferente 7cuando entre /or la rama else8& Pr)cticamente la totalidad de los blo4ues i"Ielse # de los blo4ues s;itch)case /ueden reem/lazarse mediante /olimorfismo&

F :C:F

(a/5tulo ;

Patrones # /rinci/ios de diseo

;&<&:C (onclusiones
.l descubrimiento de estructuras comunes 7/atrones8 en diferentes ti/os de /rogramas3 /uede a#udar a identificar buenas estructuras 4ue se /ueden reutilizar en diferentes im/lementaciones& .s /or ello 4ue3 desde a4u53 se anima al lector a 4ue /rofundice en los conocimientos de Programacin Orientada a Ob etos 4ue acaba de ad4uirir mediante este camino&

;&=& "ecturas recomendadas


1Patrones de Diseo23 .ric* -amma # otros3 Addison Gesle#3 <CC<& .ste libro es la /rinci/al gu5a de referencia en cuanto a /atrones de diseo& 1Piensa en $ava& .cEel23 <V .dicin3 Addison Gesle#3 <CC<& Su ane0o ( contiene un gran com/endio de /rinci/ios # buenas /r)cticas& 1(lean (ode23 6obert (& !artin& 1Design Princi/les and Design Patterns23 6obert (& !artin3 www&ob ectmentor&com3 <CCC&

;&>& . ercicios
. ercicio :
6ealice el diseo de un /rograma 4ue im/lemente una ,o a de ()lculo& .l /rograma contendr) en cada momento un libro abierto el cual se com/ondr) de varias *o as& A su vez3 cada *o a contiene celdas en cada una de las cuales se /ueden dis/oner te0to o frmulas& .l te0to consistir) en un con unto de caracteres alfanumricos entre comas sim/les& "as frmulas se com/ondr)n de constantes numricas 7<3 =&:>&&&83 o/eradores sim/les 7OFUI8 # funciones /redefinidas 7cos3 sen3 tg &&&8& .l ane0o : describe la gram)tica 4ue deber)n seguir las frmulas& "as celdas se dis/onen en forma de ret5cula3 formada /or filas # columnas& (ada columna # cada fila estar) eti4uetada /or un nHmero consecutivo& Podr) *aber un nHmero indeterminado de filas # columnas3 aun4ue en /antalla slo se /odr)n ver simult)neamente un subcon unto del total& .n todo momento *abr) siem/re una *o a activa3 de manera 4ue las o/eraciones con las celdas se referir)n siem/re a una *o a concreta& "a interaccin con el /rograma3 4ue /odr) ser en modo te0to3 consistir) en la escritura de instrucciones mediante el teclado& As53 el sistema ofrecer) un /rom/t # el usuario /odr) escribir una instruccin3 la cual se e ecutar) tras /resionar la tecla 6eturn& .l ane0o < describe el uego de instrucciones 4ue deber) admitir el /rograma& %r mulas "as frmulas 4ue se re4uiere 4ue contengan las celdas son las generadas /or la siguiente gram)tica en notacin AJ%:
FFgRM^ A< 99G Fa+ERADaR<99G FF^`CIg`< 99G FREF< 99G FFgRM^ A< Fa+ERADaR< FFgRM^ A< Y FREA < Y FF^`CIg`<1FFaRM^ A<4 Y O Y = Y * Y ) se! Y cos Y t, FREF<

celda1F`hMERaE`hMERa<4

FREA < 99G F`hMERa<.F`hMERa< Y F`hMERa< F`hMERa< 99G FDicITa< 99G FDicITa< Y FDicITa< F`hMERa< C Y B Y H Y K Y L Y J Y D Y P Y N Y M

Donde: cos7Xfr mulaY8&F (alcula el coseno de una frmula& sen7Xfr mulaY8&F (alcula el seno de una frmula& tg7Xfr mulaY8&F (alcula la tangente de una frmula& celda7Xfila3columnaY8&F Devuelve el valor contenido en la celda & $ueg o de instr ucciones "as rdenes 4ue se desea 4ue tenga la *o a de c)lculo est) com/uesto /or las siguientes instrucciones:

F :C< F

Disear # Programar todo es em/ezar (rear"ibro&F .sta o/eracin elimina las *o as de c)lculo actualmente abiertas # crea = *o as vac5as eti4uetadas como *o a:3 *o a< # *o a=& Adem)s se /ondr) la *o a: como *o a activa& (rear,o a XnombreY&F (rea una *o a dentro el libro actual # la dis/one como *o a actual& "os nombres de las *o as no /odr)n contener es/acios3 adem)s no se /odr) crear una *o a si tiene el mismo nombre 4ue otra 4ue #a e0ista& Aor rar,o a XnombreY&F Aorra una *o a dentro el libro actual& Si era la *o a activa dis/one otra como activa& Si no 4uedan mas *o as autom)ticamente crea una nueva& 6enombrar Xnombre *o aYXnuevo nombreY&F .sta o/eracin renombra una *o a& "os nombres de las *o as no /odr)n contener es/acios3 adem)s no se /odr) crear una *o a si tiene el mismo nombre 4ue otra 4ue #a e0ista& ,o aActual XnombreY&F Permite seleccionar cual es la *o a actual& (elda7XfilaY3XcolumnaY8b\Xfor mulaY_X`te0to`Y]&F Permite asignar un valor nuevo a una celda& Si el valor es de ti/o alfanumrico deber) ir entre comillas sim/les3 en otro caso corres/onder) a una frmula 4ue seguir) la gram)tica del ane0o :& As53 /ara asignar un valor a una celda se utilizar) la siguiente notacin:
Celda1F"ila<EFcolum!a<4GStextoS Celda1F"ila<EFcolum!a<4G"rmula

Por e em/lo:
Celda1BEB4GSRadioS Celda1BEH4GHJ Celda1HEB4GS+er>metroS Celda1HEH4GCelda1BEH4*K.BL*H7

!ostrar7XfilaY3 XcolumnaY8&F !uestra /or /antalla el contenido de las celdas corres/ondientes a @ columnas # :C filas a /artir de la casilla indicada /or el /ar 7XfilaY3 XcolumnaY8& (ada columna # cada fila estar) encabezada /or un nHmero consecutivo 4ue la identifica& Adem)s3 todo el te0to estar) encabezado /or el nombre de la *o a& Se utilizar) e0actamente D caracteres /ara /resentar el contenido de cada celda # un es/acio como se/aracin con la celda siguiente& (on el fin de 4ue a/arezca ordenado el contenido de cada celda se com/letar) con es/acios cuando el tamao sea menor # se recortar) el contenido /or la derec*a cuando el tamao sea ma#or& Si una celda contiene te0to alfanumrico se /resenta tal te0to en el lugar asignado& Si una celda contiene una frmula se /resentar)3 en el lugar asignado3 el resultado de la a/licacin de la frmula en ese momento # no el te0to de la frmula& Por e em/lo3 Mostrar1CEC4 muestra desde la celda 7C3C8 *asta la celda 7?3D8 /resentar5a:
'o(a9 'o(aB C B H K ... CY BY Radio +er>metro HY HJ BJP KY LY ...

Deber) detectarse la a/aricin de referencias circulares3 /or e em/lo almacenando si una celda #a *a sido calculada3 /ara im/edir 4ue vuelva a intentarse su c)lculo& Se devolver) el te0to ERRaR si una frmula resulta en un error3 /or e em/lo si se detecta referencia circular al calcular el valor de una celda& (arg ar&FXcr uta nombre de fic*erocY&F Permite cargar un libro de disco& Salvar Xcr uta # nombre de fic*erocY&F Permite guardar un libro con todas sus *o as # el contenido de sus celdas a disco&

F :C=F

Ane0o A

Solucin de los e ercicios

A&: . ercicios del ca/5tulo :


A&:&: Solucin del e ercicio :
.n este caso se /ro/one una solucin 4ue utiliza seis clases: tar eta3 cuenta3 cliente3 lector de tar etas3 ca ero # o/eracin& "as siguientes l5neas describen a grandes rasgos las res/onsabilidades de tales ob etos:
Tar(eta&F Abstraccin 4ue se encarga de gestionar los datos relativos a la tar eta f5sica& ectorTar(etas&F Abstraccin 4ue se encarga de construir ob etos tar eta a /artir de las tar etas reales& .nca/sula el mane o del *ardware es/ec5fico de lectura # escritura de tar etas& Ca(ero&F Abstraccin 4ue se encarga de coordinar la realizacin de las o/eraciones: verificar introduccin de

tar eta3 solicitud # com/robacin del nHmero clave3 seleccin de la o/eracin # devolucin o retencin de la tar eta&
Cue!ta&F Abstraccin 4ue contiene la informacin relativa a la cuenta de un cliente # 4ue se encarga de autorizar o

denegar las o/eraciones solicitadas& .sta abstraccin enca/sula el acceso a la base de datos del banco 4ue contiene los datos del cliente&
Clie!te&F Abstraccin 4ue mantiene los datos /ersonales del cliente& aperaci!&F Abstraccin 4ue realiza las o/eraciones 4ue se solicitan&

A continuacin se /resentan varios Diagramas .st)ticos de (lases de U!"& .stos diagramas utilizan los elementos 4ue #a se *an /resentado& .s im/ortante notar 4ue no suele ser conveniente re/resentar todas las clases en un mismo diagrama3 debido a 4ue los diagramas deben ser sim/les /ara 4ue realmente sean utilizables al describir un /roblema& .s /referible tener varios diagramas /e4ueos3 cada uno centr)ndose en una /ers/ectiva concreta del diseo3 4ue un Hnico diagrama com/le o& .l /rimer diagrama muestra la cone0in entre las /rinci/ales clases involucradas en el /roceso&
Lector&arjetas Cliente -DatosPersonales +=btenerTar?eta01 +8ctualiDarTar?eta01 +Ex$ulsarTar?eta01 +TieneTar?eta01 +6etenerTar?eta01 * * Cuenta -4um/ecreto : int -4umTar?eta -/al%o -4umCuenta -@aximo +Com$robar4um/ecreto01 +6estarCanti%a%01 +/umarCanti%a%01 1 1 * &arjeta -Fec'aCa%uci%a% -4umTar?eta -4um>ntentos +=btenerCuenta01 1 Cajero -Conexion8cti!a +PantallaPresentacion01 +/uministrarDinero01 +6eco3erPaEuete01 +Ele3ir=$eracion01

.n el segundo diagrama se /resenta una vista m)s /arcial3 en la 4ue se /rofundiza en las o/eraciones 4ue se /ueden realizar con una tar eta&

F :C9 F

Ane0o F Solucin de los e ercicios

&arjeta -Fec'aCa%uci%a% -4umTar?eta -4um>ntentos +=btenerCuenta01 1

Cajero -Conexion8cti!a +PantallaPresentacion01 +/uministrarDinero01 +6eco3erPaEuete01 +Ele3ir=$eracion01 1

* "peracion -Fec'aHora +6ealiDar=$eracion01 *

.n este /unto se decide introducir en el ob eto aperaci! las o/eraciones 4ue se /ueden realizar: reintegro e ingreso& Al *acerlo resulta 4ue la clase o/eracin se /odr5a com/licar e0cesivamente& Adem)s3 si se 4uisiera am/liar el nHmero de o/eraciones 4ue se /ueden realizar deber5a cambiarse la clase o/eracin /ara aadirle nuevos mtodos& Por ello se o/ta /or usar *erencia de la clase aperaci! /ara im/lementar cada una de las o/eraciones& .sto da lugar al diagrama de la figura siguiente& .n l se a/recia 4ue cada clase derivada de aperaci! deber) im/lementar el mtodo reali&araperacio!14 de manera conveniente&
"peracion -Fec'aHora +6ealiDar=$eracion01

"peracionIngreso +6ealiDar=$eracion01

"peracionReintegro +6ealiDar=$eracion01

.s im/ortante notar 4ue la descom/osicin en ob etos 4ue se realiza de/ende del analista& Diferentes analistas /ueden tener visiones diferentes del /roblema # ser todas correctas&

A&< . ercicios del ca/5tulo <


A&<&: Solucin del e ercicio :
Una /ro/iedad de clase es a4uella 4ue se declara usando static # 4ue /or ello com/arte el mismo valor /ara todos los ob etos de la misma clase& "a /ro/iedad de instancia tiene un valor individual /ara cada ob eto de una clase&

A&<&< Solucin del e ercicio <


.n $ava e0iste un /roceso3 llamado 1recolector de basura23 4ue se encarga de realizar esta tarea de manera autom)tica&

A&<&= Solucin del e ercicio =


.n la l5nea @ se utiliza b cuando deber5a usarse b b& .n la l5nea ; se accede al mtodo value de auxH cuando esa referencia no a/unta a ningHn ob eto& .n la l5nea :C se realiza una o/eracin 4ue nunca se efectuar) /or4ue est) detr)s de retur!&

A&= . ercicios del ca/5tulo =


A&=&: Solucin del e ercicio :
S53 /or4ue al interfaz de una clase debe mantener su visibilidad a travs de la *erencia /ara 4ue el /olimorfismo sea /osible& F :C? F

Disear # Programar todo es em/ezar

A&=&< Solucin del e ercicio <


A)sicamente3 tal clase tiene la misma utilidad 4ue una interfaz& .stas clases3 4ue suelen llamarse abstractas /uras3 suelen usarse como clase base de una erar4u5a de ob etos /ara la 4ue se desea 4ue com/arta la interfaz definida /or la clase&

A&=&= Solucin del e ercicio =


interface Eleme!toarde!able / public boolean ma5orbue1Eleme!toarde!able e47 8 class ArbolBi!ario / private Eleme!toarde!able e#rai&7 private ArbolBi!ario arbol#derecha7 private ArbolBi!ario arbol#i&.uierda7 public ArbolBi!ario i&.uierda14 / return arbol#i&.uierda7 8 public ArbolBi!ario derecha14 / return arbol#derecha7 8 public Eleme!toarde!able obte!erElemetoRai&14 / return e#rai&7 8 public void I!sertar 1Eleme!toarde!able e4 / if 1e#rai& GG null4 e#rai& G e7 else / if 1e.Ma5orbue1e#rai&44 / if 1arbol#derecha GG null4 arbol#derecha G new ArbolBi!ario147 arbol#derecha.I!sertar1e47 8 else / if 1arbol#i&.uierda GG null4 arbol#i&.uierda G new ArbolBi!ario147 arbol#i&.uierda.I!sertar1e47 8 8 8

class E!teroarde!able implements Eleme!toarde!able / public int eleme!to7 public E!teroarde!able1int e4 / eleme!to G e7 8 public boolean ma5orbue1Eleme!toarde!able e4 / E!teroarde!able aux G 1E!teroarde!able4 e7 return 1eleme!to < aux.eleme!to47 8

class %tri!,arde!able implements Eleme!toarde!able / public %tri!, eleme!to7 public %tri!,arde!able1%tri!, e4 / eleme!to G e7 8 public boolean ma5orbue1Eleme!toarde!able e4 / %tri!,arde!able aux G 1%tri!,arde!able4 e7 return 1eleme!to.le!,th14 < aux.eleme!to.le!,th1447 8 8 class %olucio!B / public void mai!1%tri!, ar,s234 / E!teroarde!able a G new E!teroarde!able1K47 E!teroarde!able b G !e; E!teroarde!able1J47 E!teroarde!able c G new E!teroarde!able1BB47 E!teroarde!able d G new E!teroarde!able1P47 E!teroarde!able e G new E!teroarde!able1BK47 ArbolBi!ario arbol G new ArbolBi!ario147 arbol.I!sertar1a47 arbol.I!sertar1b47 arbol.I!sertar1c47 arbol.I!sertar1d47 arbol.I!sertar1e47

F :C@ F

Ane0o F Solucin de los e ercicios

A&> . ercicios del ca/5tulo >


A&>&: Solucin del e ercicio :
a8 "a lista se im/lementa utilizando nodos doblemente enlazados /or razones de eficiencia3 aun4ue /odr5a *aberse im/lementado con nodos con un enlace sim/le&
class ista /

class `odo/ ab(ect valor7 `odo si,uie!te7 `odo a!terior7 8 private `odo primero7 private `odo ultimo7 private int !um#!odos G C7 public void push#bac$1ab(ect o4 / `odo !uevo G new `odo147 !uevo.valor G o7 !uevo.a!terior G ultimo7 if 1ultimo UG null4 ultimo.si,uie!te G !uevo7 else primero G !uevo7 ultimo G !uevo7 !um#!odosOO7 8 public void push#"ro!t1ab(ect o4 / `odo !uevo G new `odo147 !uevo.valor G o7 !uevo.si,uie!te G primero7 if 1primero UG null4 primero.a!terior G !uevo7 else ultimo G !uevo7 primero G !uevo7 !um#!odosOO7 8 public void pop#bac$14/ if 1ultimo UG null4/ ultimo G ultimo.a!terior7 !um#!odos==7 8 8 public void pop#"ro!t14/ if 1primero UG null4/ primero G primero.si,uie!te7 !um#!odos==7 8 8 public ab(ect "ro!t14/ if 1primero UG null4 return primero.valor7 8 public ab(ect bac$14/ if 1ultimo UG null4 return ultimo.valor7 8 public int si&e14/ return !um#!odos7 8 public void clear14/ primero G null7 ultimo G null7 !um#!odos G C7 8

b8 Al *eredar slo *abr5a 4ue aadir los cuatro mtodos relacionados con los ti/os de los valores contenidos& .l resto se *ereda&
class istaE!terosB extends ista /

public void push#bac$#i!t 1I!te,er i4 / super.push#bac$1i47

F :C; F

Disear # Programar todo es em/ezar


8 public void push#"ro!t#i!t 1I!te,er i4 / super.push#"ro!t1i47 8 public I!te,er "ro!t#i!t 14 / return 1I!te,er4 super*front147 8 public I!te,er bac$#i!t14 / return 1I!te,er4 super*back147 8

c8 Usando com/osicin se declara una clase 4ue contiene una lista # se definen mtodos similares a los de la "ista& .stos mtodos ser)n idnticos e0ce/tuando a los relacionados con los ti/os de los valores contenidos 4ue estar)n es/ecializados en I!te,er&
class istaE!terosH / private ista lista G new ista147

public void pushBac$1I!te,er i4 / lista.push#bac$1i47 8 public void pushFro!t1I!te,er i4 / lista.push#"ro!t1i47 8 public I!te,er "ro!t14 / return 1I!te,er4 lista."ro!t147 8 public I!te,er bac$14 / return 1I!te,er4 lista.bac$147 8 public void popBBac$14/ lista.pop#bac$147 8 public void popFro!t14/ lista.pop#"ro!t147 8 public void clear14/ lista.clear147 8 public int si&e14/ return lista.si&e147 8

d8 .l ob etivo es crear una lista en la 4ue slo se /uedan introducir # e0traer ob etos de la clase I!te,er& .n istaE!terosB se *eredan todos los mtodos # en es/ecial a4uellos 4ue /ermiten insertar ob etos derivados de ab(ect 7es decir cual4uier ti/o de ob eto8& Sin embargo istaE!terosH /ermite es/ecificar una interfaz 4ue slo de a tratar I!te,er& Por eso en este caso es me or usar com/osicin #3 /or tanto3 es me or el enfo4ue de istaE!terosH& Se debe usar la clase I!te,er /or4ue i!t es un ti/o /rimitivo 7no es una clase8 # eso im/lica 4ue un valor i!t no se /uede utilizar desde una referencia a ob etos de clase ab(ect&

A&9 . ercicios del ca/5tulo 9


A&9&: Solucin del e ercicio :
"os Diagramas de Actividad son diagramas de estados 4ue /ermiten re/resentar las relaciones entre clases # 4ue son es/ecialmente Htiles cuando e0iste *erencia entre las clases 4ue se relacionan& !ientras3 los Diagramas de Secuencia son Diagramas de +nteraccin # /ermiten re/resentar claramente las situaciones en las 4ue se relacionan muc*os ob etos de diferentes clases& As53 aun4ue ambos diagramas se utilizan /ara re/resentar el com/ortamiento din)mico de los ob etos de una o m)s clases3 no /odemos decir 4ue sean e4uivalentes sino com/lementarios&

A&9&< Solucin del e ercicio <


A continuacin se /ro/one una solucin al /roblema3 aun4ue *a# 4ue decir 4ue e0isten otras muc*as diferentes igualmente v)lidas&

F :CD F

Ane0o F Solucin de los e ercicios a8 Se /ro/onen las siguientes clases:


TipoBillete&F .ncargada de contener # gestionar la informacin de los diferentes ti/os de billetes 4ue mane a en un

momento dado el e0/endedor&


istaTipoBilletes&F .ncargada de contener la lista de ti/os de billetes 4ue /uede dar en un momento dado el

e0/endedor&
Expe!dedor&F (lase en la 4ue se encuentra el mtodo de arran4ue 7 mai!8 # 4ue se encarga de /ermitir alternar entre los

diferentes modos o/erativos&


ModoMa!te!imie!to&F (lase 4ue gestiona el modo de o/eracin de mantenimiento 7/antallas # secuencia de o/eraciones8& ModoAe!ta&F (lase 4ue gestiona el modo de o/eracin de venta 7/antallas # secuencia de o/eraciones8& Modoaperativo&F (lase abstracta de la 4ue *eredan la clase ModoMa!te!imie!to # la clase ModoAe!ta& .sta clase

facilita la futura introduccin del software corres/ondiente a nuevos modos 4ue /uedan a/arecer gracias a 4ue dota a todos los modos de una interfaz comHn& b8 "os siguientes diagramas ilustran diferentes /ers/ectivas est)ticas de las clases e0/uestas en el a/artado anterior&
TipoBillete Nombre Precio TipoBillete TipoPapel Pintar() Precio() 1..*

ListaTi poBilletes Agregar() 1 Elimi nar() PintarBilletes()

Expendedor mai n() MenuSeleccionModo()

ModoVenta Panta ll aSeleccionBi ll ete() Calcu larVuel ta ()

1 ModoMantenimiento PantallaGestionBillete()

ModoOperativo Operar() PresentarModo()

ListaTipoBilletes Agrega r() Eli mi nar() PintarBil letes()

1..* TipoBil lete ModoMantenimiento PantallaGestionBillete() Nombre Precio TipoBillete TipoPapel Pintar() Precio()

F ::C F

Disear # Programar todo es em/ezar

ListaTipoBilletes Agregar() Eliminar() PintarBilletes()

ModoOperativo Operar() PresentarModo()

1..* TipoBillete Nombre Precio TipoBillete TipoPapel Pin tar() Precio() ModoVenta PantallaSeleccionBillete() CalcularVuelta() Monedero DevuelveCantidadIntroducida() Suministrar() PuedeSu minis trar() CantidadIntroducida()

1 Impresora Im primirYExpulsar() TieneTin ta() TienePapel()

Mo doOperati vo Operar() PresentarModo()

ModoMantenimiento PantallaGestionBillete()

ModoVenta PantallaSeleccionBillete() CalcularVuelta()

F ::: F

Ane0o F Solucin de los e ercicios c8 .l Diagrama de Secuencia /ara una o/eracin v)lida con devolucin de cambio resulta:

: Expendedor

v enta : Modo Venta

entrada : Reader

lista : ListaTipo Billetes

billetes : Tipo Bille te

billete_elegido : TipoBillete

monedero : Monedero

impresora : Impresora

PresentarModo( ) PantallaSeleccionBillete( )

PintarBilletes( ) Pintar( )

read(char) tipo_billete

TienePapel( ) si TieneTinta( ) si Precio( )

read(char) ENTER

CantidadInt roduc ida( ) CalcularVuelta( ) PuedeSum inistrar( ) si Suminis trar( )

ImprimirY Expulsar( )

A&9&= Solucin del e ercicio =


Primeramente se /ro/one el Diagrama .st)tico de (lases de la figura siguiente& .n este diagrama se a/recia la clase Tablero 7res/onsable de contener las fic*as # verificar la legalidad de los movimiento83 la clase Casilla 7res/onsable de contener una o ninguna fic*a # com/robar su ad#acencia a otras casillas83 la clase Ficha 7res/onsable de conocer a 4ue ugador /ertenece8 # la clase -u,ador 7res/onsable de interactuar con la /ersona 4ue uega8& Tambin a/arece la clase TresE!Ra5a3 en la 4ue residir) la funcin est)tica mai!14 4ue iniciar) el /rograma& Por Hltimo a/arece una clase 4ue /uede sor/render: la clase Tur!o& .sta clase se usar) /ara controlar la alternancia entre los ugadores& .s interesante esta clase3 /or4ue las anteriores son mu# evidentes3 siendo meras re/resentadoras de la situacin est)tica del uego& Por el contrario3 la clase Tur!o es una clase 4ue im/lica cierto dinamismo al involucrar el algoritmo de alternancia&

F ::< F

Disear # Programar todo es em/ezar

Tablero TresEn6a&a Pre3untaCasilla01 Tablero01 u3arParti%a01 PonerFic'as01 @o!erFic'as01 HaCana%o01 Casilla Esta"acia01 PonerFic'a01 =btenerFic'a01 8%&acente01 Casilla01

1 -m2Tablero

G -m2Casilla

*))1 -m2Fic'a Fic'a Ti$oFic'a01 Fic'a01 -m2Fic'a I

-m2Turno 1 Turno

1 -m2Turno

Hui enToca01 / i3uiente01 T urno01 u3 a%or + -m2 u3a%or =bt enerFic'a01 u3a%or01

A continuacin se /resentan diferentes Diagramas de +nteraccin 4ue ilustran cmo se relacionan las clases /ro/uestas /ara conseguir el desarrollo del /rograma& (omo consecuencia del an)lisis realizado /ara construir estos diagramas3 /ueden a/arecer nuevas clases 4ue deben incor/orarse al Diagrama .st)tico de (lases& Adem)s3 en estos diagramas a/arecen funciones # /ro/iedades 4ue contienen las clases # 4ue3 de no estar3 deben incor/orarse al Diagrama .st)tico de (lases& As53 los diagramas se van com/letando unos a otros3 en /aralelo3 *asta 4ue finalmente el diseo es co*erente&

+: u3a%or0 1

?u3a%ores : u3a%or

I: Fic'a0 1

?ue3o : Tres En6a&a

;ic'as : Fic'a 4: Tablero0 1 J: PonerFic'as0 1 K: @o!erFic'as0 1 M: u3arParti%a0 1 : Tablero

1: Turno0 u3a%orL u3a%or1 (: Casilla0 1

turno : Turno

casillas : Casilla

F ::= F

Ane0o F Solucin de los e ercicios

(: Pre3untaCasilla0 1 +: Pre3unt aCasilla0 1 I: =btenerFic'a0 1

casila2ori3en : Casilla

tablero : Tablero

4: Ti$oFic 'a0 1 ;ic'a21 : Fic'a

M: 8%&acente0Casilla1 J: PonerFic'a0 1

1: HuienToca0 1

K: /i3uiente0 1

casilla2%estino : Casilla

turno : Turno

+: Pre3untaCasilla0 1 I: Esta"acia0 1

c asilla21 : Casilla

(: PonerFic'a0 1 tablero : Tablero 4: =btenerFic'a0 1 ?u3a%or21 : u3a%or 1: HuienToca0 1 M: /i3uiente0 1

t urno : Turno

A&9&> Solucin del e ercicio >


)) %ource "ile9 Ficha.(ava public class Ficha / private -u,ador propietario7 )** Co!stru5e u!a "icha asi,!@!dole su propietario *) Ficha1-u,ador (u,ador4 / propietario G (u,ador7 8 )** Devuelve al (u,ador propietario de la "icha *) public -u,ador TipoFicha14 / return propietario7 8

F ::> F

Disear # Programar todo es em/ezar

)) %ource "ile9 Casilla.(ava import (ava.math.*7 public class Casilla / private Ficha m#Ficha7 private int "ila7 private int colum!a7 )**

Co!stru5e !u!a casilla .ue co!oce sus coorde!adas e! el tablero *) Casilla1int "ila+ int colum!a4 / this."ila G "ila7 this.colum!a G colum!a7 8 ?retur! True si la casilla esta vac>a *) public boolean estaAacia14 / return 1m#Ficha GG null47 8 )** +o!e u!a "icha e! u!a casilla *) public void po!erFicha1Ficha "icha4 / m#Ficha G "icha7 8 )** abtie!e la "icha .ue ha5 e! u!a casilla *) public Ficha obte!erFicha14 / return m#Ficha7 8 Mira si dos casillas so! ad5ace!tes *) public boolean ad5ace!te1Casilla casilla4 / return 11Math.abs1casilla."ila = "ila4 F H4 XX 1Math.abs1casilla.colum!a = colum!a4 F H447 8 )** )**

)) %ource "ile9 -u,ador.(ava import Ficha7 public class -u,ador / private Ficha m#Ficha23 G new Ficha2K37 private int co!t#"ichas G C7 private final int `^M#FIC'A% G K7 private %tri!, m#!ombre7 )** I!ica u! (u,ador co! su !ombre 5 crea sus "ichas. *) -u,ador1#tring !ombre4 / m#!ombre G !ombre7 for 1int co!t G C7 co!t F `^M#FIC'A%7 co!tOO4 m#Ficha2co!t3 G new Ficha1this47

)**

*) public Ficha obte!erFicha14 / if 1co!t#"ichas F K4 return m#Ficha2co!t#"ichasOO37 else return null7 8

Da u!a "icha. Desde ese mome!to 5a !o la posee. ?retur! ^!a "icha.

)** ?retur! El !ombre del (u,ador. *) public #tring !ombre14 / return m#!ombre7 8

F ::9 F

Ane0o F Solucin de los e ercicios

)) %ource "ile9 Tur!o.(ava import -u,ador7 public class Tur!o / private -u,ador m#-u,ador23 G new -u,ador2H37 private int tur!o G C7 )** ?retur! A .ue (ua,dor toca (u,ar *) public -u,ador .uie!Toca14 / return m#-u,ador2tur!o W H37 8 )** Cambia el tur!o *) public void si,uie!te14 / tur!oOO7 8 )** %e co!stru5eE almace!a!do los (u,adores e i!icia!do u! tur!o *) public Tur!o1-u,ador (u,ador#BE -u,ador (u,ador#H4 / m#-u,ador2C3 G (u,ador#B7 m#-u,ador2B3 G (u,ador#H7 8

)) %ource "ile9 Tablero.(ava import import import import Tur!o7 -u,ador7 Casilla7 (ava.io.*7

public class Tablero / private "i!al int ADa G K7 private Casilla m#Casilla23 G new Casilla2 ADa* ADa37 private Tur!o m#Tur!o7 Co!stru5e el tablero 5 prepara el tur!o *) Tablero1Tur!o tur!o4 / m#Tur!o G tur!o7 for 1int "ila G C7 "ila F ADa7 "ilaOO4 for 1int colum!a G C7 colum!a F ADa7 colum!aOO4 / m#Casilla2"ila * ADaOcolum!a3 G new Casilla1"ilaEcolum!a47 8 8 )** Devuelve la casilla correspo!die!te a u!as coorde!adas *) public Casilla obte!erCasilla1int "ilaE int colum!a4 / return m#Casilla2"ila * ADaOcolum!a37 8 )** +re,u!ta u!as coorde!adas por pa!talla *) private Casilla pre,u!taCasilla14 throws Exceptio! / %5stem.out.pri!t16I!trodu&ca coorde!da de "ila9 647 Bu""eredReader data G new Bu""eredReader1new I!put%treamReader1%5stem.i!447 int "ila G I!te,er.parseI!t1data.read i!e1447 %5stem.out.pri!t16I!trodu&ca coorde!da de colum!a9 647 int colum!a G I!te,er.parseI!t1data.read i!e1447 8 return obte!erCasilla1"ilaEcolum!a47 )**

)**

I!icia 5 (ue,a la partida co!trola!do el tur!o. *) public void (u,ar+artida14 throws Exceptio! / ))+o!emos las primeras J casillas for 1int co!t#po! G C7 co!t#po! F J7 co!t#po!OO4 / po!erFicha147 m#Tur!o.si,uie!te147 8

F ::? F

Disear # Programar todo es em/ezar


))%i ha ,a!ado al,u!o "i! if 1haca!ado14 UG null4 / %5stem.out.pri!t16'a ,a!ado el (u,ador 647 %5stem.out.pri!tl!1haca!ado14.!ombre1447 return7 8 ))E! otro caso pedimos .ue se po!,a la sexta "icha po!erFicha147 m#Tur!o.si,uie!te147 while 1haca!ado14 GG null4 / moverFicha147 m#Tur!o.si,uie!te147 8 %5stem.out.pri!t16'a ,a!ado el (u,ador 647 %5stem.out.pri!tl!1haca!ado14.!ombre1447

)**

+o!e i!icialme!te las "ichas e! el tablero pre,u!ta!do a los (u,adores *) public void po!erFicha14 throws Exceptio! / %5stem.out.pri!t16-u,ador 647 %5stem.out.pri!t1m#Tur!o..uie!Toca14.!ombre1447 %5stem.out.pri!tl!16 I!trodu&ca casilla para po!er "icha647 Casilla casilla G null7 do casilla G pre,u!taCasilla147 while 11casilla GG null4 YY 1Ucasilla.estaAacia14447 casilla.po!erFicha1m#Tur!o..uie!Toca14.obte!erFicha1447

)**

Mueve u!a "icha desde u!a casilla hasta otra *) public void moverFicha14 throws Exceptio! / %5stem.out.pri!t16-u,ador 647 %5stem.out.pri!t1m#Tur!o..uie!Toca14.!ombre1447 %5stem.out.pri!tl!16 i!trodu&ca "icha a mover647 ))bue la casilla ori,e! te!,a u!a "icha del (ua,dor .ue toca Casilla casilla#ori,e! G null7 do casilla#ori,e! G pre,u!taCasilla147 while 11casilla#ori,e! GG null4 YY 1casilla#ori,e!.estaAacia144 YY 1m#Tur!o..uie!Toca14 UG casilla#ori,e!.obte!erFicha14.tipoFicha14447 %5stem.out.pri!t16-u,ador 647 %5stem.out.pri!t1m#Tur!o..uie!Toca14.!ombre1447 %5stem.out.pri!tl!16 i!trodu&ca casilla desti!o647 ))bue la casilla desti!o este vac>a Casilla casilla#desti!o G null7 do casilla#desti!o G pre,u!taCasilla147 while 11casilla#desti!o GG null4 YY 1Ucasilla#desti!o.estaAacia144 YY 1m#Tur!o..uie!Toca14 UG casilla#ori,e!.obte!erFicha14.tipoFicha144 YY 1Ucasilla#ori,e!.Ad5ace!te1casilla#desti!o4447 casilla#desti!o.+o!erFicha1casilla#ori,e!.obte!erFicha1447 casilla#ori,e!.+o!erFicha1null47

)**

*) public -u,ador haca!ado14 / ))Comprobaci! de las "ilas for 1int "ila G C7 "ila F ADa7 "ilaOO4 / boolean tres#e!#ra5a G true7 -u,ador pie&a G null7

Comprueba si ha5 K "ichas e! li!ea del mismo (u,ador ?retur! Devuelve el (u,ador ,a!ador o e! otro caso !ull

if 1obte!erCasilla1"ilaEC4.obte!erFicha14 UG null4 / pie&a G obte!erCasilla1"ilaEC4.obte!erFicha14.tipoFicha147 for 1int colum!a G B7 colum!a F ADa7 colum!aOO4 / if 11obte!erCasilla1"ilaEcolum!a4.obte!erFicha14 GG null4 YY 1pie&a UG obte!erCasilla1"ilaEcolum!a4.obte!erFicha14.tipoFicha1444 tres#e!#ra5a G false7 8 8 if 11pie&a UG null4 XX 1tres#e!#ra5a44 return pie&a7

F ::@ F

Ane0o F Solucin de los e ercicios


))Comprobaci! de las colum!as for 1int colum!a G C7 colum!a F / boolean tres#e!#ra5a G true7

ADa7 colum!aOO4

-u,ador pie&a G null7 if 1obte!erCasilla1CEcolum!a4.obte!erFicha14 UG null4 / pie&a G obte!erCasilla1CEcolum!a4.obte!erFicha14.tipoFicha147 for 1int "ila G B7 "ila F ADa7 "ilaOO4 / if 11obte!erCasilla1"ilaEcolum!a4.obte!erFicha14 GG null4 YY 1pie&a UG obte!erCasilla1"ilaEcolum!a4.obte!erFicha14.tipoFicha1444 tres#e!#ra5a G false7 8 if 11pie&a UG null4 XX 1tres#e!#ra5a44 return pie&a7 8 8 ))Comprobaci! de u!a dia,o!al boolean tres#e!#ra5a G true7 -u,ador pie&a G null7 if 1obte!erCasilla1CEC4.obte!erFicha14 UG null4 / pie&a G obte!erCasilla1CEC4.obte!erFicha14.tipoFicha147 for 1int pos G B7 posF ADa7 posOO4 / if 11obte!erCasilla1posEpos4.obte!erFicha14 GG null4 YY 1pie&a UG obte!erCasilla1posEpos4.obte!erFicha14.tipoFicha1444 tres#e!#ra5a G false7 8 if 11pie&a UG null4 XX 1tres#e!#ra5a44 return pie&a7

))Comprobaci! de la otra dia,o!al tres#e!#ra5a G true7 pie&a G null7 if 1obte!erCasilla1 ADa=BEC4.obte!erFicha14 UG null4 / pie&a G obte!erCasilla1 ADa=BEC4.obte!erFicha14.tipoFicha147 for 1int pos G B7 pos F ADa7posOO4 / if 11obte!erCasilla1posEpos4.obte!erFicha14 GG null4 YY 1pie&a UG obte!erCasilla1posEpos4.obte!erFicha14.tipoFicha1444 tres#e!#ra5a G false7 8 if 11pie&a UG null4 XX 1tres#e!#ra5a44 return pie&a7 8 8 return pie&a7

)) %ource "ile9 TresE!Ra5a.(ava import Tablero7 import Tur!o7 import -u,ador7 public class $res(n,aya / )** Crea ob(etos 5 la!&a u!a partida *) public static void mai!1%tri!, ar,v234 / -u,ador m#-u,ador#B G new -u,ador16A647 -u,ador m#-u,ador#H G new -u,ador16B647 Tur!o m#Tur!o G new Tur!o1m#-u,ador#BE m#-u,ador#H47 Tablero m#Tablero G new Tablero1m#Tur!o47 try / m#Tablero.(u,ar+artida147 8 catch 1Exceptio! e4 / %5stem.out.pri!tl!16'a ocurrido u! error i!esperado647 8

A&9&9 Solucin del e ercicio 9


Se comienza realizando un diseo est)tico de clases3 4ue se divide en dos gru/os:

(lases Htiles /ara cual4uier uego de tablero 7Tablero3 -u,ador3 Tur!o3 Re,las # Ficha8&

F ::; F

Disear # Programar todo es em/ezar

(lases Htiles slo /ara el uego de a edrez 7Re,lasDeA(edre&3 +e!3 Rei!a3 Re5&&&&8&

.n el diagrama de la figura ad unta se a/recia como se *an se/arado mediante *erencia todos los elementos 4ue son susce/tibles de im/lementacin es/ecifica /ara el uego de a edrez& De esta manera3 luego3 cuando se im/lemente otro uego3 /odr)n ser sustituidos /or otros con la misma interfaz /ero otro com/ortamiento& (on esto se /retende 4ue los ob etos inde/endientes del uego de a edrez realicen o/eraciones genricas validas /ara todos los uegos 4ue luego se desee im/lementar&

uego +>niciarParti%a01 +main01 1 1 1 * 1

-re3las *

Reglas +HaCana%o01 : bool +ColocarFic'as>nicio01 + u3arParti%a01

-tablero

1 * -?u3a%or -turno

&a/lero ugador +=btenerFic'a01 +HuitarFic'a01 +PonerFic'a01 +ExisteCasilla01 1 * Ficha +@o!er01 -;ic'as 1M


Ficha +@o!er01 Reglas +HaCana%o01 : bool +ColocarFic'as>nicio01 + u3arParti%a01

&urno +HuienToca01 +PasaTurno01

-Color +@o!er01 +Pe%irCoor%ena%as01 1

FichaAjedre3 ReglasAjedre3 +Amenaza() +ItinerarioPosible() +@o!er01 +Com$robar6e&01

!eon +>tinerarioPosible01 : bool +8menaDa01 : bool

Reina +>tinerarioPosible01 : bool +8menaDa01 : bool

Re+ +>tinerarioPosible01 : bool +8menDa01 : bool

&orre +>tinerarioPosible01 : bool +8menaDa01 : bool

Ca/allo +>tinerarioPosible01 : bool +8menaDa01 : bool

Al0il +>tinerarioPosible01 : bool +8menaDa01 : bool

.l siguiente Diagrama de Secuencia ilustra cmo se im/lementar5a el escenario en el 4ue un ugador /ide un movimiento /or /antalla3 com/rueba 4ue se /uede realizar # lo e ecuta3 comiendo una /ieza del contrario&

F ::D F

Ane0o F Solucin de los e ercicios

?u3a%or2b

?u3a%or2a

tablero

torre21

turno

re3las

=b?ect1 >niciarParti%a01

HuienToca01 ColocarFic'as>nicio01 @o!er01

Pe%irCoor%ena%as01 =btenerFic'a01 @o!er01 ExisteCasilla01 HuitarFic'a01 PonerFic'a01 01 01 HaCana%o01 PasaTurno01 HuienToca01 @o!er01 >tinerarioPosible01

)))

Para es/ecificar en ma#or detalle cmo se realiza la o/eracin de movimiento dentro de la clase Torre3 # como afecta a la clase Ficha de la 4ue deriva3 se realiza el siguiente Diagrama de Actividad&
Fic'a::@o!er Fic'a8?e%reD::@o!er

Existe casilla %estino

-/>. "eri;icar itinerario $osible

-/>. e?ecutar mo!imiento 9anDar exce$ciAn

9anDar exce$ciAn

F :<C F

Disear # Programar todo es em/ezar

: Expe nded or

v enta : Modo Venta

entrada : Reader

lista : ListaTipo Billetes

bil letes : Tipo Bille te

billete _eleg ido : TipoBillete

monedero : Monedero

impresora : Impresora

PresentarModo( ) PantallaSeleccionBillete( )

PintarBilletes( ) Pintar( )

read(char) tipo_billete

TienePapel( ) si Ti eneTin ta( ) si Precio( )

read(char) ENTER

Cantid adInt roduc ida( ) CalcularVuelta( ) Pued eSum inistr ar( ) si S uminis trar( )

ImprimirY Expulsar( )

A&? . ercicios del ca/5tulo ?


A&?&: Solucin del e ercicio :
a8 Una /osible solucin es a4uella en la 4ue slo es necesario aadir una clase Radar& "a clase Radar se encarga de realizar el bucle de /resentacin& .sta clase comunica a un ob eto de la clase Radar%cree! la informacin 4ue le llega del Radar%treamReader&

Otras /osibles soluciones /odr5an incluir a una clase ab(etoAolador3 cu#os ob etos son ca/aces de leerse del stream # escribirse en la /antalla& b8 .l Diagrama de Secuencia es:

F :<: F

Ane0o F Solucin de los e ercicios

.ste diagrama se transforma en los siguientes fragmentos de cdigo:


void bucle+rese!tacio!14 / while1Ustop4 / !extTo$e!147 int ide!ti"icador G !val7 !extTo$e!147 int latitud G !val7 !extTo$e!147 int lo!,itud G !val7 !extTo$e!147 int color G !val7 !extTo$e!147 %tri!, eti.ueta G sval7 if 1id GG C4 pa!talla.clear%cree!147 pa!talla.Dra;1latitudElo!,itudEcolorEeti.utea4 8 8

.s necesario crear una clase Boto!DeColisio! 4ue im/lemente la interfaz RadarButto!& (uando se invo4ue clic$14 la clase cambiar) el To$e!i&er /ara 4ue tome los elementos desde el Radar%treamCollisio!Reader en vez de tomarlos directamente del Radar%treamReader& De esta forma el bucle de /resentacin seguir) funcionando de la misma forma& .l Diagrama .st)tico de (lases resultante es:

F :<< F

Disear # Programar todo es em/ezar

c8 .l Diagrama de Secuencia es:

.l Diagrama de Secuencia corres/onde al siguiente fragmento de cdigo:


void clic$14 / Radar%treamCollisio!Reader collisio!#stream G new Radar%treamCollisio!Reader1radar.radar#stream47 radar.to$e!i&er G new %treamTo$e!i&er1collisio!#stream47 8

A&@ . ercicios del ca/5tulo @


A&@&: Solucin del e ercicio :
Se /uede utilizar un ob eto de algHn derivado de %et /ara almacenar los enteros 4ue luego se ir)n e0tra#endo *asta com/letar el Aingo&

F :<= F

Ane0o A

Bndice alfabtico

A AbiertoFcerrado3 :CC Abstract3 =C3 =: Abstract %actor#3 D= Abstraer3 <3 > Aco/lamiento3 9 Ada/tador3 D9 Ada/ter3 D9 dmbitos3 <: Arra#3 == Arra#"ist3 ;@ Asociacin3 ; Autobo0ing3 9C3 ?: Autounbo0ing3 9C3 ?:

A Aarrera de la abstraccin3 ? Alo4ueado3 9; Alo4ueos mutuos3 9@ Alo4ues de inicializacin3 <= Aoolean3 :D AreaE3 <= Auilder3 D> A#te3 :D A#tecode3 :?

( (a a de arena3 :? (alles3 @> (amello3 :; (am/os3 <9 (ardinalidad3 D (ase3 <= (asting3 ::3 :D3 >: (atc*3 9: (*ar3 :D (*ecEed e0ce/tions3 9< (lase3 > (lase base3 D

(lase (lass3 >D (lase de ob etos3 > (lase derivada3 D (lase *i a3 D (lase /adre3 D (lases annimas3 =< (lases de envoltura3 ?: (lases internas3 <=3 =:3 =; (lases /arametrizadas3 >> (lass3 <>3 >D ("ASSPAT,3 => (lienteIservidor3 > (loneable3 99 (digo fuente3 :? (digo m)4uina3 :? (oercin3 :: (o*erencia3 :C (o*esin3 9 (ollection3 ;@ (ollections3 DC (omando3 D; (ommand3 D; (om/arable3 9@ (om/le idad3 : (om/ortamiento3 = (om/osicin3 D@ (om/osite3 D@ (oncurrencia3 :=3 9@ (ondiciones de carrera3 9@ (onstructor3 <;3 =; (onstructor /or defecto3 <; (ontinue3 <= (ontrato3 > (onversin3 ::

D DeadlocEs3 9@ Decorador3 D9 Decorator3 D9 Default3 <= De/endencia3 ; F :<9 F

Ane0o F Bndice alfabtico De/endencias3 :C Descom/oner3 : Descom/osicin algor5tmica3 : Descom/osicin orientada a ob etos3 < Deserializacin3 ;> Diagrama de Actividad3 @= Diagramas de (olaboracin3 ?> Diagramas de +nstancias3 :C Diagramas de +nteraccin3 ?> Diagramas de Pa4uetes3 :C Diagramas de Secuencia3 ?> Diagramas .st)ticos de (lases3 9 Do w*ile3 <= Double3 :D -arbage collector3 <D -enericidad3 >> -enrico3 >>

, ,as*!a/3 ;D ,as*Set3 ;@ ,erencia3 @3 =@ ,erencia mHlti/le3 @3 =; ,erencia sim/le3 @3 =@ ,ilos3 :=

. .conom5a3 ?> .ficiencia3 ?> . ecutable3 9; .lse3 << .nca/sular3 9 .nlace tard5o3 :< .nlace tem/rano3 :< .numSet3 ;; .nvoltorio3 D9 .nvolturas3 ?: .rror3 9< .stado3 = .strategia3 D@ .structurado3 = .0ce/cin3 >3 9: .0ce/ciones controladas3 9< .0ce/ciones no controladas3 9< .0ce/tion3 <@3 9< .0tends3 =@

+ +dentidad3 = +f3 << +m/lements3 >= +m/ort3 => +nanicin3 9@ +nmutable3 :;3 9:3 DC +n/utStream3 @D +nstanceof3 >: +nt3 :D +nterfaces3 >3 >< +terador3 D@ +teradores3 DC +terator3 D@

$ $ava Jative +nterface3 =: $avadoc3 :@ $erar4uizar3 <3 ? $+T3 :? $J+3 =: $ust +n Time3 :?

% %)brica Abstracta3 D= %actor# !et*od3 D> %inal3 <;3 =C3 =: %inalizadores3 <D %inall#3 9: %loat3 :D %or3 <<3 DC %orE3 := %riendl#3 =C

" "engua e Unificado de !odelado3 > "5neas de e ecucin3 := "inEed"ist3 ;@ "isEov3 :C: "ist3 ;@ "ong3 :D F :<? F

Disear # Programar todo es em/ezar ! !a/3 ;@3 ;D !)4uina 'irtual3 :? !todos3 > !iembros3 > !odelo de Ob etos3 = !odificadores en la definicin de clases generales3 =: !odularizar3 :C !dulos3 :C !onitor3 9; !uerto3 9; Patrn Observador3 :CC Patrones de Diseo3 D= Persistencia3 := Polimorfismo3 :< Polimorfismo din)mico3 :<3 =D Polimorfismo est)tico3 :<3 <; Poscondiciones3 > Precondiciones3 > Primitividad3 9 Princi/io abiertoFcerrado3 :CC Princi/io de inversin de de/endencia3 :C: Princi/io de "isEov3 :C: Princi/io de res/onsabilidad Hnica3 :C: Princi/io de segregacin de interfaces3 :C: Private3 ?3 =C3 =: Problema de la ambigQedad3 @ Problema del diamante3 @ Pro/iedades3 > Protected3 ?3 =C3 =: Protocolo3 > Public3 ?3 =C3 =:

J Jative3 =: Jew3 <; Jombres com/letamente calificados3 => Jotif#3 9D Jotif#All3 9D Juevo3 9; Jull3 <9

6 O Ob ect3 >D Ob eto3 = Observador3 :CC Observer3 :CC Ocultacin3 9 O/eradores3 <C Orientacin a as/ectos3 = Out/utStream3 @D 6ecolector de basura3 <D 6edefinicin3 =; 6efle0in3 >D 6egin de e0clusin mutua3 9; 6elaciones de asociacin3 ; 6elaciones de de/endencia3 ; 6elaciones de uso3 ; 6eturn3 <@ 6un3 9@

P Pa4uete3 :C Pa4uete /or defecto3 =9 Paradigma im/erativo3 = Patrn (omando3 D; Patrn (om/osicin3 D@ Patrn (onstructor3 D> Patrn Decorador3 D9 Patrn .nvoltorio3 D9 Patrn .strategia3 D@ Patrn %)brica3 D> Patrn +terador3 D@ Patrn !todo de (onstruccin3 D>

S Segregacin de interfaces3 :C: Sentencias3 <: Serializable3 ;> Serializacin3 @D3 ;> Set3 ;@ S*ort3 :D Slee/3 9; Sobrecarga3 <; Sorted!a/3 ;D SortedSet3 ;@ StacE3 ;@ Start3 9@ F :<@ F

Ane0o F Bndice alfabtico Starvation3 9@ Static3 =C3 =: Strateg#3 D@ Stream3 @D Strictf/3 =: Suficiencia # com/letitud3 9 Su/er3 =; Su/erclase3 D Switc*3 <= S#nc*ronized3 =:3 9; Ti/os enumerados3 9D Ti/os /arametrizados3 >@ Ti/os /rimitivos3 :; Transient3 =:3 ;9 Tree!a/3 ;D TreeSet3 ;@ Tr#3 9:

U U!"3 > Unc*ecEed e0ce/tions3 9< Unified !odeling "anguage3 > Uso3 ;

T Tamao de los mdulos3 :C Tem/oralidad3 ?= T*is3 <? T*read3 9@ T*reads3 := T*row3 <@3 9: T*rowable3 9: T*rows3 <@ Ti/ado3 :: Ti/ado dbil3 :: Ti/ado din)mico3 :< Ti/ado est)tico3 :< Ti/ado e0/licito3 :< Ti/ado fuerte3 :: Ti/ado im/l5cito3 :< Ti/ado latente3 :< Ti/o3 ::

' 'ariables3 :; 'ector3 ;@ 'ersatilidad3 ?= 'isibilidad3 ?= 'olatile3 =:

G Gait3 9D G*ile3 << Gra//er3 D9 Griter3 ;:

F :<; F

También podría gustarte