Sunteți pe pagina 1din 553

PROGRAMACIN

DesarrollodeAplicacionesWeb
JosLuisComesaa

11

NDICE

1.Introduccin.........................................................................................................................1
2.Programasyprogramacin..................................................................................................2
2.1.Buscandounasolucin................................................................................................................2
2.2.Algoritmosyprogramas...............................................................................................................3
3.Paradigmasdelaprogramacin..........................................................................................5
4.Fasesdelaprogramacin....................................................................................................7
4.1.Resolucindelproblema.............................................................................................................7
a) Anlisis....................................................................................................................................................7
b) Diseo.....................................................................................................................................................8
4.2.Implementacin.......................................................................................................................................8
a) Codificacinoconstruccin....................................................................................................................8
b) Pruebadeejecucinyvalidacin............................................................................................................9
4.3.Explotacin................................................................................................................................10
5.Ciclodevidadelsoftware..................................................................................................11
6.Lenguajesdeprogramacin...............................................................................................13
6.1.Lenguajemquina......................................................................................................................13
6.2.LenguajeEnsamblador...............................................................................................................14
6.3.Lenguajescompilados................................................................................................................16
6.4.Lenguajesinterpretados............................................................................................................17
7.EllenguajedeprogramacinJava......................................................................................19
7.1.QuycmoesJava?................................................................................................................19
7.2.Brevehistoria.............................................................................................................................21
7.3.LaPOOyJava.............................................................................................................................22
7.4.Independenciadelaplataformaytrabajoenred.....................................................................23
7.5.Seguridadysimplicidad.............................................................................................................24
7.6.JavaylosBytecodes...................................................................................................................25
8.ProgramasenJava.............................................................................................................26
8.1.Estructuradeunprograma........................................................................................................26
8.2.ElentornobsicodedesarrolloJava.........................................................................................27
8.3.LaAPIdeJava.............................................................................................................................28
8.4.Afinandolaconfiguracin..........................................................................................................29
8.5.Codificacin,compilacinyejecucindeaplicaciones..............................................................30
8.6.TiposdeaplicacionesenJava....................................................................................................32
9.EntornosIntegradosdeDesarrollo(IDE)...........................................................................34
9.1.Quson?..................................................................................................................................34
9.2.IDE'sactuales.............................................................................................................................35
9.3.ElentornoNetBeans..................................................................................................................37
9.4.Instalacinyconfiguracin........................................................................................................38
9.5.Aspectodelentornoygestindeproyectos.............................................................................39

DesarrollodeAplicacionesWeb

Tema3

Introduccinalaprogramacin.
Caso prctico
La evolucin de Internet y de las nuevas tecnologas, as como las diferentes posibilidades para
establecer nuevas lneas de negocio para la empresa BK Programacin, han hecho que Ada haya
decidido abrir una va de innovacin. Para ello, su empresa deber realizar el desarrollo de sus
aplicaciones a travs de lenguajes y tcnicas de programacin modernos, aunque con una eficiencia
y flexibilidad contrastadas.
Mara y Juan, ayudados y orientados por Ada, recordarn y ampliarn sus conocimientos
relacionados con la programacin, permitindoles crear software que pueda adaptarse a nuevas
situaciones, como el funcionamiento en diferentes plataformas (PDA, Mviles, Web, etc.) o la
interaccin con bases de datos. Todo ello sin perder de vista de donde parten y hacia dnde quieren
redirigir sus esfuerzos.
Estas innovaciones, junto a la predisposicin para adaptarse y evolucionar que BK Programacin est
potenciando en todas sus reas, repercutirn en una mayor capacidad de respuesta ante las
necesidades de sus posibles clientes. En definitiva, conseguir mayor competitividad.

1.- Introduccin.
Cuntasaccionesdelasquehasrealizadohoy,creesqueestnrelacionadasconlaprogramacin?
Hagamos un repaso de los primeros instantes del da: te ha despertado la alarma de tu telfono
mvil o radiodespertador, has preparado el desayuno utilizando el microondas, mientras
desayunabas has visto u odo las ltimas noticias a travs de tu receptor de televisin digital
terrestre,tehasvestidoypuedequehayasutilizadoelascensorparabajaralportalysaliralacalle,
etc. Quiz no es necesario que continuemos ms para darnos cuenta de que casi todo lo que nos
rodea,enalgunamedida,estrelacionadoconlaprogramacin,losprogramasyeltratamientode
algntipodeinformacin.
Elvolumendedatosqueactualmentemanejamosysusinnumerablesposibilidadesdetratamiento
constituyenunvastoterritorioenelquelosprogramadorestienenmuchoquedecir.
En esta primera unidad realizaremos un recorrido por los conceptos fundamentales de la
programacin de aplicaciones. Iniciaremos nuestro camino conociendo con qu vamos a trabajar,
qutcnicaspodemosemplearyquesloquepretendemosconseguir.Continuandoconelanlisis
de las diferentes formas de programacin existentes, identificaremos qu fases conforman el
desarrollodeunprograma,avanzaremosdetallandolascaractersticasrelevantesdecadaunodelos
lenguajesdeprogramacindisponibles,paraposteriormente,realizarunavisingeneraldellenguaje
de programacin Java. Finalmente, tendremos la oportunidad de conocer con qu herramientas
podramosdesarrollarnuestrosprogramas,escogiendoentreunadeellasparaponernosmanosala
obrautilizandoellenguajeJava.

Introduccinalaprogramacin

DAW

2.- Programas y programacin.


Caso prctico
Ada conoce bien lo que significa tener que llevar a cabo el proceso completo de creacin de software
y sabe que, en ocasiones, no se le da la importancia que debera a las fases iniciales de este
proceso. Quiere que Juan, que desarrolla programas casi sin darse cuenta, recuerde las ventajas que
aporta un buen anlisis inicial de los problemas a solucionar y que no aborde el desarrollo de sus
programas sentndose directamente ante el ordenador a teclear cdigo.
Juan le comenta a Ada y a Mara: La verdad es que cuando conoces bien un lenguaje de
programacin crees que puedes hacer cualquier programa directamente sobre el ordenador, pero al
final te das cuenta de que deberas haberte parado a planificar tu trabajo. Muchas veces tienes que
volver atrs, recodificar y en ocasiones, rehacer gran parte del programa porque lo que tienes no est
bien planteado.
Mara, que permanece atenta a lo que dicen Ada y Juan, quiere aprender bien desde el principio y
tendr la ventaja de tener a su lado a dos expertos.

2.1.Buscandounasolucin.
Generalmente,laprimeraraznquemueveaunapersonahaciaelaprendizajedelaprogramacin
esutilizarelordenadorcomoherramientapararesolverproblemasconcretos.Comoenlavidareal,
la bsqueda y obtencin de una solucin a un problema determinado, utilizando medios
informticos,sellevaacabosiguiendounospasosfundamentales.Enlasiguientetablapodemosver
estasanalogas.
Resolucindeproblemas
EnProgramacin...
Anlisisdelproblema:requierequeelproblemaseadefinidoy
Observacindela
comprendidoclaramenteparaquepuedaseranalizadocontodo
situacinoproblema.
detalle.
Pensamosenunaovarias Diseoodesarrollodealgoritmos:procedimientopasoapasopara
posiblessoluciones.
solucionarelproblemadado.
Resolucindelalgoritmoelegidoenlacomputadora:consisteen
Aplicamoslasolucinque
convertirelalgoritmoenprograma,ejecutarloycomprobarque
estimamosmsadecuada.
solucionaverdaderamenteelproblema.
Enlavidareal...

Quvirtudesdeberatenernuestrasolucin?
9 Correccinyeficacia:siresuelveelproblemaadecuadamente.
9 Eficiencia:silohaceenuntiempomnimoyconunusoptimodelosrecursosdelsistema.
Paraconseguirlo,cuandoafrontemoslaconstruccindelasolucintendremosquetenerencuenta
lossiguientesconceptos:
1. Abstraccin:setrataderealizarunanlisisdelproblemaparadescomponerloenproblemas
mspequeosydemenorcomplejidad,describiendocadaunodeellosdemaneraprecisa.
2. Divideyvencers,estasueleserconsideradaunafilosofageneralpararesolverproblemasy
deaququesunombrenosloformepartedelvocabularioinformtico,sinoquetambinse
utilizaenmuchosotrosmbitos.
3. Encapsulacin: consiste en ocultar la informacin para poder implementarla de diferentes
manerassinqueestoinfluyaenelrestodeelementos.
4. Modularidad: estructuraremos cada parte en mdulos independientes, cada uno de ellos
tendrsufuncincorrespondiente.

DesarrollodeAplicacionesWeb

Tema3

Citas para pensar


Roger Pressman: El comienzo de la sabidura para un ingeniero de software es
reconocerladiferenciaentrehacerqueunprogramafuncioneyconseguirquelohaga
correctamente.

2.2.Algoritmosyprogramas.
Despusdeanalizarendetalleelproblemaasolucionar,hemosdedisearydesarrollarelalgoritmo
adecuado.Pero,Quesunalgoritmo?

Algoritmo: secuencia ordenada de pasos, descrita sin ambigedades, que conducen a la


solucin de un problema dado.
Losalgoritmossonindependientesdeloslenguajesdeprogramacinydelascomputadorasdonde
se ejecutan. Un mismo algoritmo puede ser expresado en diferentes lenguajes de programacin y
podra ser ejecutado en diferentes dispositivos. Piensa en una receta de cocina, sta puede ser
expresada en castellano, ingls o francs, podra ser cocinada en fogn o vitrocermica, por un
cocineroo ms,etc.Pero independientementedetodasestascircunstancias,elplatose preparar
siguiendolosmismospasos.
Ladiferenciafundamentalentrealgoritmoyprogramaesque,enelsegundo,lospasosquepermiten
resolver el problema, deben escribirse en un determinado lenguaje de programacin para que
puedanserejecutadosenelordenadoryasobtenerlasolucin.
Los lenguajes de programacin son slo un medio para expresar el algoritmo y el ordenador un
procesador para ejecutarlo. El diseo de los algoritmos ser una tarea que necesitar de la
creatividad y conocimientos de las tcnicas de programacin. Estilos distintos, de distintos
programadoresalahoradeobtenerlasolucindelproblema,darnlugaraalgoritmosdiferentes,
igualmentevlidos.
En esencia, todo problema se puede describir por medio de un algoritmo y las caractersticas
fundamentalesquestosdebencumplirson:
9 Debeserprecisoeindicarelordenderealizacinpasoapaso.
9 Debe estar definido, si se ejecuta dos o ms veces, debe obtener el mismo resultado
cadavez.
9 Debeserfinito,debetenerunnmerofinitodepasos.
Pero cuando los problemas son complejos, es necesario descomponer stos en subproblemas ms
simples y, a su vez, en otros ms pequeos. Estas estrategias reciben el nombre de diseo
descendente(Metodologadediseodeprogramas,consistente enla descomposicindel problema
enproblemasmssencillosderesolver.)odiseomodular(topdowndesign)(Metodologadediseo
de programas, que consiste en dividir la solucin a un problema en mdulos ms pequeos o
subprogramas. Las soluciones de los mdulos se unirn para obtener la solucin general del
problema).Estesistemasebasaenellemadivideyvencers.
Para representar grficamente los algoritmos que vamos a disear, tenemos a nuestra disposicin
diferentes herramientas que ayudarn a describir su comportamiento de una forma precisa y
genrica,paraluegopodercodificarlosconellenguajequenosinterese.Entreotrastenemos:

Introduccinalaprogramacin

DAW

9 Diagramas de flujo: Esta tcnica utiliza smbolos grficos para la representacin del
algoritmo.Sueleutilizarseenlasfasesdeanlisis.
9 Pseudocdigo: Esta tcnica se basa en el uso de palabras clave en lenguaje natural,
constantes(Estructuradedatosqueseutilizaenloslenguajesdeprogramacinqueno
puede cambiar su contenido en el transcurso del programa.), variables (Estructura de
datosque,comosunombreindica,puedecambiardecontenidoalolargodelaejecucin
de un programa.), otros objetos, instrucciones y estructuras de programacin que
expresan de forma escrita la solucin del problema. Es la tcnica ms utilizada
actualmente.
9 Tablas de decisin: En una tabla son representadas las posibles condiciones del
problemaconsusrespectivasacciones.Sueleserunatcnicadeapoyoalpseudocdigo
cuandoexistensituacionescondicionalescomplejas.

Autoevaluacin
Rellena los huecos con los conceptos adecuados:
A los pasos que permiten resolver el problema, escritos en un lenguaje de programacin, para
que puedan ser ejecutados en el ordenador y as obtener la solucin, se les denomina:
Programa

Si estos pasos estuvieran descritos en un lenguaje genrico independiente de la mquina y del lenguaje de programacin, estaramos
hablando de algoritmos.

DesarrollodeApllicacionesW
Web

Tema3

3.-- Paraadigm
mas dee la prrogram
macin.
Caso
o prctico
Ada comenta co
on Juan y Mara
M
los disstintos enfoq
ques para el desarrollo de program
mas que han
n
existiido a lo largo
o de la historria de la programacin, destacando
d
que todos va
an a tener que renovar
su fo
orma de pen
nsar, si quierren comenza
ar a utilizar un lenguaje moderno q
que les perm
mita construirr
progrramas adapta
ados a las nuevas necessidades de sus clientes.

Cuntas formass existen dee hacer las cosas? Supo


ongo que estars
e
penssando: varias o incluso,,
has.Perocuaandoseestableceunpattrnparalaccreacindeaplicacionessnosestamo
osacercando
o
much
alsignificadodelapalabrapaaradigma.

Paraadigma de programaccin: es un modelo b


sico para el
e diseo y la implemeentacin dee
proggramas. Estee modelo deeterminar como ser el proceso de
d diseo y la estructu
ura final dell
proggrama.
Elparradigmarepresentauneenfoquepartticularofilossofaparalaconstruccin
ndesoftwarre.Cadauno
o
tendrr sus ventajas e inconvvenientes, seer ms o menos
m
apropiiado, pero n
no es correctto decir quee
existaaunomejorquelosdem
ms.

PARADIGMASDEPROGRAMACIN

ProgramaccinDeclarativaa
Seconsid
deraopuestaallaprogramacin
imperativva,sebasaene
eldesarrollode
programaasrealizandounaespecificaci
no
"declaraccin"deunconjuntodecondicciones,
proposiciones,afirmacio
ones,restriccionesy
transform
macionesquedescribenelpro
oblemay
detallanssusolucin.Lassentenciasqu
uese
utilizanlo
oquehacenesdescribirelprroblema
quesequ
uieresolucionarperonolas
instruccio
onesnecesariassparallevarloaacabo.
Dentrodeeesteparadigm
mapuedendesttacarse
laprogramacinfuncion
nalylaprogram
macin
lgica.
EllenguajjeSQLestbassadoeneste
paradigm
ma.
Funcional
Consideraaalprogramaccomounafuncin
matemttica, dondeeld
dominiorepreseentara
elconjuntodetodaslasentradasposib
bles
(inputs)yyelrangoseraelconjuntodetodas
lassalidasposibles(outp
puts).Laformaaenque
funcionapueseserente
endidacomoun
nacaja
negra,statieneunaseriedeentradass,un
procesam
mientointernoyyunasalida.
Noexisteeelconceptode
evariable,adem
msel
funcionam
mientodecadaafuncines
independ
dientedelresto
o.
EllenguajjeLISPesunejemplodeeste
paradigm
madeprogramaacin.
Lgica
Enesteparadigma,seespecificaquhacery
nocmohacerlo.Seutilizaeninteligen
ncia
artificial.
EllenguajjePrologesunejemploclaroquese
ajustaaeesteparadigma.

Program
macinImperatiiva
Consistteenunaseriedecomandosq
queunacompu
utadora
ejecutaar.Estoscomaandosdetalland
deformaclarayespecficael
cmoh
hacerlascosasyyllevarnalpro
ogramaatrav
sdedistintos
estadoss.Utilizavariab
bles,tiposdedaatos,expresione
esy
estructurasdecontroldeflujodelprrograma.
Program
macinconvencional
Tambinllamada,noeestructurada,n
noexistanenlo
oslenguajes
deproggramacininicialesherramien
ntasquepermittieran
estructurarelcdigop
parasumodificcacinoreutilizzacin.Los
program
maseranlneassylneasdecd
digoquehacan
ndifcilsu
lecturaomodificacin
n.Todoestababasadoeninstrruccionesde
salto(G
Goto)quemodiificabanelflujo
odelprograma..Unprograma
eraunnicoarchivo,eerandifcilesdeemantenerydifcilesde
represeentar.
Program
macinestructurada
Nacip
parasolventarlosproblemasyylimitacionesd
dela
program
macinconvencional.Permiteeutilizarestructturasque
facilitan
nlamodificaci
n,reutilizacin
nylecturadelccdigo.
Permiteeelusodelcon
nceptodefuncin(programaccinmodular),
queagrrupancdigoparalarealizaci
ndeunadeterminada
tarea.EEstasfuncionesspuedenserutilizadasencuallquierparte
delprograma,elnmeerodevecesqu
uesenecesiten
n
Permiteeunarepresentacinmsclarradelfuncionamientodelos
program
masmedianted
diagramas,enllosqueserepre
esentan
estructurascondicionaales,bucles,etcc.Todoseveco
omomdulos
quepuedencolaborarrentreellos.Esstetipodeproggramacin
tenaunaseriedelimiitacionesquep
provocaronlaaparicinde
otrosparadigmas.
Orientad
daaobjetos
Elmundosevedesdeelpuntodevisstadelosobjetosquehayen
l.Loso
objetostienencaractersticas(propiedades)yconellos
pueden
nrealizarseacciones(mtodos).Enestafilosofasebusca
encontrarlosobjetos,,envezdelasffuncionescomo
oen
program
macinestructurada.
Estbaasadaenvariastcnicas,incluyyendoherenciaa,abstraccin,
polimorfismoyencapsulamiento.
LenguaajescomoJava,C,C++,PHP,...sonclarosejem
mplosquese
basaneenesteparadiggma.
Visual,o
orientadaaaspeectos,orientadaaeventos,...
Sonunconjuntodepaaradigmasquepuedenserrele
evantes,
aunqueegranpartedeellosincluyenlosconceptosd
desarrollados
enelreestodeparadigmaspresentad
dosenestedocu
umento.

Introduccinalaprogramacin

DAW

Como habrs podido apreciar, existen mltiples paradigmas, incluso puede haber lenguajes de
programacinquenoseclasifiquennicamentedentrodeunodeellos.UnlenguajecomoSmalltalk
esunlenguajebasadoenelparadigmaorientadoaobjetos.EllenguajedeprogramacinScheme,en
cambio,soportasloprogramacinfuncional.Python,soportamltiplesparadigmas.

Parasaberms
Te proponemos el siguiente enlace en el que encontrars informacin adicional sobre los
diferentesparadigmasdeprogramacin.
http://javierleal.wordpress.com/2009/08/27/paradigmasdeprogramacion/
Culeselobjetivoquesebuscaconlaaplicacindelosdiferentesenfoques?Fundamentalmente,
reducir la dificultad para el mantenimiento de las aplicaciones, mejorar el rendimiento del
programadory,engeneral,mejorarlaproductividadycalidaddelosprogramas.

Autoevaluacin
En qu paradigma de programacin podramos enmarcar el lenguaje de programacin Java?
Programacin Estructurada.
Programacin Declarativa.
Programacin Orientada a Objetos.
S, Java emplea la filosofa de ver el mundo como objetos que tienen propiedades y mtodos que les permiten interactuar entre ellos.

DesarrollodeAplicacionesWeb

Tema3

4.- Fases de la programacin.


Caso prctico
Juan pregunta a Ada cmo van a realizar todo el proceso de produccin, y duda si el utilizar un
nuevo lenguaje supondr cambiar drsticamente los mtodos aprendidos en el pasado.
Ada tranquiliza a Juan y a Mara: Est claro que las fases principales que hemos estado llevando a
cabo a lo largo de nuestros anteriores proyectos se seguirn aplicando, aunque con algunas
diferencias. Lo ms importante Juan, es que sigamos adecuadamente el mtodo de trabajo para
conseguir buenos resultados.
Me costar mucho trabajo adaptarme? pregunta Mara.
Ada le contesta sentndose a su lado: No te preocupes Mara, se trata de adaptar conocimientos
que ya tienes y aprender algunos otros.

Sea cual sea el estilo que escojamos a la hora de automatizar una determinada tarea, debemos
realizar el proceso aplicando un mtodo a nuestro trabajo. Es decir, sabemos que vamos a dar
solucinaunproblema,aplicandounafilosofadedesarrolloyloharemosdandounaseriedepasos
quedebenestarbiendefinidos.
Elprocesodecreacindesoftwarepuededividirseendiferentesfases:
9 Fasederesolucindelproblema.
9 Fasedeimplementacin.
9 Fasedeexplotacinymantenimiento.
Acontinuacin,analizaremoscadaunadeellas.

4.1.Resolucindelproblema.
Paraelcomienzodeestafase,esnecesarioqueelproblemaseadefinidoycomprendidoclaramente
paraquepuedaseranalizadocontododetalle.Asuvez,lafasederesolucindelproblemapuede
dividirseendosetapas:

a) Anlisis
Por lo general, el anlisis indicar la especificacin de requisitos que se deben cubrir. Los
contactosentreelanalista/programadoryelcliente/usuariosernnumerosos,deestaforma
podrn ser conocidas todas las necesidades que precisa la aplicacin. Se especificarn los
procesosyestructurasdedatosquesevanaemplear.Lacreacindeprototipossermuy
tilparasaberconmayorexactitudlospuntosatratar.
El anlisis inicial ofrecer una idea general de lo que se solicita, realizando posteriormente
sucesivosrefinamientosqueservirnparadarrespuestaalassiguientescuestiones:
9 Culeslainformacinqueofrecerlaresolucindelproblema?
9 Qudatossonnecesariospararesolverelproblema?
Larespuestaalaprimerapreguntaseidentificaconlosresultadosdeseadosolassalidasdel
problema. La respuesta a la segunda pregunta indicar qu datos se proporcionan o las
entradasdelproblema.
En esta fase debemos aprender a analizar la documentacin de la empresa , investigar,
observartodoloquerodeaelproblemayrecopilarcualquierinformacintil.

Introduccinalaprogramacin

DAW

Ejercicio resuelto
Vamos a ilustrar esta fase realizando el anlisis del siguiente problema:
Leer el radio de un crculo y calcular e imprimir su superficie y circunferencia.
Est claro que las entradas de datos en este problema se reducen al radio del crculo, pero
piensa qu salidas de datos ofrecer la solucin?
Las salidas sern...
Variable de salida SUPERFICIE: ser la superficie del crculo. (Te acuerdas? El nmero
Pi por el radio al cuadrado).
Variable de salida CIRCUNFERENCIA: ser la longitud de la circunferencia del crculo.
(Y de sta? Dos por el nmero Pi y por el radio)
Y la entrada...
Variable RADIO: ser el radio del crculo.
Estas variables RADIO, SUPERFICIE y CIRCUNFERENCIA podrn ser de tipo real
(nmeros con parte entera y parte decimal, por ejemplo: 3,57)

b) Diseo
Enestaetapaseconviertelaespecificacinrealizadaenlafasedeanlisisenundiseoms
detallado, indicando el comportamiento o la secuencia lgica de instrucciones capaz de
resolver el problema planteado. Estos pasos sucesivos, que indican las instrucciones a
ejecutarporlamquina,constituyenloqueconocemoscomoalgoritmo.
Consisteenplantearlaaplicacincomounanicaoperacinglobal,eirdescomponindola
en operaciones ms sencillas, detalladas y especficas. En cada nivel de refinamiento, las
operacionesidentificadasseasignanamdulosseparados.
Hayque teneren cuentaqueantesdepasaralaimplementacindelalgoritmo,hemosde
asegurarnos que tenemos una solucin adecuada. Para ello, todo diseo requerir de la
realizacin de la prueba o traza del programa. Este proceso consistir en un seguimiento
paso a paso de las instrucciones del algoritmo utilizando datos concretos. Si la solucin
aportada tiene errores, tendremos que volver a la fase de anlisis para realizar las
modificaciones necesarias o tomar un nuevo camino para la solucin. Slo cuando el
algoritmocumplalosrequisitosyobjetivosespecificadosenlafasedeanlisissepasarala
fasedeimplementacin.

4.2.- Implementacin.
Silafasederesolucindelproblemarequiereunespecialcuidadoenlarealizacindelanlisisyel
posterior diseo de la solucin, la fase de implementacin cobra tambin una especial relevancia.
Llevar a la realidad nuestro algoritmo implicar cubrir algunas etapas ms que se detallan a
continuacin.

a) Codificacin o construccin
Esta etapa consiste en transformar o traducir los resultados obtenidos a un determinado
lenguajedeprogramacin.Paracomprobarlacalidadyestabilidaddelaaplicacinsehande
realizar una serie de pruebas que comprueben las funciones de cada mdulo (pruebas

DesarrollodeAplicacionesWeb

Tema3

unitarias), que los mdulos funcionan bien entre ellos (pruebas de interconexin) y que
todosfuncionanenconjuntocorrectamente(pruebasdeintegracin).
Cuandorealizamoslatraduccindelalgoritmoallenguajedeprogramacindebemostener
en cuenta las reglas gramaticales y la sintaxis de dicho lenguaje. Obtendremos entonces el
cdigofuente,loquenormalmenteconocemosporprograma.
Pero para que nuestro programa comience a funcionar, antes debe ser traducido a un
lenguajequelamquinaentienda.Esteprocesodetraduccinpuedehacersededosformas,
compilandoointerpretandoelcdigodelprograma.

Compilacin: Es el proceso por el cual se traducen las instrucciones escritas en un


determinado lenguaje de programacin a lenguaje que la mquina es capaz de
interpretar.
Compilador: programa informtico que realiza la traduccin. Recibe el cdigo
fuente, realiza un anlisis lexicogrfico, semntico y sintctico, genera un cdigo
intermedio no optimizado, optimiza dicho cdigo y finalmente, genera el cdigo objeto
para una plataforma especfica.
Intrprete: programa informtico capaz de analizar y ejecutar otros programas,
escritos en un lenguaje de alto nivel. Los intrpretes se diferencian de los
compiladores en que mientras estos traducen un programa desde su descripcin en un
lenguaje de programacin al cdigo de mquina del sistema, los intrpretes slo
realizan la traduccin a medida que sea necesaria, tpicamente, instruccin por
instruccin, y normalmente no guardan el resultado de dicha traduccin.
Una vez traducido, sea a travs de un proceso de compilacin o de interpretacin, el
programapodrserejecutado.

b) Prueba de ejecucin y validacin


Paraestaetapaesnecesarioimplantarlaaplicacinenelsistemadondevaafuncionar,debe
ponerse en marcha y comprobar si su funcionamiento es correcto. Utilizando diferentes
datos de prueba se ver si el programa responde a los requerimientos especificados, si se
detectannuevoserrores,sistossonbiengestionadosysilainterfazesamigable.Setratade
ponerapruebanuestroprogramaparaversurespuestaensituacionesdifciles.
Mientras se detecten errores y stos no se subsanen no podremos avanzar a la siguiente
fase.Unavezcorregidoelprogramaytesteadosedocumentarmediante:
9 Documentacin interna: Encabezados, descripciones, declaraciones del problema y
comentariosqueseincluyendentrodelcdigofuente.
9 Documentacinexterna:Sonlosmanualesquesecreanparaunamejorejecuciny
utilizacindelprograma.

Autoevaluacin
Rellena los huecos con los conceptos adecuados:

Introduccinalaprogramacin

En la fase de codificacin, hemos de tener en cuenta la

DAW
sintaxis

el cdigo fuente o programa. Posteriormente, ste deber ser


que pueda ser ejecutado posteriormente.

del lenguaje para obtener


compilado

interpretado

para

La sintaxis y reglas gramaticales del lenguaje de programacin que estemos utilizando deben ser respetadas para obtener un cdigo fuente
correcto. Este cdigo fuente debe ser compilado o interpretado, utilizando un programa compilador o intrprete, para transformarlo a un
formato que sea ejecutable por la mquina.

4.3.Explotacin.
Cuando el programa ya est instalado en el sistema y est siendo de utilidad para los usuarios,
decimosqueseencuentraenfasedeexplotacin.
Peridicamentesernecesariorealizarevaluacionesy,siesnecesario,llevaracabomodificaciones
para que el programa se adapte o actualice a nuevas necesidades, pudiendo tambin corregirse
errores no detectados anteriormente. Este proceso recibe el nombre de mantenimiento del
software.

Mantenimiento del software: es el proceso de mejora y optimizacin del software despus


de su entrega al usuario final. Involucra cambios al software en orden de corregir defectos y
dependencias encontradas durante su uso, as como la adicin de nuevas funcionalidades
para mejorar la usabilidad y aplicabilidad del software.
Ser imprescindible aadir una documentacin adecuada que facilite al programador la
comprensin,usoymodificacindedichosprogramas.

10

DesarrollodeAplicacionesWeb

Tema3

5.- Ciclo de vida del software.


Caso prctico
Mara le pregunta a Juan: Juan, qu ocurre cuando terminas un programa? Se entrega al cliente
y ya est? La verdad es que los programas que he hecho han sido para uso propio y no s cmo
termina el proceso con los clientes.
Contesta Juan: Pues vers, cuando terminas un programa, o crees que lo has terminado, hay que
llevar a cabo toda clase de pruebas para ver dnde puede fallar. Despus mejoras los posibles fallos
y posteriormente se entrega al cliente, ah es donde ves si tu software ha sido bien construido. El
cliente lo utilizar y durante un tiempo puede ser que haya que arreglar alguna cosilla. Y cuando ya
est todo correcto, en ocasiones, se establece un contrato de mantenimiento con el cliente. Como
ves, desarrollar software no consiste slo en programar y ya est.

Sean cuales sean las fases en las que realicemos el proceso de desarrollo de software, y casi
independientementedel,siempresedebeaplicarunmodelodeciclodevida.

Ciclo de vida del software: es una sucesin de estados o fases por las cuales pasa un
software a lo largo de su "vida".
Elprocesodedesarrollopuedeinvolucrarsiemprelassiguientesetapasmnimas:
9 EspecificacinyAnlisisderequisitos.
9 Diseo.
9 Codificacin.
9 Pruebas.
9 InstalacinypasoaProduccin.
9 Mantenimiento.
Existenvariostiposdeciclosdevidadelsoftware,acontinuacintemostramosunresumendelos
msimportantes.
Definicinde
Requerimientos

Modeloencascada

Estambinconocidopormodeloclsico,
modelo tradicional o modelo lineal
secuencial.Paracomenzarunafasehade
finalizarse la anterior. Es rgido y en la
prctica presenta algunos problemas de
aplicacin. Es el ms utilizado por su
escasacomplejidad

AnlisisyDiseo
delsoftware

Definicinde
requerimientos

Implementaciny
Pruebade
unidades

Operaciny
mantenimiento

Modeloporprototipos

Este ciclo de vida se basa en la creacin


de prototipos que irn mejorando el
conocimientodelproblema,tantoparael
usuariocomoparalosdesarrolladores.
La fase de especificacin de
requerimientos est compuesta por las
subfasesquesemencionanaladerecha:

Pequeoanlisisy
especificacin
Diseoyrealizacin
Evaluacin
Modificacin
Finalizacindelos
requerimientos

11

DAW

1.
2.
3.
4.

Desarrollo

Versin

Versiones

Validacin

Especificacin

Los
modelos
iterativo
incremental y espiral son del
tipoevolutivo

Descripcindelsistema

Introduccinalaprogramacin

Se emplea para facilitar la creacin de


aplicaciones flexibles y escalables, que
permitan incorporar modificaciones muy
rpidamente una vez que se finalice su
desarrollo
Este modelo permite adaptarse a
ModeloEvolutivo
requisitosquevareneneltiempo.Esun
modelo iterativo, permiten desarrollar
versiones cada vez ms completas y
complejas, hasta llegar al objeto final
deseado; incluso evolucionar ms all,
durantelafasedeexplotacin
El funcionamiento del modelo iterativo
incremental permite la entrega de
versiones parciales a medida que se va
construyendoelproductofinal
Por ejemplo, un procesador de texto
podra incluir inicialmente funciones
bsicas. En un incremento posterior
Modeloincremental
podra incorporar funciones para
previsualizacin y paginacin. En los
siguientes incrementos podra disponer
de funciones de correccin ortogrfica,
etc. Tras sucesivos incrementos
lograramos obtener el procesador de
textofinal
Este modelo emplea lo mejor de los
modelos convencional y por prototipos.
Estdivididoencuatrofases.Elpasopor
Modeloenespiral
cadaunadeestasfasesserepetirtantas
veces como sea necesario hasta que se
cumplan todos los requerimientos del
usuario

Versin

Planificacin
Anlisisderiesgo
Desarrollo
Evaluacindelcliente

Autoevaluacin
Entre los distintos tipos de ciclo de vida del software, los modelos incremental y en cascada
son modelos del tipo evolutivo.
Verdadero.

Falso.

El modelo incremental s es del tipo evolutivo, as como el modelo en espiral, ya que ambos permiten adaptarse a requisitos variables en el
tiempo. El modelo en cascada es mucho ms restrictivo y necesita de unos requerimientos prefijados y no variables.

12

DesarrollodeAplicacionesWeb

Tema3

6.- Lenguajes de programacin.


Caso prctico
Ada y Juan estn recordando lo complejos que eran algunos lenguajes de programacin, Ada
comenta: Cuando yo empec en esto, haba relativamente pocos lenguajes de programacin y no
permitan hacer programas como los que ahora desarrollamos.
Juan indica que l conoce las caractersticas generales de algunos lenguajes, pero que le gustara
saber algo ms sobre los que hubo, hay y habr.
Mara que asiente con la cabeza, piensa que aprender ms sobre los lenguajes disponibles en la
actualidad puede ayudar a la hora de elegir entre unos u otros.

Como hemos visto, en todo el proceso de resolucin de un problema mediante la creacin de


software, despus del anlisis del problema y del diseo del algoritmo que pueda resolverlo, es
necesariotraducirsteaunlenguajequeexpreseclaramentecadaunodelospasosaseguirparasu
correctaejecucin.Estelenguajerecibeelnombredelenguajedeprogramacin.

Lenguaje de programacin: Conjunto de reglas sintcticas y semnticas, smbolos y


palabras especiales establecidas para la construccin de programas. Es un lenguaje
artificial, una construccin mental del ser humano para expresar programas.
Gramtica del lenguaje: Reglas aplicables al conjunto de smbolos y palabras especiales del
lenguaje de programacin para la construccin de sentencias correctas.
Lxico: Es el conjunto finito de smbolos y palabras especiales, es el vocabulario del
lenguaje.
Sintaxis: Son las posibles combinaciones de los smbolos y palabras especiales. Est
relacionada con la forma de los programas.
Semntica: Es el significado de cada construccin del lenguaje, la accin que se llevar a
cabo.
Hay que tener en cuenta que pueden existir sentencias sintcticamente correctas, pero
semnticamente incorrectas. Por ejemplo, Un avestruz dio un zarpazo a su cuidador est bien
construidasintcticamente,peroesevidentequesemnticamenteno.
Una caracterstica relevante de los lenguajes de programacin es, precisamente, que ms de un
programadorpuedausarunconjuntocomndeinstruccionesqueseancomprendidasentreellos.A
travsdeesteconjuntosepuedelograrlaconstruccindeunprogramadeformacolaborativa.
Loslenguajesdeprogramacinpuedenserclasificadosenfuncindelocercaqueestndellenguaje
humanoodellenguajedeloscomputadores.Ellenguajedeloscomputadoressoncdigosbinarios,
esdecir,secuenciasdeunosyceros.Detallaremosseguidamentelascaractersticasprincipalesdelos
lenguajesdeprogramacin.

6.1.Lenguajemquina.
Esteesellenguajeutilizadodirectamenteporelprocesador,constadeunconjuntodeinstrucciones
codificadas en binario. Es el sistema de cdigos directamente interpretable por un circuito
microprogramable (Dispositivo o conjunto de dispositivos de propsito general, que, segn sea
necesario,seprogramanpararesolverdistintosproblemas).

13

Introduccinalaprogramacin

DAW

Este fue el primer lenguaje utilizado para la programacin de computadores. De hecho, cada
mquinatenasupropioconjuntodeinstruccionescodificadasencerosyunos.Cuandounalgoritmo
estescritoenestetipodelenguaje,decimosqueestencdigomquina.
Programarenestetipodelenguajepresentabalossiguientesinconvenientes:
9 Cadaprogramaeravlidosloparauntipodeprocesadoruordenador.
9 La lectura o interpretacin de los programas era extremadamente difcil y, por tanto, insertar
modificacionesresultabamuycostoso.
9 Los programadores de la poca deban memorizar largas combinaciones de ceros y unos, que
equivalanalasinstruccionesdisponiblesparalosdiferentestiposdeprocesadores.
9 Losprogramadoresseencargabande introducirloscdigosbinariosenelcomputador,loque
provocabalargostiemposdepreparacinyposibleserrores.
Acontinuacin,semuestranalgunoscdigosbinariosequivalentesalasoperacionesdesuma,resta
ymovimientodedatosenlenguajemquina.

Algunas operaciones en lenguaje mquina.


Operacin Lenguaje mquina Decimal
SUMAR
00101101
45
RESTAR
00010011
19
MOVER
00111010
58
Dadalacomplejidadydificultadesqueofrecaestelenguaje,fuesustituidoporotrosmssencillosy
fciles utilizar. No obstante, hay que tener en cuenta que todos los programas para poder ser
ejecutados, han de traducirse siempre al lenguaje mquina que es el nico que entiende la
computadora.

Parasaberms
Como recordatorio, te proponemos el siguiente enlace sobre cmo funciona el sistema
binario.
http://www.juntadeandalucia.es/educacion/adistancia/cursos/file.php/419/PROG01/PROG01_Web/
PROG01_Descripcion_Video_Elsistemabinario.html

Autoevaluacin
Rellena los huecos con los conceptos adecuados:
En el lenguaje mquina de algunos procesadores, la combinacin 00101101 equivale a la
operacin de

suma

La Suma, resta y la operacin de movimiento de datos eran muy utilizadas en los programas escritos en lenguaje mquina. An no se haba
extendido el uso de estructuras de programacin como las sentencias condicionales o los bucles.

6.2.LenguajeEnsamblador.
La evolucin del lenguaje mquina fue el lenguaje ensamblador. Las instrucciones ya no son
secuenciasbinarias,sesustituyenporcdigosdeoperacinquedescribenunaoperacinelemental
del procesador. Es un lenguaje de bajo nivel, al igual que el lenguaje mquina, ya que dependen
directamentedelhardwaredondesonejecutados.

Mnemotcnico: son palabras especiales, que sustituyen largas secuencias de ceros y unos,
utilizadas para referirse a diferentes operaciones disponibles en el juego de instrucciones que
soporta cada mquina en particular.

14

DesarrollodeApllicacionesW
Web
Tema3

Enen
nsamblador, cadainstrucccin(mnem
motcnico)se
ecorrespond
deaunainsttruccindel procesador..
Enlasiguientetablasemuesttranalgunossejemplos.
Algunasopeeracionesysu
A
umnemotccnicoen
len
nguajeEnsamblador.
Operacin
LenguajeEnsamblad
dor
MULLTIPLICAR
MUL
DIVIDIR
DIV
VER
MOV
MOV
oenlenguajeeensamblad
dor.Encolorr
Enelsiguientegrrficopuedeesverparte deunprogrramaescrito
rojosseharesaltaadoelcdigo
omquinaeenhexadecim
mal(Sistema
anumricoenbase16,eestosignifica
a
queccontiene16ssmbolosniccospararep
presentardattos:losnmeerosdel0al9ylasletrassdelaAala
a
F.),enmagentaeelcdigoesccritoen
ensam
mblador y
y en azu
ul, las
direcciones de memoria
m
do
onde se
encueentraelcdiigo.
Pero aunque en
nsamblador fue un
intento por apro
oximar el len
nguaje de lo
os procesado
ores al lengu
uaje humano
o, presentab
ba mltipless
dificu
ultades:
9 LLosprogram
masseguand
dependiendo
odirectamen
ntedelhardw
warequelossoportaba.
9 Losprogram
L
madorestenaanquecono
ocerdetallad
damentelam
mquinasob
brelaqueprrogramaban,,
y
yaquedeba
anhacerunu
usoadecuadodelosrecu
ursosdedich
hossistemass.
9 Lalectura,in
L
nterpretacin
nomodificacindelosp
programasseeguapresen
ntandodificultades.
Todo programa escrito en lenguaje en
nsamblador necesita dee un interm
mediario, que realice laa
tradu
uccin de cada
c
una dee las instru
ucciones que
e componen
n su cdigo
o al lenguaaje mquinaa
correespondiente. Este interm
mediario es el programaa ensamblad
dor. El progrrama originaal escrito en
n
lengu
uaje ensamb
blador constiituye el cdiigo fuente y
y el programa traducido al lenguaje mquina see
conocecomopro
ogramaobjettoqueserd
directamente
eejecutadoporlacompu
utadora.

15

Introduccinalaprogramacin

DAW

6.3.Lenguajescompilados.
Parapaliarlosproblemasderivadosdelusodellenguajeensambladoryconelobjetivodeacercarla
programacinhaciaelusodeunlenguajemscercanoalhumanoquealdelcomputador,nacieron
loslenguajescompilados.Algunosejemplosdeestetipodelenguajesson:Pascal,Fortran,Algol,C,
C++(EsellenguajedeprogramacinCampliadoparapoderutilizarlosmecanismosquepermitanla
manipulacindeobjetos.Esunlenguajemultiparadigma.),etc.
Alserlenguajesmscercanosalhumano,tambinselesdenominalenguajesdealtonivel.Sonms
fciles de utilizar y comprender, las instrucciones que forman parte de estos lenguajes utilizan
palabrasysignosreconociblesporelprogramador.
Culessonsusventajas?
9 Sonmuchomsfcilesdeaprenderydeutilizarquesuspredecesores.
9 Sereduceeltiempoparadesarrollarprogramas,ascomoloscostes.
9 Son independientes del hardware, los programas pueden ejecutarse en diferentes tipos de
mquina.
9 Lalectura,interpretacinymodificacindelosprogramasesmuchomssencilla.
Pero un programa que est escrito en un lenguaje de alto nivel tambin tiene que traducirse a un
cdigoquepuedautilizarlamquina.Losprogramastraductoresquepuedenrealizarestaoperacin
sellamancompiladores.

Compilador: Es un programa cuya funcin consiste en traducir el cdigo fuente de un


programa escrito en un lenguaje de alto nivel a lenguaje mquina. Al proceso de traduccin
se le conoce con el nombre de compilacin.
Para ilustrar el proceso de compilacin de
programastemostramoslasiguienteilustracin:

El compilador realizar la traduccin y adems


informar de los posibles errores. Una vez
subsanados, se generar el programa traducido a
cdigo mquina, conocido como cdigo objeto.
Este programa an no podr ser ejecutado hasta
que no se le aadan los mdulos de enlace o
bibliotecas, durante el proceso de enlazado. Una
vez finalizado el enlazado, se obtiene el cdigo
ejecutable.

16

DesarrollodeAplicacionesWeb

Tema3

Autoevaluacin
Durante la fase de enlazado, se incluyen en el cdigo fuente determinados mdulos
(bibliotecas) que son necesarios para que el programa pueda realizar ciertas tareas,
posteriormente se obtendr el cdigo ejecutable.
Verdadero.

Falso.

El cdigo fuente es traducido por el compilador, pero en la fase de enlazado los mdulos son aadidos al cdigo objeto; estos mdulos
permitirn al programa manejar dispositivos, comunicarse con otros elementos del sistema, etc.

6.4.Lenguajesinterpretados.
Secaracterizanporestardiseadosparaquesuejecucinserealiceatravsdeunintrprete.Cada
instruccin escrita en un lenguaje interpretado se analiza, traduce y ejecuta tras haber sido
verificada.Unavezrealizadoelprocesoporelintrprete,lainstruccinseejecuta,peronoseguarda
enmemoria.

Intrprete: Es un programa traductor de un lenguaje de alto nivel en el que el proceso de


traduccin y de ejecucin se llevan a cabo simultneamente, es decir, la instruccin se pasa a
lenguaje mquina y se ejecuta directamente. No se genera programa objeto, ni programa
ejecutable.
Los lenguajes interpretados generan programas de menor tamao que los generados por un
compilador,alnoguardarelprogramatraducidoacdigomquina.Peropresentanelinconveniente
deseralgomslentos,yaquehandesertraducidosdurantesuejecucin.Porotraparte,necesitan
disponerenlamquinadelprogramaintrpreteejecutndose,algoquenoesnecesarioenelcaso
deunprogramacompilado,paralosquesloesnecesariotenerelprogramaejecutableparapoder
utilizarlo.
Ejemplosdelenguajesinterpretadosson:Perl,PHP,Python,JavaScript,etc.
A medio camino entre los lenguajes compilados y los interpretados, existen los lenguajes que
podemosdenominarpseudocompiladosopseudointerpretados,eselcasodelLenguajeJava.Java
puede verse como compilado e interpretado a la vez, ya que su cdigo fuente se compila para
obtenerelcdigobinarioenformadebytecodes,quesonestructurasparecidasalasinstrucciones
mquina, con la importante propiedad de no ser dependientes de ningn tipo de mquina (se
detallarnmsadelante).LaMquinaVirtualJavaseencargardeinterpretarestecdigoy,parasu
ejecucin, lo traducir a cdigo mquina del procesador en particular sobre el que se est
trabajando.

Debesconocer
Puedes entender por qu Java es un lenguaje compilado e interpretado a travs del
siguienteesquema.
Losdosprocesosserealizanenfasesdistintas:
ProgramaJava

bytecode

javac

java

bytecode

fasededesarrollo

binario

fasedeexplotacin

17

Introduccinalaprogramacin

DAW

El compilador (javac) slo tiene que estar en la plataforma de desarrollo, y el interprete (java)
tienequeestarentodoslosclientesquequieranejecutarelapplet.

Autoevaluacin
En Java el cdigo fuente es compilado, obtenindose el cdigo binario en forma de bytecodes.
Pero, Cul es la extensin del archivo resultante?
Extensin .obj.
Extensin .class.
Extensin .Java.
Este tipo de archivos son los que la Mquina Virtual Java traducir para poder ejecutarlos en la mquina real.

18

DesarrollodeAplicacionesWeb

Tema3

7.- El lenguaje de programacin Java.


Caso prctico
Ada indica a Juan y Mara que el lenguaje elegido para sus desarrollos va a ser Java. La flexibilidad,
facilidad de aprendizaje, similitud con algunos lenguajes que ya conocen y su capacidad para
adaptarse a cualquier plataforma, hacen que sea ideal para producir las nuevas aplicaciones de BK
Programacin.

7.1.QuycmoesJava?
Java es un lenguaje sencillo de aprender, con una sintaxis parecida a la de
C++,peroenlaquesehaneliminadoelementoscomplicadosyquepueden
originar errores. Java es orientado a objetos, con lo que elimina muchas
preocupacionesalprogramadorypermitelautilizacindegrancantidadde
bibliotecas ya definidas, evitando reescribir cdigo que ya existe. Es un
lenguajedeprogramacincreadoparasatisfacernuevasnecesidadesquelos
lenguajesexistenteshastaelmomentonoerancapacesdesolventar.
UnadelasprincipalesvirtudesdeJavaessuindependenciadelhardware,ya
queelcdigoquesegeneraesvlidoparacualquierplataforma.Estecdigo
serejecutadosobreunamquinavirtualdenominadaMaquinaVirtualJava
(MVJoJVMJavaVirtualMachine),queinterpretarelcdigoconvirtindoloacdigoespecficode
laplataformaquelosoporta.Deestemodoelprogramaseescribeunanicavezypuedehacerse
funcionarencualquierlugar.Lemadellenguaje:Writeonce,runeverywhere.
AntesdequeaparecieraJava,ellenguajeCeraunodelosmsextendidosporsuversatilidad.Pero
cuandolosprogramasescritosenCaumentabandevolumen,sumanejocomenzabaacomplicarse.
Mediantelastcnicasdeprogramacinestructuradayprogramacinmodularseconseguanreducir
estascomplicaciones,peronoerasuficiente.
Fue entonces cuando la Programacin Orientada a Objetos (POO) entra en escena, aproximando
notablementelaconstruccindeprogramasalpensamientohumanoyhaciendomssencillotodoel
proceso. Los problemas se dividen en objetos que tienen propiedades e interactan con otros
objetos, de este modo, el programador puede centrarse en cada objeto para programar
internamenteloselementosyfuncionesquelocomponen.
LascaractersticasprincipalesdelenguajeJavaseresumenacontinuacin:
9
9
9
9
9
9
9

ElcdigogeneradoporelcompiladorJavaesindependientedelaarquitectura.
Esttotalmenteorientadoaobjetos.
SusintaxisessimilaraCyC++.
Esdistribuido,preparadoparaaplicacionesTCP/IP.
Disponedeunamplioconjuntodebibliotecas.
Esrobusto,realizandocomprobacionesdelcdigoentiempodecompilacinydeejecucin.
La seguridad est garantizada, ya que las aplicaciones Java no acceden a zonas delicadas de
memoriaodesistema.

19

Introduccinalaprogramacin

DAW

Debesconocer
Obtnunadescripcindetalladadelascaractersticasreseadasanteriormenteatravsdel
siguienteartculo:
Caractersticas
CONCEPTOSCLAVE

9 bytecodes
9 Lenguaje totalmente orientado a Objetos. Todos los conceptos en los que
una especie de cdigo
se apoya esta tcnica, encapsulacin, herencia, polimorfismo, etc., estn
mquina.
presentesenJava.
9 applets
9 Disponibilidaddeunamplioconjuntodebibliotecas.Comoyasemencion
programasembebidosen
anteriormente, Java es algo ms que un lenguaje. La programacin de
pginasWeb.
aplicacionesconJavasebasanosoloenelempleodeljuegodeinstrucciones
9 MquinaVirtual
que componen el lenguaje, sino, fundamentalmente, en la posibilidad de
softwarequeemulaaun
utilizar el amplsimo conjunto de clases que Sun pone a disposicin del
ordenador.
programadoryconlascualesesposiblerealizarprcticamentecualquiertipo
deaplicacin.
9 Lenguaje simple. Java posee una curva de aprendizaje muy rpida. Resulta relativamente sencillo escribir applets
interesantesdesdeelprincipio.TodosaquellosfamiliarizadosconC++encontrarnqueJavaesmssencillo,yaquese
haneliminadociertascaractersticas,comolospunteros.DebidoasusemejanzaconCyC++,ydadoquelamayora
de la gente los conoce aunque sea de forma elemental, resulta muy fcil aprender Java. Los programadores
experimentadosenC++puedenmigrarmuyrpidamenteaJavayserproductivosenpocotiempo.
9 DistribuidoJavaproporcionaunacoleccindeclasesparasuusoenaplicacionesdered,quepermitenabrirsocketsy
establecer y aceptar conexiones con servidores o clientes remotos, facilitando as la creacin de aplicaciones
distribuidas.
9 Interpretado ycompilado a lavez Javaes compilado, en la medida enquesucdigo fuentese transformaen una
especie de cdigo mquina, los bytecodes, semejantes a las instrucciones de ensamblador. Por otra parte, es
interpretado, ya que los bytecodes se pueden ejecutar directamente sobre cualquier mquina a la cual se hayan
portadoelintrpreteyelsistemadeejecucinentiemporeal(runtime).
9 RobustoJavafuediseadoparacrearsoftwarealtamentefiable.Paraelloproporcionanumerosascomprobaciones
encompilacinyentiempodeejecucin.Suscaractersticasdememorialiberanalosprogramadoresdeunafamilia
enteradeerrores(laaritmticadepunteros),yaquesehaprescindidoporcompletodelospunteros,ylarecoleccin
debasuraeliminalanecesidaddeliberacinexplcitadememoria.
9 Seguro (?) Dada la naturaleza distribuida de Java, donde las applets se bajan desde cualquier punto de la Red, la
seguridad se impuso como una necesidad de vital importancia. A nadie le gustara ejecutar en su ordenador
programasconaccesototalasusistema,procedentesdefuentesdesconocidas.Asqueseimplementaronbarreras
deseguridadenellenguajeyenelsistemadeejecucinentiemporeal.
9 IndiferentealaarquitecturaJavaestdiseadoparasoportaraplicacionesquesernejecutadasenlosmsvariados
entornosdered,desdeUnixaWindowsNt,pasandoporMacyestacionesdetrabajo,sobrearquitecturasdistintasy
consistemasoperativosdiversos.Paraacomodarrequisitosdeejecucintandiversosovariopintos,elcompiladorde
Java genera bytecodes: un formato intermedio indiferente a la arquitectura diseado para transportar el cdigo
eficientemente a mltiples plataformas hardware y software. El resto de problemas los soluciona el intrprete de
Java.
9 PortableLaindiferenciaalaarquitecturarepresentaslounapartedesuportabilidad.Adems,Javaespecificalos
tamaos de sus tipos de datos bsicos y el comportamiento de sus operadores aritmticos, de manera que los
programassonigualesentodaslasplataformas.EstasdosltimascaractersticasseconocencomolaMquinaVirtual
Java(JVM).
9 Altorendimiento
9 MultihebraHoyendayasevencomoterriblementelimitadaslasaplicacionesqueslopuedenejecutarunaaccina
lavez.Javasoportasincronizacindemltipleshilosdeejecucin(multithreading)aniveldelenguaje,especialmente
tiles en la creacin de aplicaciones de red distribuidas. As, mientras un hilo se encarga de la comunicacin, otro
puedeinteractuarconelusuariomientrasotropresentaunaanimacinenpantallayotrorealizaclculos.
9 DinmicoEllenguajeJavaysusistemadeejecucinentiemporealsondinmicosenlafasedeenlazado.Lasclases
slo se enlazan a medida que son necesitadas. Se pueden enlazar nuevos mdulos de cdigo bajo demanda,
procedentedefuentesmuyvariadas,inclusodesdelaRed.
9 ProduceappletsJavapuedeserusadoparacreardostiposdeprogramas:aplicacionesindependientesyapplets.Las
aplicaciones independientes se comportan como cualquier otro programa escrito en cualquier lenguaje, como por
ejemplo el navegador de Web HotJava, escrito ntegramente en Java. Por su parte, las applets son pequeos
programasqueaparecenembebidosenlaspginasWeb,comoaparecenlosgrficosoeltexto,peroconlacapacidad
de ejecutar acciones muy complejas, como animar imgenes, establecer conexiones de red, presentar mens y
cuadrosdedilogoparaluegoemprenderacciones,etc.

20

DesarrollodeAplicacionesWeb

Tema3

7.2.Brevehistoria.
Javasurgi en 1991 cuando un grupo de ingenieros de Sun Microsystems trataron de disear un
nuevo lenguaje de programacin destinado a programar pequeos dispositivos electrnicos. La
dificultaddeestosdispositivosesquecambiancontinuamenteyparaqueunprogramafuncioneen
elsiguientedispositivoaparecido,hayquerescribirelcdigo.PoresolaempresaSunqueracrearun
lenguajeindependientedeldispositivo.
Peronofuehasta1995cuandopasallamarseJava,dndoseaconoceralpblicocomolenguajede
programacin para computadores. Java pasa a ser un lenguaje totalmente independiente de la
plataformayalavezpotenteyorientadoaobjetos.Esafilosofaysufacilidadparacrearaplicaciones
pararedesTCP/IPhahechoqueseaunodeloslenguajesmsutilizadosenlaactualidad.
ElfactordeterminanteparasuexpansinfuelaincorporacindeunintrpreteJavaenlaversin2.0
delnavegadorWebNetscapeNavigator,loquesupusounagranrevueloenInternet.Aprincipiosde
1997 apareci Java 1.1que proporcion sustanciales mejoras al lenguaje. Java 1.2, ms tarde
rebautizadocomoJava2,naciafinalesde1998.
ElprincipalobjetivodellenguajeJavaesllegaraserelnexouniversalqueconectealosusuarioscon
lainformacin,eststasituadaenelordenadorlocal,enunservidorWeb,enunabasededatoso
encualquierotrolugar.
Para el desarrollo de programas en lenguaje Java es necesario utilizar un entorno de desarrollo
denominado JDK (Java Development Kit), que provee de un compilador y un entorno de ejecucin
(JREJavaRunEnvironment)paralosbytecodesgeneradosapartirdelcdigofuente.Aligualquelas
diferentes versiones del lenguaje han incorporado mejoras, el entorno de desarrollo y ejecucin
tambinhasidomejoradosucesivamente.
Java2eslaterceraversindellenguaje,peroesalgomsqueunlenguajedeprogramacin,incluye
lossiguienteselementos:
9 Unlenguajedeprogramacin:Java.
9 Unconjuntodebibliotecasestndarquevienenincluidasenlaplataformayquesonnecesarias
entodoentornoJava.EselJavaCore.
9 Un conjunto de herramientas para el desarrollo de programas, como es el compilador de
bytecodes,elgeneradordedocumentacin,undepurador,etc.
9 Un entorno de ejecucin que en definitiva es una mquina virtual que ejecuta los programas
traducidosabytecodes.

El siguiente esquema muestra los elementos


fundamentales de la plataforma de desarrollo
Java2.

21

Introduccinalaprogramacin

ActualmentehaytresedicionesdelaplataformaJava2:

DAW

9 J2SE:EntornodeSunrelacionadoconlacreacindeaplicacionesyappletsenlenguajeJava.
9 J2EE:PensadaparalacreacindeaplicacionesJavaempresarialesydelladodelservidor.
9 J2ME:PensadaparalacreacindeaplicacionesJavaparadispositivosmviles.

Parasaberms
Si deseas conocer ms sobre los orgenes del lenguaje Java, aqu te ofrecemos ms
informacin:
http://www.wikilearning.com/tutorial/tutorial_de_Javaorigen_de_Java/39384
http://es.wikipedia.org/wiki/Java_%28lenguaje_de_programaci%C3%B3n%29#Historia
http://www.oracle.com/technetwork/Java/Javase/overview/javahistorytimeline198369.html

7.3.LaPOOyJava.
EnJava,losdatosyelcdigo(funcionesomtodos)secombinanenentidadesllamadasobjetos.El
objetotendruncomportamiento(sucdigointerno)yunestado(losdatos).Losobjetospermiten
la reutilizacin del cdigo y pueden considerarse, en s mismos, como piezas reutilizables en
mltiplesproyectosdistintos.Estacaractersticapermitereducireltiempodedesarrollodesoftware.
Porsimplificarunpocolascosas,unprogramaenJavasercomounarepresentacin teatralenla
que debemos preparar primero cada personaje, definir sus caractersticas y qu va a saber hacer.
Cuandoestafaseestterminada,laobrasedesarrollarsacandopersonajesaescenayhacindoles
interactuar.
Al emplear los conceptos de la Programacin Orientada a Objetos (POO), Java incorpora las tres
caractersticas propias de este paradigma:encapsulacin (En programacin modular y ms
especficamenteenprogramacinorientadaaobjetos,sedenominaasalocultamientodelosdatosy
elementos internos de un objeto. Slo se puede modificar un objeto a travs de las operaciones
definidas para ste.), herencia(Mecanismo que permite derivar una clase de otra, de manera que
extienda su funcionalidad) y polimorfismo.(Capacidad para que varias clases derivadas de una
antecesorautilicenunmismomtododeformadiferente.Podemoscreardosclasesdistintas:Pezy
Ave que heredan de la superclase Animal. La clase Animal tiene el mtodo abstracto mover que se
implementa de forma distinta en cada una de las subclases (peces y aves se mueven de forma
distinta).) Los patrones o tipos de objetos se denominan clases(Es una construccin que se utiliza
como un modelo (o plantilla) para crear objetos de ese tipo. El modelo describe el estado y el
comportamiento que todos los objetos de la clase comparten) y los objetos que utilizan estos
patronesopertenecenadichostipos,seidentificanconelnombredeinstancias.(Una instancia se

produce con la creacin de un objeto perteneciente a una clase (se dice que se instancia la
clase). El objeto que se crea tiene los
atributos, propiedades y mtodos de la clase
a la que pertenece. Los objetos y sus
caractersticas se usan en la construccin
de programas, ya sea como contenedores de
datos o como partes funcionales del
programa.)Pero,nohayquealarmarse,estos
conceptos se vern ms adelante en sucesivas
unidades.

22

DesarrollodeAplicacionesWeb

Tema3

Otro ejemplo para seguir aclarando ideas, piensa en los bloques de juegos de construccin.
Suponemos que conoces los cubos de plstico en varios colores y tamaos. Por una de sus caras
disponen de pequeos conectores circulares y en otra de sus caras pequeos orificios en los que
puedenconectarseotrosbloques,conelobjetivoprincipaldepermitirconstruirformasmsgrandes.
Siusasdiferentespiezasdellegopuedesconstruiraviones,coches,edificios,etc.Sitefijasbien,cada
piezaesunobjetopequeoquepuedeunirseconotrosobjetosparacrearobjetosmsgrandes.
Pues bien, aproximadamente as es como funciona la programacin dirigida a objetos: unimos
elementos pequeos para construir otros ms grandes. Nuestros programas estarn formados por
muchoscomponentes(objetos)independientesydiferentes;cadaunoconunafuncindeterminada
ennuestrosoftwareyquepodrcomunicarseconlosdemsdeunamanerapredefinida.

7.4.Independenciadelaplataformaytrabajoenred.
ExistendoscaractersticasquedistinguenaJavadeotroslenguajes,comosonlaindependenciadela
plataforma y la posibilidad de trabajar en red o, mejor, la posibilidad de crear aplicaciones que
trabajanenred.
Estascaractersticaslasvamosaexplicaracontinuacin:
a) Independencia:LosprogramasescritosenJavapuedenserejecutadosencualquiertipode
hardware. El cdigo fuente es compilado, generndose el cdigo conocido como Java
Bytecode(instruccionesmquinasimplificadasquesonespecficasdelaplataformaJava),el
bytecode ser interpretado y ejecutado en la Mquina Virtual Java (MVJ o JVM Java
Virtual Machine) que es un programa escrito en cdigo nativo de la plataforma destino
entendibleporelhardware.Conestoseevitatenerquerealizarunprogramadiferentepara
cadaCPUoplataforma.
Portanto,lapartequerealmenteesdependientedelsistemaeslaMquinaVirtualJava,as
comolaslibrerasobibliotecasbsicasquepermitenaccederdirectamentealhardwaredela
mquina.
b) Trabajo en red: Esta capacidad del lenguaje ofrece mltiples posibilidades para la
comunicacin va TCP/IP. Para poder hacerlo existen libreras que permiten el acceso y la
interaccin con protocolos como http, ftp, etc., facilitando al programador las tareas del
tratamientodelainformacinatravsderedes.

Autoevaluacin
Qu elemento es imprescindible para que una aplicacin escrita en Java pueda ejecutarse en
un ordenador?
Que disponga de conexin a Internet y del hardware adecuado.
Que tenga instalado un navegador web y conexin a Internet.
Que tenga la Mquina Virtual Java adecuada instalada.
Sin la Mquina Virtual Java es imposible que el hardware pueda entender los cdigos de bytes necesarios para la ejecucin del programa,
siendo necesaria la mquina virtual adecuada para la plataforma hardware que estemos utilizando.

23

Introduccinalaprogramacin

DAW

7.5.Seguridadysimplicidad.
Junto a las caractersticas diferenciadoras del lenguaje Java relacionadas con la independencia y el
trabajoenred,handedestacarsedosvirtudesquehacenaestelenguajeunodelosmsextendidos
entrelacomunidaddeprogramadores:suseguridadysusimplicidad.
a. Seguridad: En primer lugar, los posibles accesos a zonas de memoria sensibles que en
otros lenguajes como C y C++ podan suponer peligros importantes, se han eliminado en
Java.
Ensegundolugar,elcdigoJavaescomprobadoyverificadoparaevitarquedeterminadas
seccionesdelcdigoproduzcanefectosnodeseados.Lostestqueseaplicangarantizanque
lasoperaciones,operandos,conversiones,usodeclasesydemsaccionessonseguras.
Y en tercer lugar, Java no permite la apertura de ficheros en la mquina local, tampoco
permiteejecutarningunaaplicacinnativadeunaplataformaeimpidequeseutilicenotros
ordenadores como puente, es decir, nadie puede utilizar nuestra mquina para hacer
peticionesorealizaroperacionesconotra.
Endefinitiva,podemosafirmarqueJavaesunlenguajeseguro.
b. Simplicidad:AunqueJavaestanpotentecomoCoC++,esbastantemssencillo.Poseeuna
curvadeaprendizajemuyrpiday,paraalguienquecomienzaaprogramarenestelenguaje,
leresultarelativamentefcilcomenzaraescribiraplicacionesinteresantes.
SihasprogramadoalgunavezenCoC++encontrarsqueJavateponelascosasmsfciles,
yaquesehaneliminado:laaritmticadepunteros(unpunterooapuntadoresunavariable
quereferenciaunaregindememoria;enotraspalabrasesunavariablecuyovaloresuna
direccinde memoria),losregistros,ladefinicindetipos,lagestindememoria,etc.Con
esta simplificacin se reduce bastante la posibilidad de cometer errores comunes en los
programas. Un programador experimentado en C o C++ puede cambiar a este lenguaje
rpidamenteyobtenerresultadosenmuypocoespaciodetiempo.
Muy relacionado con la simplicidad que aporta Java est la incorporacin de un elemento
muy til como es el Recolector de Basura (Garbagecollector). Permite al programador
liberarse de la gestin de la memoria y hace que ciertos bloques de memoria puedan
reaprovecharse, disminuyendo el nmero de huecos libres (fragmentacin de memoria o
memoria que queda desperdiciada al usar los mtodos de gestin de memoria. Puede ser
internaoexterna.).
Cuando realicemos programas, crearemos objetos, haremos que stos interaccionen, etc.
Todasestasoperacionesrequierendeusodememoriadelsistema,perolagestindesta
ser realizada de manera transparente al programador. Todo lo contrario que ocurra en
otros lenguajes. Podremos crear tantos objetos como solicitemos, pero nunca tendremos
que destruirlos. El entorno de Java borrar los objetos cuando determine que no se van a
utilizarms.Esteprocesoesconocidocomorecoleccindebasura.

Autoevaluacin
Rellena los huecos con los conceptos adecuados:

24

DesarrollodeApllicacionesW
Web

Tema3

En Jaava se ha siimplificadoo la gestin de memoria a travs de


d la eliminnacin de la Aritmticaa
de

punteros

, por lo quee la incorpooracin del GarbageCoollector evita que se produzca


p
unn

creciimiento de los huecoos libres enn memoria,, que recibbe el nombbre de


mem
moria.

fra
agmentacin

dee

7.6.Javaylo
osBytecod
des.
Un programa
p
esscrito en Jaava no es directamente
d
e ejecutablee, es
necessario que el
e cdigo fuente sea in
nterpretado por la Maq
quina
VirtualJava.Culessonlosp
pasosqueseesiguendesd
dequesegeenera
el c
digo fuente hasta que se ejecuta?? A continuaacin se dettallan
cadaunodeelloss.
Unavvezescritoeelcdigofuente(archivossconextenssin.Java),ste
esprecompilado generndosseloscdigo
osdebytes,B
Bytecodeso Java
ass)queserninterprettados
Byteccodes(archivvosconexteensin .cla
directtamenteporrlaMaquinaaVirtualJavaaytraducido
osacdigonativo
delaplataformasobrelaqueeseestejeccutandoelprrograma.

Byteccode: Son un
u conjuntoo de instruccciones en lenguaje mquina
m
quee no son esspecficas a
ningn procesaddor o sistem
ma de cmpputo. Un inttrprete de cdigo de bbytes (byteccodes) paraa
una plataforma
p
especfica ser quien los ejecutee. A estos intrpretes
i
tambin se les conocee
comoo Mquinass Virtuales Java
J
o intrp
rpretes Java
a de tiempo de ejecucin.
Enel procesode precompilaccin,existe unverificado
ordecdigo
osdebytesq
queseasegu
urardequee
secumplenlassigguientescon
ndiciones:
9
9
9
9
9

ElcdigosatisfacelassespecificacionesdelaM
MquinaVirttualJava.
Noexisteeamenazaco
ontralainteggridaddelsisstema.
Nosepro
oducendesbordamientossdememoriia.
Losparm
metrosysustipossonad
decuados.
Noexisteenconversion
nesdedatossnopermitid
das.

Para que un byytecode pueeda ser


ejecu
utado en cuaalquier plataaforma,
es imprescindiible que dicha
plataformacuentteconelintrprete
adecu
uado, es decir,
d
la mquina
m
virtuaal especffica para esa
plataforma. En general,
g
la Mquina
M
Virtual Java es un programa de
reduccido tamao
o y gratuito para
todosslossistemaasoperativoss.

25

Introduccinalaprograamacin

DAW

8.- Prrogram
mas en
e Javva.
Caso prcttico
Juan celebrra que BK Programacin
P
n vaya a dessarrollar sus programas en
e un lengua
aje como Jav
va. En
algunas oca
asiones ha asistido
a
a con
ngresos y ferrias de exposiciones de software
s
en las que ha podido
p
intercambia
ar impresione
es con comp
paeros de profesin
p
sob
bre los difere
entes lenguajjes que utiliz
zan en
sus proyecttos. Una gran
n mayora de
estacaba lo fcil
f
y potentte que es pro
ogramar en JJava.
Juan est entusiasmad
do y pregun
nta: Ada
a, cundo em
mpezamos? Tienes c
digo fuente
e para
empezar a ver la sintaxiis? Podrem
mos utilizar allgn entorno
o de desarrolllo profesiona
al?
Ada respon
nde sonriend
do: Manoss a la obra! Mara,
M
prepa
arada? Vam
mos a echarle
e un vistazo a este
fragmento de
d cdigo...

Hasta ahoraa, hemos deescrito el len


nguaje de prrogramacin
n Java, hemo
os hecho un
n recorrido por
p su
historia y nos hemoss instruido sobre su fiilosofa de trabajo, peero te preguntars Cu
undo
empezamossadesarrollarprogramaas?Queleementosform
manpartedeeunprogram
maenJava? Qu
senecesitaparaprogramarenestelenguaje?P
Podemoscre
earprogramaasdediferen
ntetipo?
da vez estam
mos ms ceerca de com
menzar la experiencia co
on el lenguaaje de
No te impaacientes, cad
programacinJava.Inicciaremosnueestrocamino
oconociendocualesson
nloselemen
ntosbsicos deun
maenquedeebemosescrribirelcdiggoylostipossdeaplicaciionesquepu
ueden
programaJava,laform
crearseeneestelenguajee.

8.1.Estrructurade
eunprog
grama.
Enelgrfico
oalquepuedesaccederacontinuacin,seprese
entalaestructurageneraaldeunproggrama
realizadoen
nunlenguajeeorientadoaobjetoscomoesJava.

Vamosaan
nalizarcadau
unodeloselementosqueaparecene
e
endichogrffico:
Publiccla
assClase_P
Principal:
:Todoslosp
programash
handeincluiruna clase ccomoesta.EEsuna

clase generral en la quee se incluyeen todos los dems elem


mentos del programa. EEntre otras cosas,
c
contieneelmtodoofu
uncinmain()querepreesentaalpro
ogramaprinccipal,desdeelquesellevvara
cabolaejeccucindelprrograma.Estaclasepued
deconteneraasuvezotraasclasesdelusuario,peroslo
una puede ser public
c. El nombre del fichero .Java qu
ue contiene el cdigo fu
uente de nu
uestro
programa,ccoincidirco
onelnombreedelaclaseq
queestamossdescribiend
doenestaslneas.

Recomend
dacin
Ten en cu
uenta que Java
J
distin
ngue entre maysculaas y minssculas. Si lee das a la clase
principal el nombrre PrimerP
Programa, el archivo
o .Java tendr como identificcador
PrimerPro
ograma.Jav
va,queesto
otalmented
diferenteaprimerpro
ograma.Javaa.Adems,para

26

DesarrollodeAplicacionesWeb

Tema3

Java los elementos PrimerPrograma y primerprograma seran considerados dos clases


diferentesdentrodelcdigofuente.
9 publicstaticvoidmain (String[] args): Es el mtodo que representa al
programa principal, en l se podrn incluir las instrucciones que estimemos
oportunasparalaejecucindelprograma.Desdelsepodrhacerusodelresto
declasescreadas.TodoslosprogramasJavatienenunmtodomain.
9 Comentarios:Loscomentariossesuelenincluirenelcdigofuentepararealizar
aclaraciones,anotacionesocualquierotraindicacinqueelprogramadorestime
oportuna.Estoscomentariospuedenintroducirsededosformas,con//ycon/*
*/.Conlaprimeraformaestaramosestableciendounanicalneacompletade
comentario y, con la segunda, con /* comenzaramos el comentario y ste no
terminarahastaquenoinsertramos*/.
9 Bloques de cdigo: son conjuntos de instrucciones que se marcan mediante la
aperturaycierredellaves { }.Elcdigoasmarcadoesconsideradointernoal
bloque.
9 Puntoycoma:aunqueenelejemplonohemosincluidoningunalneadecdigo
que termine con punto y coma, hay que hacer hincapi en que cada lnea de
cdigo ha de terminarcon punto y coma (;). En caso de no hacerlo, tendremos
erroressintcticos.
Autoevaluacin
publicstaticvoidmain (String[] args) es la clase general del programa.
Verdadero.

Falso.

La clase general del programa tiene el formato public class <nombre_clase_general> y todos los programas Java tendrn
una. Dentro de ella podr haber ms clases definidas por el usuario y siempre, deber haber un mtodo main desde el que se ir haciendo
uso del resto de clases definidas.

8.2.ElentornobsicodedesarrolloJava.
YaconocescmoeslaestructuradeunprogramaenJava,pero,qunecesitamosparallevarloala
prctica? La herramienta bsica para empezar a desarrollar aplicaciones en Java es el JDK (Java
DevelopmentKitoKitdeDesarrolloJava),queincluyeuncompiladoryunintrpreteparalneade
comandos.Estosdosprogramassonlosempleadosenlaprecompilacineinterpretacindelcdigo.
Como veremos, existen diferentes entornos para la creacin de programas en Java que incluyen
multitud de herramientas, pero por ahora nos centraremos en el entorno ms bsico, extendido y
gratuito,elJavaDevelopmentKit(JDK).SegnseindicaenlapropiapginawebdeOracle,JDKesun
entorno de desarrollo para construir aplicaciones, applets y componentes utilizando el lenguaje de
programacinJava.Incluyeherramientastilesparaeldesarrolloypruebadeprogramasescritosen
JavayejecutadosenlaPlataformaJava.
As mismo, junto a JDK se incluye una implementacin del entorno de ejecucin Java, el JRE (Java
RuntimeEnvironment)paraserutilizado porelJDK.ElJREincluyelaMquinaVirtualdeJava(MVJ
JVM Java Virtual Machine), bibliotecas de clases y otros ficheros que soportan la ejecucin de
programasescritosenellenguajedeprogramacinJava.

Debesconocer
ParapoderutilizarJDKyJREesnecesariorealizarladescargaeinstalacindestos.Puedes
seguirlospasosdelprocesoacontinuacin:
1. LocalizacinydescargadeJavaSE

27

Introduccinalaprogramacin

DAW

a. En primer lugar accederemos a la pgina web de ORACLE para realizar la


descargadeJavaSE:http://www.oracle.com/es/index.html
b. EnelmentituladoProductosyServiciosseleccionaJava
c. NavegaporlapginaquesetemuestraybuscaObtengasoftwareJavapara
suordenadoryseleccionaJavaSE
d. Enlapginaqueaparece,seleccionalapestaadedescargas(Downloads)
e. PulsasobreelprimerodelosiconosconellogotipodeJava
f. A continuacin, escoge la versin que deseas descargar en funcin de la
plataformasobrelaquetrabajar.Enestecasohemosutilizadolaversinpara
Windows764bits
g. Comenzar la descarga del software seleccionado en la carpeta de destino
queseindique
2. InstalacindeJavaSE
a. LocalizaentuequipolacarpetaenlaquehasdescargadoJavaSEyhazdoble
clicsobreelarchivodeinstalacin
b. Debersescogerlaubicacinenlaqueseinstalarelentornodedesarrollo.Si
nodeseascambiar,existeunaubicacinpordefecto
c. Comenzar entonces la instalacin del entorno de desarrollo (JDK) y del
entornodeejecucin(JRE)
d. Enbrevesmomentoslainstalacinsecompleta
3. Comprobandolainstalacin
a. Ahora es el momento de comprobar si se ha realizado bien la instalacin y
haceralgnltimoajuste.
b. Buscaremos a travs de la lnea de comandos el directorio o carpeta donde
hemosinstaladoJavaSE.
c. Dentro de la carpeta bin haremos una llamada al compilador de Java,
medianteelcomandojavac
d. Ennuestrocaso,larutadelacarpetaencuestines:
C:\ProgramFiles\Java\jdk1.6.0_25\bin
ParapoderdesarrollarnuestrosprimerosprogramasenJavaslonecesitaremosuneditordetexto
planoyloselementosqueacabamosdeinstalaratravsdeJavaSE.

Autoevaluacin
Podemos desarrollar programas escritos en Java mediante un editor de textos y a travs del
JRE podremos ejecutarlos.
Verdadero.

Falso.

Efectivamente, JRE incluye un subconjunto de JDK que permitira realizar la compilacin del cdigo fuente y la ejecucin posterior en la
Mquina Virtual Java de nuestro programa

8.3.LaAPIdeJava.
Junto con el kit de desarrollo que hemos descargado e instalado anteriormente, vienen incluidas
gratuitamente todas las bibliotecas de la API (AplicationProgramming Interface Interfaz de
programacin de aplicaciones) de Java, es lo que se conoce como Bibliotecas de Clases Java. Este
conjuntodebibliotecasproporcionaalprogramadorpaquetesdeclasestilesparalarealizacinde
mltiplestareasdentrodeunprograma.Estorganizadaenpaqueteslgicos,dondecadapaquete
contiene un conjunto de clases relacionadas semnticamente (Referencia a los aspectos del
significado,sentidoointerpretacindelsignificadodeundeterminadoelemento,smbolo,palabra,
expresin o representacin formal. En principio cualquier medio de expresin (lenguaje formal o

28

DesarrollodeAplicacionesWeb

Tema3

natural) admite una correspondencia entre expresiones de smbolos o palabras, y situaciones o


conjuntos de cosas que se encuentran en el mundo fsico o abstracto, que puede ser descrito por
dichomediodeexpresin).
Endcadaspasadasunabibliotecaeraunconjuntodeprogramasquecontenancientosderutinas
(una rutina es un procedimiento o funcin bien verificados, en determinado lenguaje de
programacin).Lasrutinasdebibliotecamanejabanlastareasquetodosocasitodoslosprogramas
necesitaban.Elprogramadorpodarecurriraestabibliotecaparadesarrollarprogramasconrapidez.
Unabibliotecadeclasesesunconjuntodeclasesdeprogramacinorientadaaobjetos.Esasclases
contienenmtodosquesontilesparalosprogramadores.EnelcasodeJavacuandodescargamosel
JDKobtenemoslabibliotecadeclasesAPI.UtilizarlasclasesymtodosdelasAPIsdeJavareduceel
tiempodedesarrollodelosprogramas.Tambin,existendiversasbibliotecasdeclasesdesarrolladas
portercerosquecontienencomponentesreutilizablesdesoftware,yestndisponiblesatravsdela
Web.

Parasaberms
SiquieresaccederalainformacinoficialsobrelaAPIdeJava,teproponemoselsiguiente
enlace(estenIngls).
http://www.oracle.com/technetwork/Java/Javase/documentation/apijsp136079.html

Autoevaluacin
Indica qu no es la API de Java:
Un entorno integrado de desarrollo.
Un conjunto de bibliotecas de clases.
Una parte del JDK, incluido en el Java SE.
En efecto, la API de Java es utilizada para la creacin de programas pero no ofrece las herramientas de desarrollo que un IDE posee.

8.4.Afinandolaconfiguracin.
Para que podamos compilar y ejecutar ficheros Java es necesario que realicemos unos pequeos
ajustes en la configuracin del sistema. Vamos a indicarle dnde encontrar los ficheros necesarios
pararealizarlaslaboresdecompilacinyejecucin,enestecasoJavac.exey Java.exe,ascomo
laslibrerascontenidasenlaAPIdeJavaylasclasesdelusuario.
La variable PATH: Como an no disponemos de un IDE (IntegratedDevelopmentEnvironment
Entono Integrado de Desarrollo) la nica forma de ejecutar programas es a travs de lnea de
comandos.Peroslopodremosejecutarprogramasdirectamentesilarutahaciaellosestindicada
en la variable PATH del ordenador. Es necesario que incluyamos la ruta hacia estos programas en
nuestravariablePATH.EstarutaserellugardondeseinstalelJDKhastasudirectoriobin.
Paraello,siguelasindicacionesquetemostramosacontinuacin:

Cmo
configurar
la variable
PATH

1DebemosaccederalacarpetadeinstalacindelJDKparaencontrarenbinlos
archivosjavac.exeyjava.exe
Enestecaso,larutaes:C:\ArchivosdePrograma\Java\jdk1.6.0_25\bin
2Tecleaenunaterminaldecomandoslosiguiente:setPATH
Debesobtenerelconjuntoderutasalojadasenestavariabledelsistema.
3 Pulsa con botn derecho sobre MiPC o Equipo (dependiendo de la versin de
Windows)yseleccionaPropiedades.

29

Introduccinalaprogramacin

DAW

Accede a Opciones Avanzadas o Configuracin Avanzadas del sistema,


Variablesdeentorno
4 BuscalavariablePATHYPULSASOBRE ELBOTNEditar.Enelcampodetexto
Cmo
Valordevariabledebesposicionartealfinaldelcontenido,escribeunpuntoy
configurar
coma;yaadelarutahaciaelcompilador
la variable
Nohayqueaadirningnespacioenblancoparalaseparacin,sloelpuntoy
PATH
coma.HazclicenAceptarparaconfirmarelcambio
Finalmente, si realizamos la llamada al compilador desde la consola de comandos
directamente,deberafuncionarsinproblemas.Tecleaelcomandojavacpara
ello.

Parasaberms
SideseasconocermssobrelaconfiguracindevariablesdeentornoensistemasWindows
yLinux,teproponemoslossiguientesenlaces:
http://www.menoscero.com/content/configurarpathwindows7
http://www.guiaubuntu.org/index.php?title=Java
LavariableCLASSPATH:estavariabledeentornoestablecedndebuscarlasclasesobibliotecasdela
APIdeJava,ascomolasclasescreadasporelusuario.Esdecir,losficheros.classqueseobtienen
una vez compilado el cdigo fuente de un programa escrito en Java. Es posible que en dicha ruta
existan directorios y ficheros comprimidos en los formatos zip o jar que pueden ser utilizados
directamenteporelJDK,conteniendoensuinteriorarchivosconextensinclass.
(Porejemplo:C:\Program Files\Java\jdk1.6.0_25\bin)
Si no existe la variable CLASSPATH debes crearla, para modificar su contenido sigue el mismo
mtodo que hemos empleado para la modificacin del valor de la variable PATH, anteriormente
descrito.TenencuentaquelarutaquedebesincluirserellugardondeseinstalelJDKhastasu
directoriolib.
(Porejemplo:C:\Program Files\Java\jdk1.6.0_25\lib)

Autoevaluacin
Qu variable de sistema o de entorno debemos configurar correctamente para que podamos
compilar directamente desde la lnea de comandos nuestros programas escritos en lenguaje
Java?
CLASSPATH.
PATH.
Javac.exe.
Efectivamente, esta es la variable de entorno que modificaremos aadiendo a su contenido la ruta hasta el directorio bin donde est
instalado el JDK.

8.5.Codificacin,compilacinyejecucindeaplicaciones.
Una vez que la configuracin del entorno Java est completada y tenemos el cdigo fuente de
nuestro programa escrito en un archivo con extensin .Java, la compilacin de aplicaciones se
realizamedianteelprogramaJavacincluidoenelsoftwarededesarrollodeJava.

30

DesarrollodeAplicacionesWeb

Tema3

Para llevar a cabo la compilacin desde la lnea de comandos, escribiremos:


javacarchivo.java

Donde javac es el compilador de Java y archivo.java es nuestro cdigo fuente.


ElresultadodelacompilacinserunarchivoconelmismonombrequeelarchivoJavaperoconla
extensin class.Estoyaeselarchivoconelcdigoenformadebytecode.Esdecirconelcdigo
precompilado. Si en el cdigo fuente de nuestro programa figuraran ms de una clase, veremos
como al realizar la compilacin se generarn tantos archivos con extensin .class como clases
tengamos. Adems, si estas clases tenan mtodo main podremos ejecutar dichos archivos por
separadoparaverelfuncionamientodedichasclases.
Paraqueelprogramapuedaserejecutado,siempreycuandoestincluidoensuinteriorelmtodo
main,podremosutilizarelintrpreteincluidoenelkitdedesarrollo.

La ejecucin de nuestro programa desde la lnea de comandos podremos hacerla escribiendo:


javaarchivo.class

Donde java es el intrprete y archivo.class es el archivo con el cdigo precompilado.

Ejercicio resuelto
Vamosallevaralaprcticatodoloquehemosestadodetallandoatravsdelacreacin,
compilacinyejecucindeunprogramasencilloescritoenJava.
Observa el cdigo que se muestra ms abajo, seguro que podrs entender parte de l.
Cpialo en un editor de texto, respetando las maysculas y las minsculas. Puedes
guardar el archivo con extensin .Java en la ubicacin que prefieras. Recuerda que el
nombredelaclaseprincipal(enelcdigodeejemplo MiModulo)debeserexactamente
igualaldelarchivoconextensin .Java,sitienesestoencuentalaaplicacinpodrser
compiladacorrectamenteyejecutada.
/**
* La clase MiModulo implementa una aplicacin que
* simplemente imprime "Mdulo profesional - Programacin" en pantalla.
*/
classMiModulo {
publicstaticvoidmain(String[] args) {
System.out.println("Mduloprofesional -Programacin");
// Muestra la cadena de caracteres.
}
}

Accedealalneadecomandosyteclea,enlacarpetadondehasguardadoelarchivoJava,
elcomandoparacompilarlo:javacMiModulo.java
El compilador genera entonces un fichero de cdigo de bytes: MiModulo.class. Si
visualizasahoraelcontenidodelacarpetaversqueenellaestelarchivo .Javayuno
o varios (depende de las clases que contenga el archivo con elcdigo fuente)archivos
.class.

31

Introduccinalaprogramacin

DAW

Finalmente, para realizar la ejecucin del programa debes utilizar la siguiente


sentencia:
java MiModulo.java
Sitodohaidobien,versescritoenpantalla: Mdulo profesional Programacin.

8.6.TiposdeaplicacionesenJava.
La versatilidad del lenguaje de programacin Java permite al programador crear distintos tipos de
aplicaciones.Acontinuacin,describiremoslascaractersticasmsrelevantesdecadaunodeellos:
9

32

Aplicacionesdeconsola:
Sonprogramasindependientesaligualqueloscreadosconloslenguajestradicionales.
Secomponencomomnimodeun archivo .classquedebecontarnecesariamentecon
elmtodomain.
NonecesitanunnavegadorwebyseejecutancuandoinvocamoselcomandoJavapara
iniciarlaMquinaVirtualdeJava(JVM).Denoencontrarseelmtodo mainlaaplicacin
nopodrejecutarse.
Lasaplicacionesdeconsolaleenyescribenhaciaydesdelaentradaysalidaestndar,sin
ningunainterfazgrficadeusuario.
Aplicacionesgrficas:
Aquellasqueutilizanlasclasesconcapacidadesgrficas,comoSwingqueeslabiblioteca
paralainterfazgrficadeusuarioavanzadadelaplataformaJavaSE.
Incluyenlasinstrucciones import,queindicanalcompiladordeJavaquelasclasesdel
paquetejavax.swingseincluyanenlacompilacin.
Applets:
Sonprogramasincrustadosenotrasaplicaciones,normalmenteunapginawebquese
muestraenunnavegador.Cuandoelnavegadorcargaunawebquecontieneunapplet,
ste se descarga en el navegador web y comienza a ejecutarse. Esto nos permite crear
programasquecualquierusuariopuedeejecutarcontansolocargarlapginawebensu
navegador.
Se pueden descargar de Internet y se observan en un navegador. Los applets se
descargan junto con una pgina HTML desde un servidor web y se ejecutan en la
mquinacliente.
Notienenaccesoapartessensibles(porejemplo:nopuedenescribirarchivos),amenos
queunomismoledlospermisosnecesariosenelsistema.
Notienenunmtodoprincipal.
SonmultiplataformaypuedenejecutarseencualquiernavegadorquesoporteJava.
Servlets:
SoncomponentesdelapartedelservidordeJavaEE,encargadosdegenerarrespuestas
alaspeticionesrecibidasdelosclientes.
Losservlets,alcontrariodelosapplets,sonprogramasqueestnpensadosparatrabajar
enelladodelservidorydesarrollaraplicacionesWebqueinteractenconlosclientes.
Midlets:
Son aplicaciones creadas en Java para su ejecucin en sistemas de propsito simple o
dispositivosmviles.LosjuegosJavacreadosparatelfonosmvilessonmidlets.
Son programas creados para dispositivos embebidos (se dedican a una sola actividad),
msespecficamenteparalamquinavirtualJavaMicroEdition(JavaME).

DesarrollodeAplicacionesWeb

Tema3

Generalmentesonjuegosyaplicacionesqueseejecutanentelfonosmviles.

Autoevaluacin
Un Applet es totalmente seguro ya que no puede acceder, en ningn caso, a zonas sensibles
del sistema. Es decir, no podra borrar o modificar nuestros archivos.
Verdadero.

Falso.

Los Applets podran acceder a zonas sensibles de nuestro sistema si les diramos permisos para hacerlo. Pero si no est firmado como
confiable, tiene un acceso limitado al sistema del usuario.

33

Introduccinalaprogramacin

DAW

9.- Entornos Integrados de Desarrollo (IDE).


Caso prctico
Ada, Juan y Mara estn navegando por Internet buscando informacin sobre herramientas que les
faciliten trabajar en Java. Ada aconseja utilizar alguno de los entornos de desarrollo integrado
existentes, ya que las posibilidades y rapidez que ofrecen, aumentaran la calidad y reduciran el
tiempo requerido para desarrollar sus proyectos.
Juan, que est chateando con un miembro de un foro de programadores al que pertenece, corrobora
lo que Ada recomienda.

En los comienzos de Java la utilizacin de la lnea de comandos era algo habitual. El programador
escriba el cdigo fuente empleando un editor de texto bsico, seguidamente, pasaba a utilizar un
compilador y con l obtena el cdigo compilado. En un paso posterior, necesitaba emplear una
terceraherramientaparaelensambladodelprograma.Porltimo,podaprobaratravsdelalnea
de comandos el archivo ejecutable. El problema surga cuando se produca algn error, lo que
provocabatenerquevolverainiciarelprocesocompleto.
Estas circunstancias hacan que el desarrollo de software no estuviera optimizado. Con el paso del
tiempo,sefuerondesarrollandoaplicacionesqueincluanlasherramientasnecesariaspararealizar
todo el proceso de programacin de forma ms sencilla, fiable y rpida. Para cada lenguaje de
programacinexistenmltiplesentornosdedesarrollo,cadaunoconsusventajaseinconvenientes.
Dependiendodelasnecesidadesdelapersonaquevaaprogramar,lafacilidaddeusooloagradable
queleresultetrabajarconl,seelegirentreunosuotrosentornos.
ParaellenguajedeprogramacinJavaexistenmltiplesalternativas,siendolosprincipalesentornos
de desarrollo NetBeans (que cuenta con el apoyo de la empresa Sun), Eclipse y JCreator. Los dos
primerossongratuitos,consoportedeidiomasymultiplataforma(Windows,Linux,MacOS).
Yculserconelquevamosatrabajar?Elentornoquehemosseleccionadollevaracabonuestros
desarrollosdesoftwareenestemduloprofesionalserNetBeans,alhabersidoconstruidoporla
mismacompaaquecreJava,serdecdigoabiertoyofrecercapacidadesprofesionales.Aunque,
notepreocupes,tambinharemosunrecorridoporotrosentornosdestacables.

9.1.Quson?
Son aplicaciones que ofrecen la posibilidad de llevar a cabo el proceso completo de desarrollo de
software a travs de un nico programa. Podremos realizar las labores de edicin, compilacin,
depuracin, deteccin de errores, correccin y ejecucin de programas escritos en Java oen otros
lenguajes de programacin, bajo un entorno grfico (no mediante lnea de comandos). Junto a las
capacidadesdescritas,cadaentornoaadeotrasqueayudanarealizarelprocesodeprogramacin,
comoporejemplo:cdigofuentecoloreado,plantillasparadiferentestiposdeaplicaciones,creacin
deproyectos,etc.
Hayquetenerencuentaqueunentornodedesarrollonoesmsqueunafachadaparaelprocesode
compilacinyejecucindeunprograma.Ququieredecireso?Puesquesitenemosinstaladoun
IDEynotenemosinstaladoelcompilador,notenemosnada.

34

DesarrollodeAplicacionesWeb

Tema3

Parasaberms
Si deseas conocer algo ms sobre lo que son los Entornos Integrados de Desarrollo (IDE)
accedealasdefinicionesqueteproponemosacontinuacin:
http://programaciondesarrollo.es/queesunentornodedesarrollointegradoide/
http://es.wikipedia.org/wiki/Entorno_de_desarrollo_integrado

9.2.IDE'sactuales.
Existen en el mercado multitud de entornos de desarrollo para el lenguaje Java, los hay de libre
distribucin,depago,paraprincipiantes,paraprofesionales,queconsumen msrecursos,queson
msligeros,msamigables,mscomplejosqueotros,etc.
Entrelosquesongratuitosodelibredistribucintenemos:
9 NetBeans
9 Eclipse
9 BlueJ
9 Jgrasp
9 JcreatorLE
Entrelosquesonpropietariosodepagotenemos:
9 IntelliJIDEA
9 Jbuilder
9 Jcreator
9 JDeveloper

Debesconocer
Cada uno de los entornos nombrados ms arriba posee caractersticas que los hacen
diferentesunosdeotros,peroparatenerunaideageneraldelaversatilidadypotenciade
cadaunodeellos,miralasiguientetablacomparativa:

Ma
Window Linu c Otherplatform GUI
s
x OS
s
builder
X

IDE

License

JVM

BlueJ

GPL2+GNU
linkingexception

Yes

Yes

Yes Yes

Solaris

No

DrJava

Permissive

Yes

Yes

Yes Yes

Solaris

No

EclipseJDT

EPL

Yes

Yes

Yes Yes

Solaris

Yes

Geany

GPL

No

Yes

Yes Yes

Solaris

No

Greenfoot

GPL

Yes

Yes

Yes Yes

Solaris

No

IntelliJIDEA

ALv2,proprietary

Yes

Yes

Yes Yes

Yes

JBuilder

Proprietary

Yes

Yes

Yes Yes

Solaris

Yes

35

Introduccinalaprogramacin

DAW

IDE

License

JVM

JCreator

Proprietary

No

Ma
Window Linu c Otherplatform GUI
s
x OS
s
builder
X
Yes

No

No

No

JDeveloper

ProprietaryOTNJDevelop
erLicense(freeware)

Yes

Yes

Yes Yes

jGRASP

Proprietary(freeware)

Yes

Yes

Yes Yes

genericJVM

Yes
No

KDevelop

GPL

No

No

Yes No

MyEclipse

Proprietary

Yes

Yes

Yes Yes

Solaris

Unknow
n
Yes

NetBeans

CDDL,GPL2

Yes

Yes

Yes Yes

Solaris

Yes

RationalApplicationDevelop
er

Proprietary

Yes

Yes

Yes No

Solaris,AIX

Yes

Servoy

Proprietary

Unknow
n

Yes

Yes Yes

Solaris

Yes

Xcode

Proprietary

No

No

No Yes

Yes

Pero,culoculessonlosmsutilizadosporlacomunidaddeprogramadoresJava?Elpuestode
honorselodisputanentreEclipse,IntelliJIDEAyNetBeans.Enlossiguientesepgrafesharemosuna
descripcin de NetBeans y Eclipse, para posteriormente desarrollar los puntos claves del entorno
NetBeans.

Parasaberms
Siquieresconocerlasituacinactualdeusoycompararlosdiferentesentornosintegrados
dedesarrolloparaellenguajedeprogramacinJava,puedesampliardatosenelsiguiente
artculo:
http://www.infoworld.com/d/developerworld/infoworldreviewtopJavaprogrammingtools
191?page=0,0
Para acceder a los lugares de Internet donde obtener los diferentes entornos integrados de
desarrollo,puedesutilizarlalistaqueteofrecemosenesteenlace:
http://casidiablo.net/ideJava/

Autoevaluacin
Cul de los siguientes entornos slo est soportado en la plataforma Windows?
Eclipse.
Intellij IDEA.
Jcreator.

36

DesarrollodeAplicacionesWeb

Tema3

Este entorno, adems de ser de pago, slo es soportado en la plataforma Windows. No incorpora un entorno visual de desarrollo.

9.3.ElentornoNetBeans.
Comosehaindicadoanteriormente,elentornodedesarrolloquevamosautilizaralolargodelos
contenidos del mdulo profesional ser NetBeans. Por lo que vamos primero a analizar sus
caractersticasydestacarlasventajasquepuedeaportarsuutilizacin.
SetratadeunentornodedesarrolloorientadoprincipalmenteallenguajeJava,aunquepuedeservir
paraotroslenguajesdeprogramacin.Esunproductolibreygratuitosinrestriccionesdeuso.Esun
proyecto de cdigo abierto de gran xito, con una comunidad de usuarios numerosa, en continuo
crecimientoyapoyadoporvariasempresas.
ElorigendeesteentornohayquebuscarloenunproyectorealizadoporestudiantesdelaRepblica
Checa.FueelprimerIDEcreadoenlenguajeJava.Untiempomstarde,seformunacompaaque
seracompradaen1999porSunMicrosystems(quienhabacreadoellenguajeJava).Pocodespus,
Sun decidi que el producto sera libre y de cdigo abierto y naci Netbeans como IDE de cdigo
abiertoparacrearaplicacionesJava.
NetBeansllevatiempopugnandoconEclipseporconvertirseenlaplataformamsimportantepara
crearaplicacionesenJava.Hoyendaesunproductoenelqueparticipandecenasdeempresascon
Sunalacabeza.Siguesiendosoftwarelibreyofrecelassiguientesposibilidades:
9 EscribircdigoenC,C++,Ruby(Lenguajedeprogramacininterpretado,reflexivoyorientadoaobjetos.Su
implementacin oficial es distribuida bajo una licencia de software libre),Groovy(Lenguaje de programacin
orientado a objetos implementado sobre la plataforma Java. Desde Groovy se puede acceder directamente a
todaslasAPIexistentesenJava.Elbytecodegeneradoenelprocesodecompilacinestotalmentecompatiblecon
el generado por el lenguaje Java para la Java Virtual Machine (JVM), por tanto puede usarse directamente en
cualquier aplicacin Java. Todo lo anterior unido a que la mayor parte de cdigo escrito en Java es totalmente
vlido en Groovy hacen que este lenguaje sea de muy fcil adopcin para programadores Java), Javascript

(Lenguaje de programacin interpretado. Se utiliza principalmente en su forma del lado del cliente (clientside),
implementado como parte de un navegador web permitiendo mejoras en la interfaz de usuario y pginas web
dinmicas. Todos los navegadores modernos interpretan el cdigo JavaScript integrado en las pginas web),

CSS(Hojas de estilo en cascada (en ingls Cascading Style Sheets), CSS es un lenguaje usado para definir la
presentacin de un documento estructurado escrito en HTML o XML.)y PHP(Lenguaje de programacin
interpretado,diseadooriginalmenteparalacreacindepginaswebdinmicas.Esusadoprincipalmenteparala
interpretacindelladodelservidor(serversidescripting),peroactualmentepuedeserutilizadodesdeunainterfaz
delneadecomandos,oenlacreacindeotrostiposdeprogramas,incluyendoaplicacionesconinterfazgrfica
usandolasbibliotecasQtoGTK+)ademsdeJava.
9 Permitir crear aplicaciones J2EE gracias a que incorpora servidores de aplicaciones Java
(actualmente Glassfish(Servidor de aplicaciones de software libre desarrollado por Sun Microsystems, que
implementa las tecnologas definidas en la plataforma Java EE y permite ejecutar aplicaciones que siguen esta
especificacin.)yTomcat(FuncionacomouncontenedordeservletsdesarrolladobajoelproyectoJakartaenla
ApacheSoftwareFundation.TomcatimplementalasespecificacionesdelosservletsydeJavaServerPagesdeSun
Microsystems.Seleconsideraunservidordeaplicaciones,hayquetenerencuentaqueTomcatpuedeutilizarse
comoservidorwebindependiente,obiencomounaextensindelservidorwebyainstalado)

9 Crear aplicaciones Swing(Es una biblioteca grfica para Java. Incluye elementos para interfaz grfica de
usuariotalescomocajasdetexto,botones,desplegablesytablas)deformasencilla,alestilodelVisual
StudiodeMicrosoft.
9 CrearaplicacionesJMEparadispositivosmviles.

37

Introduccinalaprogramacin

Laltimaversinlanzadaen2011eslaNetBeans7.0.

DAW

LaplataformaNetBeanspermitequelasaplicacionesseandesarrolladasapartirdeunconjuntode
componentesdesoftwarellamadosmdulos.UnmduloesunarchivoJavaquecontieneclasesde
Java escritas para interactuar con las APIs de NetBeans y un archivo especial (manifest file) que lo
identificacomomdulo.
Las aplicaciones construidas a partir de mdulos pueden ser extendidas agregndole nuevos
mdulos.Debidoaquelosmdulospuedenserdesarrolladosindependientemente,lasaplicaciones
basadasenestaplataformapuedenserextendidasfcilmenteporcualquieraquedesarrolletambin
software.
Cada mdulo provee una funcin bien definida, tales como el soporte de Java, edicin, o soporte
para el sistema de control de versiones. NetBeans contiene todos los mdulos necesarios para el
desarrollodeaplicacionesJavaenuna soladescarga,permitiendoalapersonaquevaarealizarel
programacomenzaratrabajarinmediatamente.

Parasaberms
Encuentra ms informacin sobre esta plataforma en los enlaces que te proponemos a
continuacin:
http://netbeans.org/index_es.html
http://es.wikipedia.org/wiki/NetBeans#Versiones

9.4.Instalacinyconfiguracin.
PararealizarlainstalacindelentornoNetBeans,seguiremoslossiguientespasosbsicos:
1. Descarga de la versin deseada desde la web oficial o desde los enlaces propuestos ms
abajo.Laversincompletacontienetodaslasposibilidadesaunqueeslamspesada(unos
240 MegaBytes). En nuestro caso, por estar en fase de iniciacin, podra ser suficiente
descargarlaversinmsbsica(unos60MegaBytes).
2. Seleccionar la plataforma o sistema operativo, existen versiones para Windows, Linux y
MacOS.TantoenWindowscomoenLinux,sedescargaunarchivoejecutablequeseencarga
delainstalacin.
3. Seleccionarelidioma.
4. Comenzarladescargadelarchivodeinstalacinejecutableyunavezfinalizada,lanzarste,
comenzandolainstalacinennuestroequipo.
5. Enlasprimeraspantallas,seleccionaremosloscomponentesainstalar.Comomnimo,para
poderprogramarenJavaserimprescindibleinstalarelIDEbsicoyJavaSE.
6. Posteriormente,establecemoseldirectoriodondeseinstalarNetBeans,ascomolacarpeta
quecontieneelJDKqueseutilizarpordefecto.
7. Finalmente, la instalacin se completa y dispondremos de este entorno totalmente
operativo.
Para llevar a cabo las operaciones descritas en el paso 1, te ofrecemos la posibilidad de descargar
cadaunadelaspartesporseparado,obien,enconjunto,atravsdelossiguientesenlaces:

Descarga nicamente NetBeans si tienes ya instalado el JDK. (Esta versin an no incluye


lenguaje Espaol)

38

DesarrollodeAplicacionesWeb

Tema3

Descarga slo NetBeans en Espaol, sin JDK


Descarga NetBeans y JDK desde la pgina oficial de ORACLE
Debesconocer
Para aprender cmo realizar la instalacin completa, JDK y NetBeans, en sus ltimas
versionesesimportantequesigaslasindicacionesquesemuestranenelsiguienteartculo:
http://jtagua.wordpress.com/2011/05/01/descarga-e-instalacion-separada-de-jdk-6-update-25y-netbeans-7-0/

9.5.Aspectodelentornoygestindeproyectos.
La pantalla inicial de nuestro entorno de desarrollo ofrece accesos directos a las operaciones ms
usuales: aprendizaje inicial, tutoriales, ejemplos, demos, los ltimos programas realizados y las
novedadesdelaversin.
Paracomenzaradescribirelaspectodelentorno,esnecesariocrearunnuevoproyectoaccediendo
almenFileNewProject,indicaremoseltipodeaplicacinquevamosacrear.

Debesconocer
Cuando trabajemos con NetBeans, nuestros proyectos harn uso de clases para poder
desarrollarlasoperacionesdenuestrosprogramas.Estasclasesseagruparnenpaquetes.
Creacindenuevospaquetes
Generalmentelasclasesseagrupanenpaquetes.Esrecomendablequecadaproyecto
tenga al menos un paquete, si no fuera as, las clases se crearan en el paquete por
defecto,loquenoesadecuado
Creacindenuevasclases
Podremos crearla pulsando con botn derecho sobre el paquete en el que vamos a
almacenar la clase y seleccionando New > Java Class. Inicialmente nuestros proyectos
contendrnunaclaseprincipal,perosegnvayamosaprendiendomssobreellenguaje
Java iremos necesitando ms y ms clases (agrupadas en paquetes) en cada uno de
nuestrosproyectos.
Una de las ventajas que ofrece este entorno es poder examinar nuestros proyectos a travs de la
vista Archivos. Esta vista nos ensea la realidad de los archivos del proyecto, la carpeta build
contienelosarchivoscompilados(.class),lacarpeta srcelcdigofuenteyelresto,sonarchivos
creadosporNetbeansparacomprobarlaconfiguracindelproyectoolosarchivosnecesariosparala
correctainterpretacindelcdigoenotrossistemas(encualquiercasonohayqueborrarlos).Para
activarestavista,seleccionaenelmenprincipalWindowsFiles.

Autoevaluacin
Rellena los huecos con los conceptos adecuados:
En NetBeans, los archivos .class de un proyecto estn alojados en la carpeta
.java en la carpeta

src

build

y los

39

DesarrollodeAplicacionesWeb

Tema2

INDICE

1Introduccin...................................................................................................................................2
2Lasvariableseidentificadores......................................................................................................4
2.1Identificadores.......................................................................................................................................4
2.2Normasdeestiloparanombrarvariables..................................................................................................5
2.3Palabrasreservadas...............................................................................................................................6
2.4Tiposdevariables.ConstantesI..............................................................................................................7
2.5Tiposdevariables.ConstantesII................................................................................................................8
Creandonuestroprimerprograma.............................................................................................................................9
3.Lostiposdedatos..........................................................................................................................11
3.1TiposdedatosprimitivosI......................................................................................................................12
http://platea.pntic.mec.es/~lgonzale/tic/binarios/aritmetica.html.............................................................13
3.2TiposdedatosprimitivosII......................................................................................................................13
3.3Declaracineinicializacin.....................................................................................................................15
3.4Tiposreferenciados.................................................................................................................................16
3.5Tiposenumerados...................................................................................................................................17
4.Literalesdelostiposprimitivos.....................................................................................................19
5.Operadoresyexpresiones.............................................................................................................21
5.1Operadoresaritmticos..........................................................................................................................21
5.2Operadoresdeasignacin.......................................................................................................................22
5.3Operadorcondicional..............................................................................................................................23
5.4Operadoresderelacin...........................................................................................................................24
5.5Operadoreslgicos.................................................................................................................................25
5.6Operadoresdebits..................................................................................................................................25
5.7Trabajoconcadenas...............................................................................................................................26
5.8Precedenciadeoperadores....................................................................................................................27
6.Conversindetipo........................................................................................................................29
6.1ConversindetiposdedatosenJava...................................................................................................30
6.1.1ReglasdePromocindeTiposdeDatos..........................................................................................................30
6.1.2ConversindenmerosenComaflotante(float,double)aenteros(int)......................................................31
6.1.3Conversionesentrecaracteres(char)yenteros(int)......................................................................................31
6.1.4Conversionesdetipoconcadenasdecaracteres(String)...............................................................................31
7.Comentarios..................................................................................................................................32

Creacindemiprimerprograma

DAW

Creacindemiprimerprograma
Caso Prctico
Todos los lenguajes de programacin estn constituidos por elementos concretos que permiten
realizar las operaciones bsicas del lenguaje, como tipos de datos, operadores e instrucciones. Estos
conceptos deben ser dominados por el programador con objeto de incorporarse con ciertas garantas
a un equipo de programacin. Debemos tener en cuenta que los programas trabajan con datos, los
cuales almacenan en memoria y son posteriormente usados para la toma de decisiones en el
programa.
En esta unidad se introducen los distintos tipos de datos que se pueden emplear en Java. En
concreto, se vern los tipos primitivos en Java, as como las variables y las constantes. En posteriores
captulos veremos otros elementos bsicos del lenguaje, incluyendo estructuras de datos ms
sofisticadas.
Mara y Juan han formado equipo para desarrollar una aplicacin informtica para una clnica
veterinaria. Ada ha convocado una reunin con el cliente para concretar los requerimientos de la
aplicacin, pero lo que est claro es que debe ser multiplataforma. El lenguaje escogido ha sido Java.
Mara tiene conocimientos de redes y de pginas web pero est floja en programacin. Juan ha
aprendido Java en su ciclo de DAI hace 4 aos.
Lo que hace falta es entender bien los conceptos de programacin orientada a objetos le
comenta Juan a Mara. Todo lo concerniente al mundo real puede ser modelado a travs de
objetos. Un objeto contiene datos y sobre l se hacen operaciones y gira toda la aplicacin.
Mara est entusiasmada con el proyecto, cree que es una buena oportunidad para aprender un
lenguaje de la mano de Juan que se le da bastante bien todo el mundo de la programacin.

1 - Introduccin
Cada vez que usamos un ordenador, estamos ejecutando varias aplicaciones que nos permiten
realizarciertastareas.Porejemplo,ennuestrodaada,usamoselcorreoelectrnicoparaenviary
recibircorreos,oelnavegadorparaconsultarpginasenInternet;ambasactividadessonejemplos
deprogramasqueseejecutanenunordenador.
Los programas de ordenador deben resolver un problema, para lo cual debemos utilizar de forma
inteligenteylgicatodosloselementosquenosofreceellenguaje.Poresoesimportanteelegirun
lenguajedeprogramacinconelquenossintamoscmodosporquelodominemossuficientemente
y, por supuesto, porque sepamos que no va a ofrecer limitaciones a la hora de desarrollar
aplicacionesparadiferentesplataformas.
El lenguaje que vamos a utilizar en este mdulo es Java, multiplataforma, robusto y fiable. Un
lenguaje que reduce la complejidad y se considera dentro de los lenguajes modernos orientados a
objetos.Estaunidadnosvamosaadentrarensusintaxis,vamosaconocerlostiposdedatosconlos
quetrabaja,lasoperacionesquetienendefinidascadaunodeellos,utilizandoejemplossencillosque
nosmuestrenlautilidaddetodoloaprendido.
Paraello,vamosatratarsobrecmosealmacenanyrecuperanlosdatosdevariablesycadenasen
Java, y cmo se gestionan estos datos desde el punto de vista de la utilizacin de operadores.
Trabajar con datos es fundamental en cualquier programa. Aunque ya hayas programado en este
lenguaje,chaleunvistazoalcontenidodeestaunidad,porquepodrsrepasarmuchosconceptos.

PARASABERMS

DesarrollodeAplicacionesWeb

Tema2

Ahora que vamos a empezar con la sintaxis de Java, quizs te interese tener a mano la
documentacinqueofrecelapginawebdeOraclesobreJavaSE.LaplataformaJavaSEest
formada principalmente por dos productos: el JDK, que contiene los compiladores y
depuradoresnecesariosparaprogramar,yelJRE,queproporcionalaslibrerasobibliotecas
ylaJVM,entreotraseriedecomponentes.
Puedes consultar informacin de la versin 6 de Java SE, en el siguiente enlace donde
puedesencontrartodaladocumentacinsobreestatecnologa:
EnlacealawebdeOracledondepodrsverinformacinsobrelaplataformaJavaSE.
http://download.oracle.com/javase/6/docs/index.html
Dentro de la documentacin de Oracle sobre Java SE se encuentra el libro The Java
LanguageSpecification.
Este libro est escrito por los inventores del lenguaje, y constituye una referencia tcnica
casi obligada sobre el mismo. Como mucha de la documentacin oficial de Java, se
encuentraeningls.Elenlacedirectoeselsiguiente:
http://java.sun.com/docs/books/jls/index.html

RECOMENDACIN
Acostmbrate a leer y consultar la documentacin sobre la versin de Java que ests
utilizandoentusprogramas.Esoteayudarasabertodaslasposibilidadesquetieneel
lenguaje,ysienunmomentodadoestsutilizandobienunadeterminadacaracterstica.

Creacindemiprimerprograma

DAW

2 Las variables e identificadores


Caso prctico
Mara y Juan han comprobado que una aplicacin informtica es un trabajo de equipo que debe estar
perfectamente coordinado. El primer paso es la definicin de los datos y las variables que se van a
utilizar.
Las decisiones que se tomen pueden afectar a todo el proyecto, en lo referente al rendimiento de la
aplicacin y ahorro de espacio en los sistemas de almacenamiento.
Despus de la ltima reunin del equipo de proyecto ha quedado claro cules son las
especificaciones de la aplicacin a desarrollar. Juan no quiere perder el tiempo y ha comenzado a
preparar los datos que va a usar el programa. Le ha pedido a Mara que vean juntos qu variables y
tipos de datos se van a utilizar, Juan piensa que le vendr bien como primera tarea para
familiarizarse con el entorno de programacin y con el lenguaje en s.

Unprogramamanejadatosparahacerclculos,presentarloseninformesporpantallaoimpresora,
solicitarlos al usuario, guardarlos en disco, etc. Para poder manejar esos datos, el programa los
guardaenvariables.
Una variable es una zona en la memoria del computador con un valor que puede ser almacenado
paraserusadomstardeenelprograma.Lasvariablesvienendeterminadaspor:

unnombre,quepermitealprogramaaccederalvalorquecontieneenmemoria.Debeserun
identificadorvlido.
untipodedato,queespecificaquclasedeinformacinguardalavariableenesazonade
memoria
unrangodevaloresquepuedeadmitirdichavariable.

Alnombrequeledamosalavariableselellamaidentificador.Losidentificadorespermitennombrar
los elementos que se estn manejando en un programa. Vamos a ver con ms detalle ciertos
aspectossobrelosidentificadoresquedebemostenerencuenta.

CITAS PARA PENSAR


Lasgrandesideasrequierenungranlenguaje.Aristfanes.
PARASABERMS
BruceEckeleselautordeloslibrossobreJavayC++,dirigidosaprogramadoresquedesean
aprendersobreestoslenguajesysobrelaprogramacinorientadaaobjetos.Esteescritorha
tenido la buena costumbre de editar sus libros para que puedan descargarse gratis. As,
podemosaccederdeformatotalmentegratuitaalaterceraedicindesulibroThinkingin
Javaenelsiguienteenlace(eningls):
http://www.mindviewinc.com/Books/downloads.html

A partir de ahora es conveniente que utilices algn manual de apoyo para iniciarte a la
programacinenJava.
TeproponemoseldelaseriedeLibrosAprendaInformticacomosiestuvieraenprimero,
delaEscuelaSuperiordeIngenierosIndustrialesdeSanSebastin(UniversidaddeNavarra):
http://mat21.etsii.upm.es/ayudainf/aprendainf/Java/Java2.pdf

2.1Identificadores
UnidentificadorenJavaesunasecuenciailimitadasinespaciosdeletrasydgitosUnicode,deforma
queelprimersmbolodelasecuenciadebeserunaletra,unsmbolodesubrayado(_)oelsmbolo
dlar($).Porejemplo,sonvlidoslossiguientesidentificadores:

DesarrollodeAplicacionesWeb

x5

Tema2

NUM_MAX

numCuenta

En la definicin anterior decimos que un identificador es una secuencia ilimitada de caracteres


Unicode.PeroquesUnicode?Unicodeesuncdigodecaracteresosistemadecodificacin,un
alfabetoquerecogeloscaracteresdeprcticamentetodoslosidiomasimportantesdelmundo.Las
lneasdecdigoenlosprogramasseescribenusandoeseconjuntodecaracteresUnicode.
EstoquieredecirqueenJavasepuedenutilizarvariosalfabetoscomoelGriego,rabeoJapons.De
estaforma,losprogramasestnmsadaptadosaloslenguajeseidiomaslocales,porloquesonms
significativosyfcilesdeentendertantoparalosprogramadoresqueescribenelcdigo,comopara
los que posteriormente lo tienen que interpretar, para introducir alguna nueva funcionalidad o
modificacinenlaaplicacin.
El estndar Unicode originalmente utilizaba 16 bits, pudiendo representar hasta 65.536 caracteres
distintos, que es el resultado de elevar dos a la potencia diecisis. Actualmente Unicode puede
utilizarmsomenosbits,dependiendodelformatoqueseutilice:UTF8,UTF16UTF32.Acada
carcter le corresponde unvocamente un nmero entero perteneciente al intervalo de 0 a 2
elevadoan,siendonelnmerodebitsutilizadospararepresentarloscaracteres.Porejemplo,la
letraeselentero164.Adems,elcdigoUnicodeescompatibleconelcdigoASCII,yaquepara
loscaracteresdelcdigoASCII,Unicodeasignacomocdigolosmismos8bits,alosquelesaadea
laizquierdaotros8bitstodosacero.LaconversindeuncarcterASCIIaUnicodeesinmediata.

RECOMENDACIN
Una buena prctica de programacin es seleccionar nombres adecuados para las
variables, eso ayuda a que el programa se autodocumente, y evita un nmero excesivo de
comentarios para aclarar el cdigo.
PARASABERMS
Enlace para acceder a la documentacin sobre las distintas versiones de Unicode en la
pginaweboficialdelestndar:
http://www.unicode.org/versions/

2.2Normasdeestiloparanombrarvariables
Alahoradenombrarunidentificadorexistenunaseriedenormasdeestilodeusogeneralizadoque,
nosiendoobligatorias,seusanenlamayorpartedelcdigoJava.Estasreglasparalanomenclatura
devariablessonlassiguientes:

Java distingue las maysculas de las minsculas. Por ejemplo, Alumno y alumno son
variablesdiferentes.
Nosesuelenutilizaridentificadoresquecomiencencon$o_,ademselsmbolodel
dlar,porconvenio,noseutilizanunca.
Nosepuedeutilizarelvalorbooleano(trueofalse)nielvalornulo(null).
Los identificadores deben ser lo ms descriptivos posibles. Es mejor usar palabras
completas en vez de abreviaturas crpticas. As nuestro cdigo ser ms fcil de leer y
comprender. En muchos casos tambin har que nuestro cdigo se autodocumente. Por
ejemplo,sitenemosquedarleelnombreaunavariablequealmacenalosdatosdeuncliente

Creacindemiprimerprograma

DAW

sera recomendable que la misma se llamara algo as como FicheroClientes o


ManejadorCliente,ynoalgopocodescriptivocomoCl33.
Ademsde estasrestricciones,enlasiguientetablapuedesverotrasconvenciones,que nosiendo
obligatorias,ssonrecomendablesalahoradecrearidentificadoresenJava.
Identificador

nombredeunaclase

Convencin
Comienzaporletraminscula,
ysitienenmsdeunapalabra
secolocanjuntasyelresto
comenzandopormaysculas
Enletrasmaysculas,
separandolaspalabrasconel
guinbajo,porconvenioel
guinbajonoseutilizaen
ningnotrositio
Comienzaporletramayscula

nombredefuncin

Comienzaconletraminscula

nombredevariable

nombredeconstante

Ejemplo
numAlumnos, suma

TAM_MAX, PI

String, MiTipo
modifica_Valor,
obtiene_Valor

AUTOEVALUACIN:
Un identificador es una secuencia de uno o ms smbolos Unicode que cumple las
siguientes condiciones. Seala la afirmacin correcta.
Todos los identificadores han de comenzar con una letra, el carcter subrayado (_) o el
carcter dlar ($).
No puede incluir el carcter espacio en blanco.
Puede tener cualquier longitud, no hay tamao mximo.
Todas las anteriores son correctas.
Adems, se desaconseja el uso del smbolo dlar, y el guin bajo prcticamente slo se utiliza para separar palabras en
variables de tipo Constante.

2.3Palabrasreservadas
Las palabras reservadas, a veces tambin llamadas palabras clave o keywords, son secuencias de
caracteres formadas con letras ASCII cuyo uso se reserva al lenguaje y, por tanto, no pueden
utilizarseparacrearidentificadores.
LaspalabrasreservadasenJavason:
Abstract
assert
boolean
break
byte
case
catch
char
class
const

continue
default
do
double
else
enum
extends
final
finally
float

for
goto
if
implements
import
instanceof
int
interface
long
native

new
packages
private
protected
public
return
short
static
strictfp
super

switch
ynchronized
this
throw
throws
transient
try
void
volatile
while

DesarrollodeAplicacionesWeb

Tema2

Haypalabrasreservadasquenoseutilizanenlaactualidad,comoeselcasodeconst ygoto,que
apenas se utilizan en la actual implementacin del lenguaje Java. Por otro lado, puede haber otro
tipodepalabrasotextoenellenguajequeaunquenoseanpalabrasreservadastampocosepueden
utilizar para crear identificadores. Es el caso de true y false que, aunque puedan parecer palabras
reservadas, porque no se pueden utilizar para ningn otro uso en un programa, tcnicamente son
literalesbooleanos.Igualmente,nullesconsideradounliteral,nounapalabrareservada.

DESTACADO
Cuando tras haber consultado la documentacin de Java an no tengas seguridad de
cmo funciona alguna de sus caractersticas, prubala en tu ordenador, y analiza cada
mensaje de error que te d el compilador para corregirlo. Busca en foros de Internet
erroressimilaresparaayudartedelaexperienciadeotrosusuariosyusuarias.
Normalmente, los editores y entornos integrados de desarrollo utilizan colores para diferenciar las
palabras reservadas del resto del cdigo, los comentarios, las constantes y literales, etc. De esta
forma se facilita la lectura del programa y la deteccin de errores de sintaxis. Dependiendo de la
configuracindelentornoseutilizarnunoscoloresuotros,esposibleennegro
PuedequeteinteresecambiarloscoloresqueutilizaNetbeansparalasintaxisdetusprogramas,por
ejemplosiquieresqueloscomentariosaparezcanenverdeenlugardeengris,oindicarquetienesla
autoradelosmismos,enlugardequeteaparezcaelnombredeusuariodelsistemaoperativo.

2.4Tiposdevariables.ConstantesI
En un programa nos podemos encontrar distintos tipos de variables. Las diferencias entre una
variableyotradependerndevariosfactores,porejemplo,eltipodedatosquerepresentan,sisu
valorcambiaonoalolargodetodoelprograma,oculeselpapelquellevanacaboenelprograma.
Deestaforma,ellenguajedeprogramacinJavadefinelossiguientestiposdevariables:
a) Variables de tipos primitivos y variables referencia, segn el tipo de informacin que
contengan. En funcin de a qu grupo pertenezca la variable, tipos primitivos o tipos
referenciados,podrtomarunosvaloresuotros,ysepodrndefinirsobreellaunasoperaciones
uotras.
b) Variables y constantes, dependiendo de si su valor cambia o no durante la ejecucin del
programa.Ladefinicindecadatiposera:
Variables.Sirvenparaalmacenarlosdatosdurantelaejecucindelprograma,puedenestar
formadas por cualquier tipo de dato primitivo o referencia. Su valor puede cambiar varias
vecesalolargodetodoelprograma.
Constantesovariablesfinales.Sonaquellasvariablescuyovalornocambiaalolargodetodo
elprograma.
c) Variablesmiembroyvariableslocales,enfuncindellugardondeaparezcanenelprograma.La
definicinconcretasera:
Variables miembro. Son las variables que se crean dentro de una clase (Componente
softwarereutilizableexpresadoentrminosdeatributosycomportamientosomtodos.Los
programadores pueden usar sus propias clases o las incluidas en el lenguaje), fuera de
cualquiermtodo(Elementosdeunaclaseuobjetocompuestosporunaseriedesentencias
quesirvenparadescribirlasaccionesarealizarconesaclaseuobjeto).Puedenserdetipos
primitivos o referencias, variables o constantes. En un lenguaje puramente orientado a
objetoscomoesJava,todosebasaenlautilizacindeobjetos(Losobjetossecreanapartir

Creacindemiprimerprograma

DAW

declases,yrepresentancasosindividualesdeunaclase),loscualessecreanusandoclases.
Enlasiguienteunidadveremoslosdistintostiposdevariablesmiembroquesepuedenusar.
Variableslocales.Sonlasvariablesquesecreanyusandentrodeunmtodoo,engeneral,
dentro de cualquier bloque de cdigo. La variable deja de existir cuando la ejecucin del
bloque de cdigo o el mtodo finaliza. Al igual que las variables miembro, las variables
localestambinpuedenserdetiposprimitivosoreferencias.

AUTOEVALUACIN:
Relaciona los tipos de variables con la caracterstica correspondiente, escribiendo el nmero
asociadoalacaractersticaenelhuecocorrespondiente.
Ejercicioderelacionar
Lasvariables...
Relacin
Tienenlacaractersticadeque
Locales.

Miembro.

Constantes.

1.Unavezinicializadassuvalornuncacambia.

2.Vandentrodeunmtodo.

3.Vandentrodeunaclase.

2.5Tiposdevariables.ConstantesII
El siguiente ejemplo muestra el cdigo para la creacin de varios tipos de variables. Como ya
veremosenapartadosposteriores,lasvariablesnecesitandeclararse,avecesdandounvaloryotras
conunvalorpordefecto.

Esteprogramacreaunaclasequecontienelassiguientesvariables:

Variable constante llamada PI: esta variable por haberla declarado como constante no
podrcambiarsuvaloralolargodetodoelprograma.
Variablemiembrollamadax:Estavariablepertenecealaclaseejemplovariables.La
variablexpuedealmacenarvaloresdeltipoprimitivoint.Elvalordeestavariablepodrser
modificadoenelprograma,normalmentepormediodealgnotromtodoquesecreeenla
clase.
Variable local llamada valorantiguo: Esta variable es local porque est creada dentro
del mtodo obtenerX(). Slo se podr acceder a ella dentro del mtodo donde est
creada,yaquefueradelnoexiste.

DesarrollodeAplicacionesWeb

Tema2

En apartados posteriores veremos cmo darle ms funcionalidad a nuestros programas, mostrar


algnresultadoporpantalla,haceroperaciones,etc.Porelmomento,siejecutaselejemploanterior
simplementemostrarelmensajeGENERACIN CORRECTA,indicandoquetodohaidobienyel
programahafinalizado.

Creando nuestro primer programa

Creacindemiprimerprograma

DAW

10

DesarrollodeAplicacionesWeb

Tema2

3. Los tipos de datos


Caso prctico
Mara ya ha hecho sus pinitos como programadora. Ahora mismo est ayudando a Juan con las
variables y le ha surgido un problema.
El lenguaje se est comportando de una forma extraa, quiero llamar a una variable final y no me
deja Le comenta a Juan.
Claro, eso es porque final es una palabra reservada y ya hemos visto que no la puedes utilizar para
nombrar variables le responde Juan.
Vaya! exclama Mara, es verdad!, y qu otros requisitos debo tener en cuenta a la hora de
declarar las variables?
Pues lo importante es saber qu tipo de informacin hay que guardar, para poder asignarles el tipo
de dato adecuado. Tienes un momento y te lo cuento? le dice Juan

Enloslenguajesfuertementetipados,atododato(constante,variableoexpresin)lecorresponde
untipoqueesconocidoantesdequeseejecuteelprograma.
El tipo limita el valor de la variable o expresin, las operaciones que se pueden hacer sobre esos
valores,yelsignificadodeesasoperaciones.Estoesasporqueuntipodedatonoesmsqueuna
especificacindelosvaloresquesonvlidosparaesavariable,ydelasoperacionesquesepueden
realizarconellos.
Debidoaqueeltipodedatodeunavariableseconocedurantelarevisinquehaceelcompilador
paradetectarerrores,oseaentiempodecompilacin,estalaboresmuchomsfcil,yaquenohay
queesperaraqueseejecuteelprogramaparasaberquvaloresvaaconteneresavariable.Estose
consigue con un control muy exhaustivo de los tipos de datos que se utilizan, lo cual tiene sus
ventajaseinconvenientes,porejemplocuandoseintentaasignarunvalordeuntipo,aunavariable
de otro tipo. Sin embargo, en Java, puede haber conversin entre ciertos tipos de datos, como
veremosposteriormente.
Ahoranoeselmomentodeentrarendetallesobrelaconversindetipos,perosdebemosconocer
conexactituddequtiposdedatosdisponeellenguajeJava.Yahemosvistoquelasvariables,segn
la informacin que contienen, se pueden dividir en variables de tipos primitivos y variables
referencia.Peroquesuntipodedatoprimitivo?Yuntiporeferencia?Estoesloquevamosaver
acontinuacin.LostiposdedatosenJavasedividenprincipalmenteendoscategoras:

Tiposdedatossencillosoprimitivos.Representanvaloressimplesquevienenpredefinidosen
ellenguaje;contienenvaloresnicos,comoporejemplouncarcterounnmero.
Tipos de datos referencia. Se definen con un nombre o referencia (puntero) que contiene la
direccinenmemoriadeunvalorogrupodevalores.Dentrodeestetipotenemosporejemplo
losvectoresoarrays,quesonunaseriedeelementosdelmismotipo,olasclases,quesonlos
modelosoplantillasapartirdeloscualessecreanlosobjetos.

En el siguiente apartado vamos a ver con detalle los diferentes tipos de datos que se engloban
dentrodeestasdoscategoras.

AUTOEVALUACIN:
El tipado fuerte de datos supone que:
A todo dato le corresponde un tipo que es conocido antes de que se ejecute el programa.
El lenguaje hace un control muy exhaustivo de los tipos de datos.

11

Creacindemiprimerprograma

DAW

El compilador puede optimizar mejor el tratamiento de los tipos de datos.


Todas las anteriores son correctas.
En un lenguaje fuertemente tipado se cumplen todas las condiciones anteriores.

3.1TiposdedatosprimitivosI
Los tipos primitivos son aqullos datos sencillos que constituyen los tipos de informacin ms
habituales:nmeros,caracteresyvaloreslgicosobooleanos.Alcontrarioqueenotroslenguajesde
programacinorientadosaobjetos,enJavanosonobjetos.
Una de las mayores ventajas de tratar con tipos primitivos en lugar de con objetos, es que el
compiladordeJavapuedeoptimizarmejorsuuso.Otraimportantecaracterstica,esquecadauno
delostiposprimitivostieneidnticotamaoycomportamientoentodaslasversionesdeJavaypara
cualquier tipo de ordenador. Esto quiere decir que no debemos preocuparnos de cmo se
representarn los datos en distintas plataformas, y asegura la portabilidad de los programas, a
diferencia de lo que ocurre con otros lenguajes. Por ejemplo, el tipo int siempre se representar
con32bits,consigno,yenelformatoderepresentacincomplementoa2,encualquierplataforma
quesoporteJava.
TIPOSDEDATOSPRIMITIVOS
Tipo

Descripcin

Bytes

Rango

128a127
32,768a32,767
2,147,483,648a2,147,483,647
9,223,372,036,854,775,808 a
9,223,372,036,854,775,807
+/1.4E45(+/1.4times1045)a
+/3.4E38(+/3.4times1038)

+/4.9E324(+/4.9times10324)
a+/1.7E308(+/1.7times10308)

byte
short
int

Enteromuycorto
Enterocorto
Entero

1
2
4

long

Enterolargo

float

double

Numeroconpuntoflotantede
precisinindividualconhasta
7dgitossignificativos
Numeroconpuntoflotantede
precisindobleconhasta16
dgitossignificativos

\u0000

char

CarcterUnicode2

Valorpor
default
0
0
0
0L
0.0f

0.0d

\u0000

a
\uFFFF

boolean ValorVerdaderooFalso

trueofalse

public class Example {


public static void main(String[] args) {
//declarar variables
byte mes = 12;
int contador = 0;
double pi = 3.1415926535897932384626433832795;
float interes = 4.25e2F;
char letra = 'Z';
boolean encontrado = true;
//imprimir valores
System.out.println(mes); //imprimir 12
System.out.println(contador); //imprimir 0
System.out.println(pi); //imprimir 3.141592653589793
System.out.println(interes); //imprimir 425.0

12

false

DesarrollodeAplicacionesWeb

System.out.println(letra); //imprimir Z
System.out.println(encontrado); //imprimir true
}
}

Tema2

SABASQU?.
Javaespecificaeltamaoyformatodetodoslostiposdedatosprimitivosconindependenciadela
plataformaosistemaoperativodondeseejecuteelprograma,deformaqueelprogramadornotiene
que preocuparse sobre las dependencias del sistema, y no es necesario escribir versiones distintas
delprogramaparacadaplataforma.

Hayunapeculiaridadenlostiposdedatosprimitivos,yesqueeltipodedatocharesconsiderado
por el compilador como un tipo numrico, ya que los valores que guarda son el cdigo Unicode
correspondiente al carcter que representa, no el carcter en s, por lo que puede operarse con
caracterescomosisetrataradenmerosenteros.
Porotraparte,alahoradeelegireltipodedatoquevamosautilizarqucriterioseguiremospara
elegiruntipodedatouotro?Puesdeberemostenerencuentacmoeslainformacinquehayque
guardar, si es de tipo texto, numrico, y, adems, qu rango de valores puede alcanzar. En este
sentido, hay veces que aunque queramos representar un nmero sin decimales, tendremos que
utilizardatosdetiporeal.
Porejemplo,eltipodedatointnopodrarepresentarlapoblacinmundialdelplaneta,yaqueel
valor mximo que alcanza es de 2.147.483.647, siendo ste el nmero mximo de combinaciones
posiblescon32bits,teniendoencuentaquelarepresentacindelosnmerosenterosenJavautiliza
complemento a 2. Si queremos representar el valor correspondiente a la poblacin mundial del
planeta, cerca de 7 mil millones de habitantes, tendramos que utilizar al menos un tipo de dato
long,osinotenemosproblemasdeespaciountipofloat.
Sinembargo,lostiposrealestienenotroproblema:laprecisin.Vamosavermssobreellosenel
siguienteapartado.

Si quieres obtener informacin sobre cmo se lleva a cabo la representacin interna de


nmerosenterosysobrelaaritmticabinaria,puedesconsultarelsiguienteenlace:
http://platea.pntic.mec.es/~lgonzale/tic/binarios/aritmetica.html

3.2TiposdedatosprimitivosII
Eltipodedatorealpermiterepresentarcualquiernmerocondecimales.Aligualqueocurreconlos
enteros,lamayoradeloslenguajesdefinenmsdeuntipodedatoreal,enfuncindelnmerode
bitsusadopararepresentarlos.Cuantomayorseaesenmero:

Msgrandepodrserelnmerorealrepresentadoenvalorabsoluto
Mayorserlaprecisindelapartedecimal

Entrecadadosnmerosrealescualesquiera,siempretendremosinfinitosnmerosreales,porloque
la mayora de ellos los representaremos de forma aproximada. Por ejemplo, en la aritmtica
convencional, cuando dividimos 10 entre 3, el resultado es 3.3333333, con la secuencia de 3

13

Creacindemiprimerprograma

DAW

repitindoseinfinitamente.Enelordenadorslopodemosalmacenarunnmerofinitodebits,porlo
queelalmacenamientodeunnmerorealsersiempreunaaproximacin.
Losnmerosrealesserepresentanencomaflotante,queconsisteentrasladarlacomadecimalala
primeracifrasignificativadelvalor,conobjetodepoderrepresentarelmximodenmerosposible.
Unnmeroseexpresacomo:

Valor=mantisax2exponente

En concreto, slo se almacena la mantisa y el exponente al que va elevada la base. Los bits
empleados por la mantisa representan la precisin del nmero real, es decir, el nmero de cifras
decimales significativas que puede tener el nmero real, mientras que los bits del exponente
expresan la diferencia entre el mayor y el menor nmero representable, lo que viene a ser el
intervaloderepresentacin.
EnJavalasvariablesdetipofloatseempleanpararepresentarlosnmerosencomaflotantede
simpleprecisinde32bits,deloscuales24sonparalamantisay8paraelexponente.Lamantisaes
unvalorentre1.0y1.0yelexponenterepresentalapotenciade2necesariaparaobtenerelvalor
quesequiererepresentar.Porsuparte,lasvariablestipodoublerepresentanlosnmerosencoma
flotantededobleprecisinde64bits,deloscuales53sonparalamantisay11paraelexponente.
La mayora de los programadores en Java emplean el tipo double cuando trabajan con datos de tipo
real, es una forma de asegurarse de que los errores cometidos por las sucesivas aproximaciones
sean menores. De hecho, Java considera los valores en coma flotante como de tipo double por
defecto.

Con el objetivo de conseguir la mxima portabilidad de los programas, Java utiliza el estndar
internacionalIEEE754paralarepresentacininternadelosnmerosencomaflotante,queesuna
formadeasegurarsedequeelresultadodelosclculosseaelmismoparadiferentesplataformas.

PARASABERMS
La siguiente pgina es la web oficial sobre el estndar internacional IEEE 7542008 para
representacindenmerosencomaflotante(eningls):
http://grouper.ieee.org/groups/754/
AUTOEVALUACIN:
Relaciona los tipos primitivos con los bits y rango de valores correspondientes,
escribiendo el nmero asociado en el hueco correspondiente.
Ejercicio de relacionar
Tipo Relacin
Caracterstica
short

Coma flotante de 64 bits, usando la representacin IEE754-2008

byte

Entero de 32 bits, rango de valores de -2.147.483.648 (-231) a 2.147.483.647


(+231-1)

double

Entero de 16 bits, rango de valores de -32.768 (-215) a +32.767 (+215-1)

long

Coma flotante de 32 bits, usando la representacin IEEE 745-2008

int

Entero de 8 bits, rango de valores de -128 (-27) a +127 (+27-1)

float

Entero de 64 bits, rango de valores de -9.223.372.036.854.775.808 (-263)


a 9.223.372.036.854.775.807 (+263-1)

Adems de los anteriores, tambin son tipos primitivos el tipo de dato boolean, con valores true y false, y el tipo de datos
char, que almacena el cdigo Unicode de un carcter.

14

DesarrollodeAplicacionesWeb

Tema2

3.3Declaracineinicializacin
Llegadosaestepuntocabepreguntarnoscmosecreanlasvariablesenunprograma?Qudebo
hacerantesdeusarunavariableenmiprograma?Puesbien,comopodrsimaginar,debemoscrear
las variables antes de poder utilizarlas en nuestros programas, indicando qu nombre va a tener y
qutipodeinformacinvaaalmacenar,endefinitiva,debemosdeclararlavariable.
Las variables se pueden declarar en cualquier bloque de cdigo, dentro de llaves. Y lo hacemos
indicandosuidentificadoryeltipodedato,separadasporcomassivamosadeclararvariasalavez,
porejemplo:
int numAlumnos = 15;
double radio = 3.14, importe = 102.95;
De esta forma, estamos declarando numAlumnos como una variable de tipo int, y otras dos
variables radio e importe de tipo double. Aunque no es obligatorio, hemos aprovechado la
declaracindelasvariablesparainicializarlasalosvalores15,3.14y102.95respectivamente.
Silavariablevaapermanecerinalterablealolargodelprograma,ladeclararemoscomoconstante,
utilizandolapalabrareservadafinaldelasiguienteforma:
final double PI = 3.1415926536;
Enocasionespuedequealdeclararunavariablenoledemosvalor,qucreesqueocurreenestos
casos?Puesqueelcompiladorleasignaunvalorpordefecto,aunquedependedeltipodevariable
quesetrate:

Lasvariablesmiembrosseinicializan automticamente,sinolesdamosunvalor.Cuando
sondetiponumrico,seinicializanpordefectoa0,sidondetipocarcter,seinicializanal
carcternull(\0),sisondetipobooleanselesasignaelvalorpordefectofalse,ysison
tiporeferenciadoseinicializananull.
Las variables locales no se inicializan automticamente. Debemos asignarles nosotros un
valorantesdeserusadas,yaquesielcompiladordetectaquelavariableseusaantesdeque
seleasigneunvalor,produceunerror.Porejemploenestecaso:
int p;
int q = p; // error

Ytambinenesteotro,yaqueseintentausarunavariablelocalquepodranohaberseinicializado:
int p;
if (. . . )
p = 5 ;
int q = p; // error
Enelejemploanteriorlainstruccinifhacequesisecumplelacondicinquehayentreparntesis
(cualquieraqueindiquemos),entonceselprogramaasignarelvalor5alavariablep;sinosecumple
lacondicin,pquedarsininicializar.Perosipnosehainicializado,notendravalorparaasignrselo
aq.
Porello,elcompiladordetectaeseposibleproblemayproduceunerrordeltipoLavariablepodra
nohabersidoinicializada,independientementedesisecumpleonolacondicindelif.

15

Creacindemiprimerprograma

DAW

AUTOEVALUACIN:
De las siguientes, seala cul es la afirmacin correcta:
La declaracin de una variable consiste bsicamente en indicar el tipo que va a tener
seguido del nombre y su valor.
Java no tiene restriccin de tipos.
Todos los tipos tienen las mismas operaciones a realizar con ellos: suma, resta,
multiplicacin, etc.
Todas las anteriores son incorrectas.
Nada de lo afirmado sobre declaracin de variables, tipado de datos y operaciones es correcto.

3.4Tiposreferenciados
Apartirdelosochotiposdatosprimitivos,sepuedenconstruirotrostiposdedatos.Estostiposde
datossellamantiposreferenciadosoreferencias,porqueseutilizanparaalmacenarladireccinde
losdatosenlamemoriadelordenador.
int[] arrayDeEnteros;
Cuenta cuentaCliente;
Enlaprimerainstruccindeclaramosunalistadenmerosdelmismotipo,enestecaso,enteros.En
la segunda instruccin estamos declarando la variable u objeto cuentaCliente como una referencia
detipoCuenta.
ComocomentbamosalprincipiodelapartadodeTiposdedatos,cualquieraplicacindehoyenda
necesitanoperderdevistaunaciertacantidaddedatos.Cuandoelconjuntodedatosutilizadotiene
caractersticassimilaressesuelenagruparenestructurasparafacilitarelaccesoalosmismos,sonlos
llamadosdatosestructurados.
Sondatosestructuradoslosarrays,listas,rboles,etc.Puedenestarenlamemoriadelprogramaen
ejecucin,guardadoseneldiscocomoficheros,oalmacenadosenunabasededatos.
Adems de los ocho tipos de datos primitivos que ya hemos descrito, Java proporciona un
tratamientoespecialalostextosocadenasdecaracteresmedianteeltipodedatoString.Javacrea
automticamente un nuevo objeto de tipo String cuando se encuentra una cadena de caracteres
encerradaentrecomillasdobles.Enrealidadsetratadeobjetos,yportantosontiposreferenciados,
perosepuedenutilizardeformasencillacomosifueranvariablesdetiposprimitivos:
String mensaje;
mensaje= "El primer programa";
Hemos visto qu son las
variables,cmosedeclaran
y los tipos de datos que
pueden
adoptar.
Anteriormentehemosvisto
un ejemplo de creacin de
variables, en esta ocasin
vamos a crear ms

16

DesarrollodeAplicacionesWeb

Tema2

variables, pero de distintos tipos primitivos y los vamos a mostrar por pantalla. Los tipos
referenciadoslosveremosenlasiguienteunidad.
Para mostrar por pantalla un mensaje utilizamos System.out, conocido como la salida estndar
delprograma.Estemtodoloquehaceesescribirunconjuntodecaracteresatravsdelalneade
comandos.EnNetbeansestalneadecomandosapareceenlaparteinferiordelapantalla.Podemos
utilizar System.out.print o System.out.println. En el segundo caso lo que hace el
mtodoesquejustodespusdeescribirelmensaje,sitaelcursoralprincipiodelalneasiguiente.
Eltextoencolorgrisqueapareceentrecaracteres//soncomentariosquepermitendocumentarel
cdigo,peronosontenidosencuentaporelcompiladory,portanto,noafectanalaejecucindel
programa.

3.5Tiposenumerados
Lostiposdedatosenumeradossonunaformadedeclararunavariableconunconjuntorestringido
de valores. Por ejemplo, los das de la semana, las estaciones del ao, los meses, etc. Es como si
definiramosnuestropropiotipodedatos.
Laformadedeclararlosesconlapalabrareservadaenum,seguidadelnombredelavariableylalista
de valores que puede tomar entre llaves. A los valores que se colocan dentro de las llaves se les
consideracomoconstantes,vanseparadosporcomasydebenservaloresnicos.
La lista de valores se coloca entre llaves, porque un tipo de datos enum no es otra cosa que una
especiedeclaseenJava,ytodaslasclasesllevansucontenidoentrellaves.
Al considerar Java este tipo de datos como si de una clase se tratara, no slo podemos definir los
valoresdeuntipoenumerado,sinoquetambinpodemosdefiniroperacionesarealizarconlyotro
tipo de elementos, lo que hace que este tipo de dato sea ms verstil y potente que en otros
lenguajesdeprogramacin.
CITASPARAPENSAR
Oigoyolvido.Veoyrecuerdo.Hagoycomprendo.Proverbiochino.
En el siguiente ejemplo puedes comprobar el uso que se hace de los tipos de datos enumerados.
TenemosunavariableDiasquealmacenalosdasdelasemana.Paraaccederacadaelementodel
tipo enumerado se utiliza el nombre de la variable seguido de un punto y el valor en la lista. Ms
tarde veremos que podemos aadir mtodos y campos o variables en la declaracin del tipo
enumerado,yaquecomohemoscomentadountipoenumeradoenJavatieneelmismotratamiento
quelasclases.
En este ejemplo hemos utilizado el mtodo System.out.print. Como podrs comprobar si lo
ejecutas,
la
instruccinnmero18
escribe el texto que
tiene entre comillas
pero no salta a la
siguiente lnea, por lo
que la instruccin

17

Creacindemiprimerprograma

nmero19escribejustoacontinuacin.

DAW

Sinembargo,tambinpodemosescribirvariaslneasusandounanicasentencia.Aslohacemosen
la instruccin nmero 20, la cual imprime como resultado tres lneas de texto. Para ello hemos
utilizado un carcter especial, llamado carcter escape (\). Este carcter sirve para darle ciertas
rdenes al compilador, en lugar de que salga impreso en pantalla. Despus del carcter de escape
vieneotrocarcterqueindicalaordenarealizar,juntosrecibenelnombredesecuenciadeescape.
Lasecuenciadeescape\nrecibeelnombredecarcterdenuevalnea.Cadavezqueelcompilador
se encuentra en un texto ese carcter, el resultado es que mueve el cursor al principio de la lnea
siguiente.Enelprximoapartadovamosaveralgunasdelassecuenciasdeescapemsutilizadas.

18

DesarrollodeAplicacionesWeb

Tema2

4. Literales de los tipos primitivos


CASO
Ada se encuentra con Mara y Juan.
Cmo van esos avances con Java? Juan sabe lo que significa eso, Ada se interesa por el
trabajo que estn llevando a cabo. Ya tienen claro qu tipos de datos utilizar, pero necesitan
cerciorarse de los valores que pueden almacenar esos tipos de datos, es decir, qu literales pueden
contener, para estar seguros que han hecho la eleccin adecuada.
Muy bien contesta Juan. Si quieres te hacemos una demostracin para que veas la estructura
del programa.
A Ada le satisface la eficacia con que trabajan Mara y Juan, apenas ha comenzado con el proyecto
y pronto podr ver resultados inmediatos.

Unliteral,valorliteraloconstanteliteralesunvalorconcretoparalostiposdedatosprimitivosdel
lenguaje, el tipo String o el tipo null. Los literales booleanos tienen dos nicos valores que
puedeaceptareltipo:
trueyfalse.Porejemplo,conlainstruccinbooleanencontrado=true;estamosdeclarando
unavariabledetipobooleanaalacualleasignamoselvalorliteraltrue.
Losliteralesenterossepuedenrepresentarentresnotaciones:

Decimal:porejemplo20.Eslaformamscomn.
Octal: por ejemplo 024. Un nmero en octal siempre empieza por cero, seguido de dgitos
octales(del0al7).
Hexadecimal: por ejemplo 0x14. Un nmero en hexadecimal siempre empieza por 0x
seguidodedgitoshexadecimales(del0al9,delaaalafodelaAalaF).

LasconstantesliteralesdetipolongseledebeaadirdetrsunalL,porejemplo873L,sinose
considerapordefectodetipoint.SesueleutilizarLparaevitarlaconfusindelaeleminsculacon
1.
Losliteralesrealesoencomaflotanteseexpresanconcomadecimaloennotacincientfica,osea,
seguidosdeunexponenteeE.ElvalorpuedefinalizarseconunafounaFparaindicaelformato
float o con una d o una D para indicar el formato double (por defecto es double). Por
ejemplo, podemos representar un mismo literal real de las siguientes formas: 13.2, 13.2D,
1.32e1, 0.132E2. Otras constantes literales reales son por ejemplo: .54, 31.21E-5, 2.f,
6.022137e+23f,3.141e-9d.
Unliteralcarcterpuedeescribirsecomouncarcterentrecomillassimplescomo'a','','Z','p',etc.
oporsucdigodelatablaUnicode,anteponiendolasecuenciadeescape\sielvalorloponemos
enoctalo\usiponemoselvalorenhexadecimal.Porejemplo,sisabemosquetantoenASCIIcomo
en Unicode, la letra A (mayscula) es el smbolo nmero 65, y que 65 en octal es 101 y 41 en
hexadecimal, podemos representar esta letra como '\101' en octal y '\u0041' en hexadecimal.
Existenunoscaracteresespecialesqueserepresentanutilizandosecuenciasdeescape:
Secuenciadeescape
\b
\t
\n
\f

Significado
Retroceso
Tabulador
Saltodelnea
Saltodepgina

Secuenciadeescape
\r
\
\
\\

Significado
Retornodecarro
Carctercomillasdobles
Carctercomillassimples
Barradiagonal
19

Creacindemiprimerprograma

DAW

Normalmente, los objetos en Java deben ser creados con la orden new. Sin embargo, los literales
String no lo necesitan ya que son objetos que se crean implcitamente por Java.

Los literales de cadenas de caracteres se indican entre comillas dobles. En el ejemplo anterior El
primerprogramaesunliteraldetipocadenadecaracteres.Alconstruirunacadenadecaracteresse
puedeincluircualquiercarcterUnicodeexceptouncarcterderetornodecarro,porejemploenla
siguiente instruccin utilizamos la secuencia de escape \ para escribir dobles comillas dentro del
mensaje:
String texto = "Juan dijo: \"Hoy hace un da fantstico\"";
En el ejemplo anterior de tipos enumerados ya estbamos utilizando secuencias de escape, para
introducirunsaltodelneaenunacadenadecaracteres,utilizandoelcarcterespecial\n.

20

DesarrollodeAplicacionesWeb

Tema2

5. Operadores y expresiones.
CASO
Mara y Juan tienen definidas las variables y tipos de datos a utilizar en la aplicacin. Es el momento
de ponerse a realizar los clculos que permitan manipular esos datos, sumar, restar, multiplicar,
dividir y mucho ms. En definitiva se trata de llevar los conocimientos matemticos al terreno de la
programacin, ver cmo se pueden hacer operaciones aritmticas, lgicas o de comparacin en el
lenguaje Java.
Tambin necesitarn algn operador que permita evaluar una condicin y decidir las acciones a
realizar en cada caso. Es importante conocer bien cmo el lenguaje evala esas expresiones, en
definitiva, cul es la precedencia que tiene cada operador.

Losoperadoresllevanacabooperacionessobreunconjuntodedatosuoperandos,representados
por literales y/o identificadores. Los operadores pueden ser unarios, binarios o terciarios, segn el
nmero de operandos que utilicen sean uno, dos o tres, respectivamente. Los operadores actan
sobrelostiposdedatosprimitivosydevuelventambinuntipodedatoprimitivo.
Los operadores se combinan con los literales y/o identificadores para formar expresiones. Una
expresin es una combinacin de operadores y operandos que se evala produciendo un nico
resultadodeuntipodeterminado.
Elresultadodeunaexpresinpuedeserusadocomopartedeotraexpresinoenunasentenciao
instruccin.Lasexpresiones,combinadasconalgunaspalabrasreservadasoporsmismas,forman
lasllamadassentenciasoinstrucciones.
Porejemplo,pensemosenlasiguienteexpresinJava:
i + 1
Con esta expresin estamos utilizando un operador aritmtico para sumarle una cantidad a la
variablei,peroesnecesarioindicaralprogramaquhacerconelresultadodedichaexpresin:
suma = i + 1;
Queloalmaceneenunavariablellamadasuma,porejemplo.Enestecasoyatendramosunaaccin
completa,esdecir,unasentenciaoinstruccin.
Msejemplosdesentenciasoinstruccioneslostenemosenlasdeclaracionesdevariables,vistasen
apartados anteriores, o en las estructuras bsicas del lenguaje como sentencias condicionales o
bucles,queveremosenunidadesposteriores.
Como curiosidad comentar que las expresiones de asignacin, al poder ser usadas como parte de
otrasasignacionesuoperaciones,sonconsideradastantoexpresionesensmismascomosentencias.

CITAS PARA PENSAR


Lo que no hemos realizado no es ms que lo que todava no hemos intentado hacer.
AlexisdeTocqueville.

5.1Operadoresaritmticos
Los operadores aritmticos son aquellos operados que combinados con los operandos forman
expresionesmatemticasoaritmticas.

21

Creacindemiprimerprograma

Operador
OperacinJava
ExpresinJava Resultado

Operadorunariodecambiodesigno
10
10
+
Adicin
1.2+9.3
10.5

Sustraccin
312.512.3
300.2
*
Multiplicacin
1.7*1.2
1.02
/
Divisin(enteraoreal)
0.5/0.2
2.5
%
Restodeladivisinentera
25%3
1
Elresultadodeestetipodeexpresionesdependedelosoperandosqueutilicen:

DAW

Tipodelosoperandos
Resultado
Unoperandodetipolongyningunoreal(floatodouble)
long
Ningnoperandodetipolongnireal(floatodouble)
int
Almenosunoperandodetipodouble
double
Almenosunoperandodetipofloatyningunodouble
float
Otro tipo de operadores aritmticos son los operadores unarios incrementales y decrementales.
Producenunresultadodelmismotipoqueeloperando,ypodemosutilizarlosconnotacinprefija,si
eloperadorapareceantesqueeloperando,onotacinpostfija,sieloperadoraparecedespusdel
operando.Enlatablapuedesverunejemplodeutilizacindecadaoperadorincremental.
Tipooperador
++(incremental)

ExpresinJava
Prefija:
x=3;
y=++x;
//xvale4eyvale4

(decremental)

5//elresultadoes4

Postfija:
x=3;
y=x++;
//xvale4eyvale3

En el ejemplo vemos un programa bsico que utiliza operadores aritmticos. Observa que usamos
System.out.printf para mostrar por pantalla un texto formateado. El texto entre dobles
comillasson losargumentosdelmtodoprintfy siusamosmsdeuno,seseparanconcomas.
Primero indicamos cmo queremos que salga el texto, y despus el texto que queremos mostrar.
Fjate que con el primer %s nos estamos refiriendo a una variable de tipo String, o sea, a la
primeracadenadetexto,conelsiguiente%salasegundacadenayconelltimo%salatercera.Con
%fnosreferimosaunargumentodetipofloat,etc.

5.2Operadoresdeasignacin
Elprincipaloperadordeestacategoraeseloperadorasignacin=,quepermitealprogramadarle
unvaloraunavariable,yqueyahemosutilizadoenvariasocasionesenestaunidad.Ademsdeeste
operador, Java proporciona otros operadores de asignacin combinados con los operadores
aritmticos,quepermitenabreviaroreducirciertasexpresiones.

22

DesarrollodeAplicacionesWeb

Tema2

Porejemplo,eloperador+=sumaelvalordelaexpresinaladerechadeloperadorconelvalordela
variable que hay a la izquierda del operador, y almacena el resultado en dicha variable. En la
siguientetablasemuestrantodoslosoperadoresdeasignacincompuestosquepodemosutilizaren
Java
Operador EjemploenJava Expresinequivalente
+=
op1+=op2
op1=op1+op2
=
op1=op2
op1=op1op2
*=
op1*=op2
op1=op1*op2
/=
op1/=op2
op1=op1/op2
%=
op1%=op2
op1=op1%op2
Unejemplodeoperadoresdeasignacincombinadoslotenemosacontinuacin:

Parasaberms
En el siguiente enlace tienes informacin interesante sobre cmo se pueden utilizar los
caracteresespecialesincluidosenlaordenprintf(eningls):
http://www.java2s.com/Tutorial/Java/0120__Development/UsingJavasprintfMethod.htm

5.3Operadorcondicional
Eloperadorcondicional?:sirveparaevaluarunacondicinydevolverunresultadoenfuncindesi
esverdaderaofalsadichacondicin.EselnicooperadorternariodeJava,ycomotal,necesitatres
operandosparaformarunaexpresin.
Elprimeroperandosesitaalaizquierdadelsmbolodeinterrogacin,ysiempreserunaexpresin
booleana, tambin llamada condicin. El siguiente operando se sita a la derecha del smbolo de
interrogacin y antes de los dos puntos, y es el valor que devolver el operador condicional si la
condicinesverdadera.Elltimooperando,queaparecedespusdelosdospuntos,eslaexpresin
cuyoresultadosedevolversilacondicinevaluadaesfalsa.
condicin ? exp1 : exp2
Porejemplo,enlaexpresin:
(x>y)?x:y;
Seevalalacondicindesixesmayorquey,encasoafirmativosedevuelveelvalordelavariable
x,yencasocontrariosedevuelveelvalordey.

23

Creacindemiprimerprograma

DAW

El operador condicional se puede sustituir por la sentencia ifthenelse que veremos en la


siguienteunidaddeEstructurasdecontrol.

CITAS PARA PENSAR.


La buena escritura debe ser concisa. Una oracin no debe contener palabras
innecesarias,unprrafonodebeconteneroracionesinnecesarias.
WilliamStrunk,Jr.

5.4Operadoresderelacin
Losoperadoresrelacionalesseutilizanparacomparardatosdetipoprimitivo(numrico,carctery
booleano).Elresultadoseutilizaren otrasexpresionesosentencias,que ejecutarnunaaccin u
otraenfuncindesisecumpleonolarelacin.
EstasexpresionesenJavadansiemprecomoresultadounvalorbooleanotrueofalse.Enlatabla
siguienteaparecenlosoperadoresrelacionalesenJava.
Operador EjemploenJava Significado
==
op1==op2
op1igualaop2
!=
op1!=op2
op1distintodeop2
>
op1>op2
op1mayorqueop2
<
op1<op2
op1menorqueop2
>=
op1>=op2
op1mayoroigualqueop2
<=
op1<=op2
op1menoroigualqueop2
Hastaahorahemosvistoejemplosquecreabanvariablesyseinicializabanconalgnvalor.Peroysi
loquequeremosesqueelusuariointroduzcaunvaloralprograma?
Entonces debemos agregarle interactividad a nuestro programa, por ejemplo utilizando la clase
Scanner.
Aunque no hemos visto todava qu son las
clases y los objetos, de momento vamos a
pensarquelaclaseScannernosvaapermitir
leer los datos que se escriben por teclado, y
que para usarla es necesario importar el
paquetedeclasesquelacontiene.Elcdigodel
ejemplo lo tienes a continuacin. El programa
sequedaresperandoaqueelusuarioescriba
algoeneltecladoypulselateclaintro.Enese
momento se convierte lo ledo a un valor del
tipo int y lo guarda en la variable indicada.
Ademsdelosoperadoresrelacionales,eneste
ejemplo utilizamos tambin el operador
condicional,quecomparasilosnmerossoniguales.Siloson,devuelvelacadenaigualesysino,la
cadenadistintos.

AUTOEVALUACIN:
Seala cules son los operadores relacionales en Java.
= =, ! =, >, <, > =, < =.

==, =!, >, <, =>, =<.

=, !=, >, <, >=, <=.

==, !=, >, <, >=, <=.


Tienes claro cules son los operadores relacionales en Java.

24

DesarrollodeAplicacionesWeb

Tema2

5.5Operadoreslgicos
Los operadores lgicos realizan operaciones sobre valores booleanos, o resultados de expresiones
relacionales,dandocomoresultadounvalorbooleano.
Los operadores lgicos los podemos ver en la tabla que se muestra a continuacin. Existen ciertos
casosenlosqueelsegundooperandodeunaexpresinlgicanoseevalaparaahorrartiempode
ejecucin, porque con el primero ya es suficiente para saber cul va a ser el resultado de la
expresin.
Porejemplo,enlaexpresina && bsiaesfalso,nosesiguecomprobandolaexpresin,puesto
queyasesabequelacondicindequeambosseanverdaderonosevaacumplir.Enestoscasoses
ms conveniente colocar el operando ms propenso a ser falso en el lado de la izquierda. Igual
ocurreconeloperador||,encuyocasoesmsfavorablecolocareloperandomspropensoaser
verdaderoenelladoizquierdo.
Operador
!
&
|
^
&&
||

EjemploenJava
!op
op1&op2
op1|op2
op1^op2
op1&&op2
op1||op2

Significado
Devuelvetruesieloperandoesfalseyviceversa.
Devuelvetruesiop1yop2sontrue
Devuelvetruesiop1uop2sontrue
Devuelvetruesislounodelosoperandosestrue
Igualque&,perosiop1esfalseyanoseevalaop2
Igualque|,perosiop1estrueyanoseevalaop2

Enelsiguientecdigo
puedes
ver
un
ejemplodeutilizacin
de
operadores
lgicos:

5.6Operadoresdebits
Losoperadoresaniveldebitssecaracterizanporquerealizanoperacionessobrenmerosenteros(o
char)ensurepresentacinbinaria,esdecir,sobrecadadgitobinario.
EnlatablatieneslosoperadoresaniveldebitsqueutilizaJava.

25

Creacindemiprimerprograma

DAW

Operador EjemploenJava Significado


~
~op
Realizaelcomplementobinariodeop(invierteelvalordecadabit)
&
op1&op2
RealizalaoperacinANDbinariasobreop1yop2
|
op1|op2
RealizalaoperacinORbinariasobreop1yop2
^
op1^op2
RealizalaoperacinORexclusivo(XOR)binariasobreop1yop2
<<
op1<<op2
Desplazaop2veceshacialaizquierdalosbitsdeop1
>>
op1>>op2
Desplazaop2veceshacialaderechalosbitsdeop1
>>>
op1>>>op2
Desplazaop2(enpositivo)veceshacialaderechalosbitsdeop1

PARASABERMS
Los operadores de bits raramente los vas a utilizar en tus aplicaciones de gestin. No
obstante, si sientes curiosidad sobre su funcionamiento, puedes ver el siguiente enlace
dedicadoaestetipodeoperadores:
http://www.zator.com/Cpp/E4_9_3.htm

5.7Trabajoconcadenas
YahemosvistoenelapartadodeliteralesqueelobjetoStringsecorrespondeconunasecuencia
decaracteresentrecomillados,comoporejemplohola.EsteliteralsepuedeutilizarenJavacomo
sideuntipodedatosprimitivosetratase,y,comocasoespecial,nonecesitalaordennewparaser
creado.
Nosetrataaqudequenosadentremosenloqueesunaclaseuobjeto,puestoqueloveremosen
unidades posteriores, y trabajaremos mucho sobre ello. Aqu slo vamos a utilizar determinadas
operacionesquepodemosrealizarconelobjetoString,yloversmuchomsclaroconejemplos
descriptivos.
Para aplicar una operacin a una variable de tipo String, escribiremos su nombre seguido de la
operacin, separados por un punto. Entre las principales operaciones que podemos utilizar para
trabajarconcadenasdecaracteresestnlassiguientes:

26

Creacin.Comohemosvistoenelapartadodeliterales,podemoscrearunavariabledetipo
String simplemente asignndole una cadena de caracteres encerrada entre comillas
dobles.
Obtencin de longitud. Si necesitamos saber la longitud de un String, utilizaremos el
mtodolength().
Concatenacin.Seutilizaeloperador+oelmtodoconcat()paraconcatenarcadenasde
caracteres.
Comparacin. El mtodo equals() nos devuelve un valor booleano que indica si las
cadenascomparadassononoiguales.ElmtodoequalsIgnoreCase()hacelopropio,
ignorandolasmaysculasdelascadenasaconsiderar.
Obtencindesubcadenas.Podemosobtenercadenasderivadasdeunacadenaoriginalcon
el mtodo substring(), al cual le debemos indicar el inicio y el fin de la subcadena a
obtener.
Cambio a maysculas/minsculas. Los mtodos toUpperCase() y toLowerCase()
devuelvenunanuevavariablequetransformaenmaysculasominsculas,respectivamente,
lavariableinicial.
Valueof. Utilizaremos este mtodo para convertir un tipo de dato primitivo (int, long,
float,etc.)aunavariabledetipoString.

DesarrollodeAplicacionesWeb

Tema2

A continuacin varios ejemplos de las distintas operaciones que podemos realizar con cadenas de
caracteresoStringenJava:

5.8Precedenciadeoperadores
El orden de precedencia de los operadores determina la secuencia en que deben realizarse las
operacionescuandoenunaexpresinintervienenoperadoresdedistintotipo.
LasreglasdeprecedenciadeoperadoresqueutilizaJavacoincidenconlasreglasdelasexpresiones
dellgebraconvencional.Porejemplo:

Lamultiplicacin,divisinyrestodeunaoperacinseevalanprimero.
Si dentro de la misma expresin tengo varias operaciones de este tipo, empezar
evalundolasdeizquierdaaderecha.

Lasumaylarestaseaplicandespusquelasanteriores.Delamismaforma,sidentrodela
mismaexpresintengovariassumasyrestasempezarevalundolasdeizquierdaaderecha.

Alahoradeevaluarunaexpresinesnecesariotenerencuentalaasociatividaddelosoperadores.
Laasociatividadindicaquoperadorseevalaantes,encondicionesdeigualdaddeprecedencia.Los
operadoresdeasignacin,eloperadorcondicional(?:),losoperadoresincrementales(++,--)yel
casting son asociativos por la derecha. El resto de operadores son asociativos por la izquierda, es
decir,queseempiezanacalcularenelmismoordenenelqueestnescritos:deizquierdaaderecha.
Porejemplo,enlaexpresinsiguiente:
10 / 2 * 5
Realmentelaoperacinqueserealizaes(10 / 2 ) * 5,porqueambosoperadores,divisiny
multiplicacin,tienenigualprecedenciayportantoseevalaprimeroelqueantesnosencontramos
por la izquierda, que es la divisin. El resultado de la expresin es 25. Si fueran asociativos por la
derecha, puedes comprobar que el resultado sera diferente, primero multiplicaramos 2 * 5 y
luegodividiramosentre10,porloqueelresultadosera1.Enestaotraexpresin:
x = y = z = 1

27

Creacindemiprimerprograma

DAW

Realmentelaoperacinqueserealizaesx = (y = (z = 1)).Primeroasignamoselvalorde1a
lavariablez,luegoalavariabley,paraterminarasignandoelresultadodeestaltimaasignacina
x.Sieloperadorasignacinfueraasociativoporlaizquierdaestaoperacinnosepodrarealizar,ya
queintentaramosasignaraxelvalordey,peroyannohabrasidoinicializada.
En la tabla se detalla el orden de precedencia y la asociatividad de los operadores que hemos
comentadoenesteapartado.Losoperadoressemuestrandemayoramenorprecedencia.
Operador
++
+++(cast)!~
*/%
+
<<>>>>>
<<=>>=
==!=
&
^
|
&&
||
?:
=+==*=/=%=

Tipo
Unario,notacinpostfija
Unario,notacinprefija
Aritmticos
Aritmticos
Bits
Relacionales
Relacionales
Lgico,Bits
Lgico,Bits
Lgico,Bits
Lgico
Lgico
Operadorcondicional
Asignacin

Asociatividad
Derecha
Derecha
Izquierda
Izquierda
Izquierda
Izquierda
Izquierda
Izquierda
Izquierda
Izquierda
Izquierda
Izquierda
Derecha
Derecha

REFLEXIONA.
Creesqueesunabuenaprcticadeprogramacinutilizarparntesisenexpresionesaritmticas
complejas,ancuandonoseannecesarios?
Elusodeparntesis,inclusocuandonosonnecesarios,puedehacermsfcildeleerlasexpresiones
aritmticascomplejas.

28

DesarrollodeAplicacionesWeb

Tema2

6. Conversin de tipo.
CASO
Mara ha avanzado mucho en sus conocimientos sobre Java y ha contado con mucha ayuda por
parte de Juan. Ahora mismo tiene un problema con el cdigo, y le comenta Estoy atrancada en el
cdigo. Tengo una variable de tipo byte y quiero asignarle un valor de tipo int, pero el compilador me
da un error de posible prdida de precisin t sabes qu significa eso?. Claro le contesta Juan,
es un problema de conversin de tipos, para asignarle el valor a la variable de tipo byte debes
hacer un casting. Ah! dice Mara, y cmo se hace eso?

Imaginaquequeremosdividirunnmeroentreotrotendrdecimaleselresultadodeesadivisin?
Podemos pensar que siempre que el denominador no sea divisible entre el divisor, tendremos un
resultadocondecimales,peronoesas.Sieldenominadoryeldivisorsonvariablesdetipoentero,el
resultadoserenteroynotendrdecimales.Paraqueelresultadotengadecimalesnecesitaremos
hacerunaconversindetipo.
Lasconversionesdetiposerealizanparahacerqueelresultadodeunaexpresinseadeltipoque
nosotrosdeseamos,enelejemploanteriorparahacerqueelresultadodeladivisinseadetiporeal
y,porende,tengadecimales.Existendostiposdeconversiones:

Conversiones automticas. Cuando a una variable de un tipo se le asigna un valor de otro


tiponumricoconmenosbitsparasurepresentacin,serealizaunaconversinautomtica.
Enesecaso,elvalorsedicequeespromocionadoaltipomsgrande(eldelavariable),para
poderhacerlaasignacin.Tambinserealizanconversionesautomticasenlasoperaciones
aritmticas, cuando estamos utilizando valores de distinto tipo, el valor ms pequeo se
promocionaalvalormsgrande,yaqueeltipomayorsiemprepodrrepresentarcualquier
valordeltipomenor(porejemplo,deintalongodefloatadouble).
Conversionesexplcitas.Cuandohacemosunaconversindeuntipoconmsbitsauntipo
con menos bits. En estos casos debemos indicar que queremos hacer la conversin de
maneraexpresa,yaquesepuedeproducirunaprdidadedatosyhemosdeserconscientes
de ello. Este tipo de conversiones se realiza con el operador cast. El operador cast es un
operadorunarioqueseformacolocandodelantedelvaloraconvertireltipodedatoentre
parntesis. Tiene la misma precedencia que el resto de operadores unarios y se asocia de
izquierdaaderecha.

Debemostenerencuentaqueunvalornumriconuncapuedeserasignadoaunavariabledeun
tipomenorenrango,sinoesconunaconversinexplcita.Porejemplo:
int a;
byte b;
a = 12;
b = 12;
b = a;
byte b = (byte) a;

//
//
//
//
//
//

no se realiza conversin alguna


se permite porque 12 est dentro
del rango permitido de valores para b
error, no permitido (incluso aunque
12 podra almacenarse en un byte)
Correcto, forzamos conversin explcita

Enelejemploanteriorvemosuncasotpicodeerrordetipos,yaqueestamosintentandoasignarlea
b el valor de a, siendo b de un tipo ms pequeo. Lo correcto es promocionar a al tipo de datos
byte,yentoncesasignarlesuvaloralavariableb.

29

Creacindemiprimerprograma

DAW

6.1ConversindetiposdedatosenJava
TabladeConversindeTiposdeDatosPrimitivos

Tipodestino

boolean char byte short int long


boolean

N
N
N
N N
char
N

C
C
Cl Cl
byte
N
C

CI
Cl Cl
short
N
C
C

Cl Cl
Tipoorigen
int
N
C
C
C

Cl
long
N
C
C
C
C

float
N
C
C
C
C
C
double
N
C
C
C
C
C
Explicacindelossmbolosutilizados:

float double
N
N
Cl
Cl
Cl
Cl
Cl
Cl
Cl*
Cl
Cl*
Cl*

Cl
C

N: Conversin no permitida (un boolean no se puede convertir a ningn otro tipo y


viceversa).
CI:Conversinimplcitaoautomtica.Unasteriscoindicaquepuedehaberposibleprdida
dedatos.
C:Castingdetiposoconversinexplcita.
Elasteriscoindicaquepuedehaberunaposibleprdidadedatos,porejemploalconvertir
unnmerodetipointqueusalos32bitsposiblesdelarepresentacin,auntipofloat,que
tambinusa32bitsparalarepresentacin,pero8deloscualessonparaelexponente.
En cualquier caso, las conversiones de nmeros en coma flotante a nmeros enteros
siemprenecesitarnunCasting,ydeberemostenermuchocuidadodebidoalaprdidade
precisinqueellosupone.

6.1.1 - Reglas de Promocin de Tipos de Datos


Cuando en una expresin hay datos o variables de distinto tipo, el compilador realiza la
promocindeunostiposenotros,paraobtenercomoresultadoeltipofinaldelaexpresin.
Estapromocindetipossehacesiguiendounasreglasbsicasenbasealascualesserealiza
estapromocindetipos,yresumidamentesonlassiguientes:

Siunodelosoperandosesdetipodouble,elotroesconvertidoadouble.

Encualquierotrocaso:

30

Sielunodelosoperandosesfloat,elotroseconvierteafloat

Siunodelosoperandoseslong,elotroseconviertealong

Si no se cumple ninguna de las condiciones anteriores, entonces ambos


operandossonconvertidosaltipoint.

DesarrollodeAplicacionesWeb

Tema2

6.1.2 - Conversin de nmeros en Coma flotante (float, double) a enteros (int)


Cuando convertimos nmeros en coma flotante a nmeros enteros, la parte decimal se
trunca(redondeoacero).Siqueremoshacerotrotipoderedondeo,podemosutilizar,entre
otras,lassiguientesfunciones:
Math.round(num):Redondeoalsiguientenmeroentero.
Math.ceil(num):Mnimoenteroqueseamayoroigualanum.
Math.floor(num):Enteromayor,queseainferioroigualanum.

double num=3.5;
x=Math.round(num);
y=Math.ceil(num);
z=Math.floor(num);

// x = 4
// y = 4
// z = 3

6.1.3 - Conversiones entre caracteres (char) y enteros (int)


Como un tipo char lo que guarda en realidad es el cdigo Unicode de un carcter, los
caracterespuedenserconsideradoscomonmerosenterossinsigno.
Ejemplo:
int num;
char c;
num = (int) A;
c = (char) 65;
c = (char) ((int) A + 1);

//num = 65
// c = A
// c = B

6.1.4 - Conversiones de tipo con cadenas de caracteres (String)


Paraconvertircadenasdetextoaotrostiposdedatosseutilizanlassiguientesfunciones:
num=Byte.parseByte(cad);
num=Short.parseShort(cad);
num=Integer.parseInt(cad);
num=Long.parseLong(cad);
num=Float.parseFloat(cad);
num=Double.parseDouble(cad);

Porejemplo,sihemosledodetecladounnmeroqueestalmacenadoenunavariablede
tipo String llamada cadena, y lo queremos convertir al tipo de datos byte, haramos lo
siguiente:
byte n=Byte.parseByte(cadena);

31

Creacindemiprimerprograma

DAW

7. Comentarios.
CASO
Juan ha podido comprobar los avances que ha hecho Mara con la programacin. Ya domina todos
los aspectos bsicos sobre sintaxis, estructura de un programa, variables y tipos de datos. Ada le
acaba de comunicar que van a sumarse al proyecto dos personas ms, Ana y Carlos que estn
haciendo las prcticas del ciclo de Desarrollo de Aplicaciones Multiplataforma en la empresa. Al
principio de cada programa indicaremos una breve descripcin y el autor. En operaciones
complicadas podramos aadir un comentario les ayudar a entender mejor qu es lo que hace
indica Juan. De acuerdo comenta Mara, y podemos ir metiendo los comentarios de la
herramienta esa que me comentaste, Javadoc, para que se cree una documentacin an ms
completa. Aj! asiente Juan, pues manos a la obra!

Loscomentariossonmuyimportantesalahoradedescribirquhaceundeterminadoprograma.A
lolargodelaunidadloshemosutilizadoparadocumentarlosejemplosymejorarlacomprensindel
cdigo. Para lograr ese objetivo, es normal que cada programa comience con unas lneas de
comentario que indiquen, al menos, una breve descripcin del programa, el autor del mismo y la
ltimafechaenquesehamodificado.
Todos los lenguajes de programacin disponen de alguna forma de introducir comentarios en el
cdigo.EnelcasodeJava,nospodemosencontrarlossiguientestiposdecomentarios:

Comentariosdeunasolalnea.Utilizaremoseldelimitador//paraintroducircomentariosde
slounalnea.
// comentario de una sola lnea

Comentariosdemltipleslneas.Paraintroducirestetipodecomentarios,utilizaremosuna
barrainclinadayunasterisco(/*),alprincipiodelprrafoyunasteriscoseguidodeunabarra
inclinada(*/)alfinaldelmismo.
/* Esto es un comentario
de varias lneas */

Comentarios Javadoc. Utilizaremos los delimitadores /** y */. Al igual que con los
comentarios tradicionales, el texto entre estos delimitadores ser ignorado por el
compilador. Este tipo de comentarios se emplean para generar documentacin automtica
del programa. A travs del programa javadoc, incluido en JavaSE, se recogen todos estos
comentariosysellevanaundocumentoenformato.html.
/** Comentario de documentacin.
Javadoc extrae los comentarios del cdigo y
genera un archivo html a partir de este tipo de comentarios
*/

RECOMENDACIN
Una buena prctica de programacin es aadir en la ltima llave que delimita cada bloque de cdigo,
un comentario indicando a qu clase o mtodo pertenece esa llave.

PARASABERMS
SiquieresirfamiliarizndoteconlainformacinquehayenlawebdeOracle,enelsiguiente
enlacepuedesencontrarmsinformacinsobrelaherramientaJavadocincluidaenelKitde
DesarrollodeJavaSE(eningls):
http://download.oracle.com/javase/6/docs/technotes/guides/javadoc/index.html

32

DesarrollodeAplicacionesWeb

Tema3

INDICE

1.Introduccin...................................................................................................................................2
2.FundamentosdelaProgramacinOrientadaaObjetos................................................................3
2.1.Conceptos...............................................................................................................................................4
2.2.Beneficios................................................................................................................................................5
2.3.Caractersticas.........................................................................................................................................6
2.4.Lenguajesdeprogramacinorientadosaobjetos..................................................................................7
3.ClasesyObjetos.Caractersticasdelosobjetos............................................................................9
3.1.Propiedadesymtodosdelosobjetos.................................................................................................10
3.2.Interaccinentreobjetos......................................................................................................................10
3.3.Clases....................................................................................................................................................11
4.Utilizacindeobjetos...................................................................................................................13
4.1.Ciclodevidadelosobjetos...................................................................................................................14
4.2.Declaracin...........................................................................................................................................14
4.3.Instanciacin.........................................................................................................................................15
4.4.Manipulacin........................................................................................................................................16
4.5.Destruccindeobjetosyliberacindememoria.................................................................................17
5.Utilizacindemtodos................................................................................................................19
5.1.Parmetrosyvaloresdevueltos............................................................................................................20
5.3.Eloperadorthis.....................................................................................................................................22
5.4.Mtodosestticos.................................................................................................................................23
6.Librerasdeobjetos(paquetes)...................................................................................................25
6.1.Sentenciaimport...................................................................................................................................26
6.2.Compilaryejecutarclasesconpaquetes..............................................................................................27
6.3.Jerarquadepaquetes..........................................................................................................................28
6.4.LibrerasJava.........................................................................................................................................29
7.Programacindelaconsola:entradaysalidadelainformacin................................................31
7.1.ConceptossobrelaclaseSystem..........................................................................................................32
7.2.Entradaporteclado.ClaseSystem.......................................................................................................33
7.3.Entradaporteclado.ClaseScanner......................................................................................................33
7.4.Salidaporpantalla................................................................................................................................35
7.5.Salidadeerror.......................................................................................................................................36

Utilizacindeobjetos

DAW

Utilizacindeobjetos.
Caso prctico
Ada y Juan se han reunido para discutir sobre distintos proyectos de BK Programacin. Ada le
comenta a Juan que estn teniendo algunos problemas con determinados proyectos. A menudo
surgen modificaciones o mejoras en el software en el mbito de los contratos de mantenimiento que
tienen suscritos con los clientes, y realizar las modificaciones en los programas est suponiendo en
muchos casos modificar el programa casi en su totalidad.
A eso se ha de sumar que las tareas de modificacin son encargadas a las personas ms adecuadas
en ese momento, segn la carga de trabajo que haya; que no tienen por qu coincidir con las
personas que desarrollaron el programa. Las modificaciones en los proyectos se estn retrasando, y
hay algunas que deben estar listas antes de que surja el nuevo cambio de versin.
En reuniones anteriores se ha comentado la posibilidad de aumentar el precio del contrato de
mantenimiento de los clientes. Se ha consultado con el equipo de comerciales y a regaadientes han
aceptado un aumento que an est por decidir, pero an as quizs no sea suficiente. La empresa
necesita mejorar el mtodo de trabajo para reducir costes de mantenimiento del software y alcanzar
la rentabilidad deseada.

1.- Introduccin.
Sinosparamosaobservarelmundoquenosrodea,podemosapreciarquecasitodoestformado
por objetos. Existen coches, edificios, sillas, mesas, semforos, ascensores e incluso personas o
animales. Todos ellos pueden ser considerados objetos, con una serie de caractersticas y
comportamientos.Porejemplo,existencochesdediferentesmarcas,colores,etc.ypuedenacelerar,
frenar, girar, etc., o las personas tenemos diferente color de pelo, ojos, altura y peso y podemos
nacer,crecer,comer,dormir,etc.
Los programas son el resultado de la bsqueda y obtencin de una solucin para un problema del
mundo real. Pero en qu medida los programas estn organizados de la misma manera que el
problemaquetratandesolucionar?Larespuestaesquemuchasveceslosprogramasseajustanms
alostrminosdelsistemaenelqueseejecutarnquealosdelpropioproblema.
Si redactamos los programas utilizando los mismos trminos de nuestro mundo real, es decir,
utilizando objetos, y no los trminos del sistema o computadora donde se vaya a ejecutar,
conseguiremosquestosseanmslegiblesy,portanto,msfcilesdemodificar.
Esto es precisamente lo que pretende la Programacin Orientada a Objetos (POO), en ingls OOP
(Object Oriented Programming), establecer una serie de tcnicas que permitan trasladar los
problemasdelmundorealanuestrosistemainformtico.Ahoraqueyaconocemoslasintaxisbsica
de Java, es el momento de comenzar a utilizar las caractersticas orientadas a objetos de este
lenguaje,yestudiarlosconceptosfundamentalesdeestemodelodeprogramacin.

DesarrollodeAplicacionesWeb

2.- Fundamentos de
Orientada a Objetos.

Tema3

la

Programacin

Caso prctico
Juan cuenta con la ayuda de Mara para desarrollar la aplicacin para la Clnica Veterinaria. Lo
normal es pensar en tener una aplicacin de escritorio para las altas y bajas de clientes y la gestin
de mascotas, y una parte web para que la clnica pueda estar presente en Internet e, incluso, realizar
la venta on-line de sus productos. Mara tiene bastante experiencia en administracin de pginas
web, pero para estar capacitada en el desarrollo de aplicaciones en Java, necesita adquirir
conocimientos adicionales.
Juan le explica que tienen que utilizar un mtodo de programacin que les ayude a organizar los
programas, a trabajar en equipo de forma que si uno de ellos tiene que dejar una parte para que se
encargue el otro, que ste lo pueda retomar con el mnimo esfuerzo. Adems, interesa poder reutilizar
todo el cdigo que vayan creando, para ir ms rpido a la hora de programar. Juan le explica que si
consiguen adoptar ese mtodo de trabajo, no slo redundar en una mejor organizacin para ellos,
sino que ayudar a que las modificaciones en los programas sean ms llevaderas de lo que lo estn
siendo ahora.
Mara asiente ante las explicaciones de Juan, e intuye que todo lo entender mejor conforme vaya
conociendo los conceptos de Programacin Orientada a Objetos.
De lo que realmente se trata es de que BK Programacin invierta el menor tiempo posible en los
proyectos que realice, aprovechando material elaborado con el esfuerzo ya realizado en otras
aplicaciones.

Dentro de las distintas formas de hacer las cosas en programacin, distinguimos dos paradigmas
fundamentales:
9 ProgramacinEstructurada,secreanfuncionesyprocedimientosquedefinenlasaccionesa
realizar,yqueposteriormenteformanlosprogramas.
9 ProgramacinOrientadaaObjetos,consideralosprogramasentrminosdeobjetosytodo
giraalrededordeellos.
Peroenquconsistenrealmenteestosparadigmas?Veamosestosdosmodelosdeprogramacin
con ms detenimiento. Inicialmente se programaba aplicando las tcnicas de programacin
tradicional, tambin conocidas como Programacin Estructurada. El problema se descompona en
unidades ms pequeas hasta llegar a acciones o verbos muy simples y fciles de codificar. Por
ejemplo, en la resolucin de una ecuacin de primer grado, lo que hacemos es descomponer el
problemaenaccionesmspequeasopasosdiferenciados:
9 Pedirvalordeloscoeficientes.
9 Calcularelvalordelaincgnita.
9 Mostrarelresultado.
Sinosdamoscuenta,estaseriedeaccionesopasosdiferenciadosnosonotracosaqueverbos;por
ejemploelverbopedir,calcular,mostrar,etc.
Sin embargo, la Programacin Orientada a Objetos aplica de otra forma diferente la tcnica de
programacin"divideyvencers".Esteparadigmasurgeenunintentodesalvarlasdificultadesque,
deformainnata,poseeelsoftware.Paraelloloquehaceesdescomponer,enlugardeacciones,en
objetos. El principal objetivo sigue siendo descomponer el problema en problemas ms pequeos,
que sean fciles de manejar y mantener, fijndonos en cul es el escenario del problema e
intentando reflejarlo en nuestro programa. O sea, se trata de trasladar la visin del mundo real a
nuestrosprogramas.PorestemotivosedicequelaProgramacinOrientadaaObjetosabordalos

Utilizacindeobjetos

DAW

problemasdeunaformamsnatural,entendiendocomonaturalqueestmsencontactoconel
mundoquenosrodea.
La Programacin Estructurada se centra en el conjunto de acciones a realizar en un programa,
haciendo una divisin de procesos y datos. La Programacin Orientada a Objetos se centra en la
relacin que existe entre los datos y las acciones a realizar con ellos, y los encierra dentro del
conceptodeobjeto,tratandoderealizarunaabstraccinlomscercanaalmundoreal.

La Programacin Orientada a Objetos es un sistema o conjunto de reglas que nos ayudan a


descomponerlaaplicacinenobjetos.Amenudosetrataderepresentarlasentidadesyobjetos
que nos encontramos en el mundo real mediante componentes de una aplicacin. Es decir,
debemosestablecerunacorrespondenciadirectaentreelespaciodelproblemayelespaciodela
solucin.Peroenlaprcticaestoququieredecir?Puesquealahoradeescribirunprograma,nos
fijaremosenlosobjetosinvolucrados,suscaractersticascomunesylasaccionesquepuedenrealizar.
Una vez localizados los objetos que intervienen en el problema real (espacio del problema), los
tendremosquetrasladaralprogramainformtico(espaciodelasolucin).Conesteplanteamiento,
lasolucinaunproblemadadoseconvierteenunatareasencillaybienorganizada.

Autoevaluacin
Relaciona el trmino con su definicin, escribiendo el nmero asociado a la definicin en
el hueco correspondiente.
Ejercicio de relacionar
Paradigma
Relacin
Definicin
Programacin Orientada 2
1. Maneja funciones y procedimientos que definen las
a Objetos.
acciones a realizar.
Programacin
2. Representa las entidades del mundo real mediante
1
Estructurada.
componentes de la aplicacin.
La Programacin Orientada a Objetos y la Programacin Estructurada son paradigmas o modelos de programacin.

2.1.Conceptos.
Para entender mejor la filosofa de orientacin a objetos veamos algunas caractersticas que la
diferenciandelastcnicasdeprogramacintradicional.
En la Programacin Estructurada, el programa estaba compuesto por un conjunto de datos y
funciones "globales". El trmino global significaba que eran accesibles por todo el programa,
pudiendoserllamadosencualquierubicacindelaaplicacin.Dentrodelasfuncionessesituaban
las instrucciones del programa que manipulaban los datos. Funciones y datos se encontraban
separadosytotalmenteindependientes.Estoocasionabadosproblemasprincipales:
9

Losprogramassecreabanyestructurabandeacuerdoconlaarquitecturadelacomputadora
dondesetenanqueejecutar.

Al estar separados los datos de las funciones, stos eran


visiblesentodalaaplicacin.Elloocasionabaquecualquier
modificacinenlosdatospodarequerirlamodificacinen
todas las funciones del programa, en correspondencia con
loscambiosenlosdatos.

DesarrollodeAplicacionesWeb

Tema3

EnlaProgramacinOrientadaaObjetoslasituacinesdiferente.Lautilizacindeobjetospermite
un mayor nivel de abstraccin que con la Programacin Estructurada, y ofrece las siguientes
diferenciasconrespectoasta:
9

Elprogramadororganizasuprogramaenobjetos,queson
representacionesdelmundorealqueestnmscercanas
alaformadepensardelagente.

Losdatos,juntoconlasfuncionesquelosmanipulan,son
parteinternadelosobjetosynoestnaccesiblesalresto
de los objetos. Por tanto, los cambios en los datos de un
objeto slo afectan a las funciones definidas para ese
objeto,peronoalrestodelaaplicacin.

TodoslosprogramasescritosbajoelparadigmaorientadoaObjetossepuedenescribirigualmente
mediantelaProgramacinEstructurada.Sinembargo,laProgramacinOrientadaaObjetoseslaque
mayorfacilidadpresentaparaeldesarrollodeprogramasbasadoseninterfacesgrficasdeusuario.

2.2.Beneficios.
Segnloquehemosvistohastaahora,un
objeto es cualquier entidad que podemos
veroapreciar.Elconceptofundamentalde
la Programacin Orientada a Objetos son,
precisamente, los objetos. Pero qu
beneficios aporta la utilizacin de objetos?
Fundamentalmente la posibilidad de
representar el problema en trminos del
mundo real, que como hemos dicho estn
ms cercanos a nuestra forma de pensar,
pero existen otra serie de ventajas como
lassiguientes:

Comprensin.Losconceptosdelespaciodelproblemasehayanreflejadosenelcdigodel
programa,porloquelameralecturadelcdigonosdescribelasolucindelproblemaenel
mundoreal.

Modularidad. Facilita la modularidad del cdigo, al estar las definiciones de objetos en


mdulos o archivos independientes, hace que las aplicaciones estn mejor organizadas y
seanmsfcilesdeentender.

Fcil mantenimiento. Cualquier modificacin en las acciones queda automticamente


reflejada en los datos, ya que ambos estn estrechamente relacionados. Esto hace que el
mantenimiento de las aplicaciones, as como su correccin y modificacin sea mucho ms
fcil.Porejemplo,podemosquererutilizarunalgoritmomsrpido,sintenerquecambiarel
programaprincipal.Porotraparte,alestarlasaplicacionesmejororganizadas,esmsfcil
localizarcualquierelementoquesequieramodificary/ocorregir.Estoesimportanteyaque

Utilizacindeobjetos

DAW

seestimaquelosmayorescostesdesoftwarenoestnenelprocesodedesarrolloens,sino
enelmantenimientoposteriordeesesoftwarealolargodesuvidatil.
9

Seguridad.Laprobabilidaddecometererroressevereducida,yaquenopodemosmodificar
los datos de un objeto directamente, sino que debemos hacerlo mediante las acciones
definidas para ese objeto. Imaginemos un objeto lavadora. Se compone de un motor,
tambor, cables, tubos, etc. Para usar una lavadora no se nos ocurre abrirla y empezar a
manipular esos elementos, ya que lo ms probable es que se estropee. En lugar de eso
utilizamos los programas de lavado establecidos. Pues algo parecido con los objetos, no
podemosmanipularlosinternamente,sloutilizarlasaccionesqueparaelloshaydefinidas.

Reusabilidad. Los objetos se definen como entidades reutilizables, es decir, que los
programas que trabajan con las mismas estructuras de informacin, pueden reutilizar las
definicionesdeobjetosempleadasenotrosprogramas,einclusolasaccionesdefinidassobre
ellos. Por ejemplo, podemos crear la definicin de un objeto de tipo persona para una
aplicacin de negocios y deseamos construir a continuacin otra aplicacin, digamos de
educacin,endondeutilizamostambinpersonas,noesnecesariocreardenuevoelobjeto,
sino que por medio de la reusabilidad podemos utilizar el tipo de objeto persona
previamentedefinido.

Citas para pensar


Primeroresuelveelproblema.Entonces,escribeelcdigo.
JohnJohnson

2.3.Caractersticas.
CuandohablamosdeProgramacinOrientadaaObjetos,existenunaseriedecaractersticasquese
deben cumplir. Cualquier lenguaje de programacin orientado a objetos las debe contemplar. Las
caractersticasmsimportantesdelparadigmadelaprogramacinorientadaaobjetosson:
9

Abstraccin. Es el proceso por el cual definimos las caractersticas ms importantes de un


objeto,sinpreocuparnosdecmoseescribirnenelcdigodelprograma,simplementelo
definimos de forma general. En la Programacin Orientada a Objetos la herramienta ms
importante para soportar la abstraccin es la clase. Bsicamente, una clase es un tipo de
datoqueagrupalascaractersticascomunesdeunconjuntodeobjetos.Poderverlosobjetos
del mundo real que deseamos trasladar a nuestros programas, en trminos abstractos,
resultadegranutilidadparaunbuendiseodelsoftware,yaquenosayudaacomprender
mejorelproblemayatenerunavisinglobaldetodoelconjunto.Porejemplo,sipensamos
enunaclaseVehculoqueagrupalascaractersticascomunesdetodosellos,apartirdedicha
clasepodramoscrearobjetoscomoCocheyCamin.EntoncessedicequeVehculoesuna
abstraccindeCocheydeCamin.

Modularidad. Una vez que hemos representado el escenario del problema en nuestra
aplicacin,tenemoscomoresultadounconjuntodeobjetossoftwareautilizar.Esteconjunto
de objetos se crean a partir de una o varias clases. Cada clase se encuentra en un archivo
diferente,porloquelamodularidadnospermitemodificarlascaractersticasdelaclaseque
defineunobjeto,sinqueestoafectealrestodeclasesdelaaplicacin.

DesarrollodeAplicacionesWeb

Tema3

9 Encapsulacin. Tambin llamada "ocultamiento de la informacin". La encapsulacin o


encapsulamientoeselmecanismobsicoparaocultarlainformacindelaspartesinternas
de un objeto a los dems objetos de la aplicacin. Con la encapsulacin un objeto puede
ocultarlainformacinquecontienealmundoexterior,obienrestringirelaccesoalamisma
para evitar ser manipulado de forma inadecuada. Por ejemplo, pensemos en un programa
condosobjetos,unobjetoPersonayotroCoche.PersonasecomunicaconelobjetoCoche
parallegarasudestino,utilizandoparaellolasaccionesqueCochetengadefinidascomopor
ejemploconducir.Esdecir,PersonautilizaCocheperonosabecmofuncionainternamente,
slosabeutilizarsusmtodosoacciones.
9

Jerarqua. Mediante esta propiedad


podemos definir relaciones de jerarquas
entre clases y objetos. Las dos jerarquas
ms importantes son la jerarqua "es un"
llamadageneralizacinoespecializaciny
la jerarqua "es parte de", llamada
agregacin. Conviene detallar algunos
aspectos:
Lageneralizacinoespecializacin,tambinconocidacomoherencia,permitecrear

unaclasenuevaentrminosdeunaclaseyaexistente(herenciasimple)odevarias
clases ya existentes (herencia mltiple). Por ejemplo, podemos crear la clase
CochedeCarreras a partir de la clase Coche, y as slo tendremos que definir las
nuevascaractersticasquetenga.
La agregacin, tambin conocida como inclusin, permite agrupar objetos

relacionados entre s dentro de una clase. As, un Coche est formado por Motor,
Ruedas,FrenosyVentanas.SedicequeCocheesunaagregacinyMotor,Ruedas,
FrenosyVentanassonagregadosdeCoche.
9

Polimorfismo.Estapropiedadindicalacapacidaddequevariasclasescreadasapartirdeuna
antecesorarealicenunamismaaccindeformadiferente.Porejemplo,pensemosenlaclase
Animalylaaccindeexpresarse.NosencontramosquecadatipodeAnimalpuedehacerlo
demaneradistinta,losPerrosladran,losGatosmaullan,lasPersonashablamos,etc.Dicho
deotramanera,elpolimorfismoindicalaposibilidaddetomarunobjeto(detipoAnimal,por
ejemplo),eindicarlequerealicelaaccindeexpresarse,estaaccinserdiferentesegnel
tipodemamferodelquesetrate.

2.4.Lenguajesdeprogramacinorientadosaobjetos.
Unapanormicadelaevolucindeloslenguajesdeprogramacinorientadosaobjetoshastallegara
losutilizadosactualmenteeslasiguiente:
9

Simula(1962).ElprimerlenguajeconobjetosfueB1000en1961,seguidoporSketchpaden
1962,elcualcontenaclonesocopiasdeobjetos.Sinembargo,fueSimulaelprimerlenguaje
que introdujo el concepto de clase, como elemento que incorpora datos y las operaciones
sobreesosdatos.En1967surgiSimula67queincorporabaunmayornmerodetiposde
datos,ademsdelapoyoaobjetos.

Utilizacindeobjetos

DAW

9 SmallTalk(1972).BasadoenSimula67,laprimeraversinfueSmalltalk72,alaquesigui
Smalltalk 76, versin totalmente orientada a objetos. Se caracteriza por soportar las
principales propiedades de la Programacin Orientada a Objetos y por poseer un entorno
quefacilitaelrpidodesarrollodeaplicaciones.ElModeloVistaControlador(MVC)fueuna
importantecontribucindeestelenguajealmundodelaprogramacin.EllenguajeSmalltalk
hainfluidosobreotrosmuchoslenguajescomoC++yJava.
9

C++ (1985). C++ fue diseado por Bjarne Stoustrup en los laboratorios donde trabajaba,
entre1982y1985.LenguajequederivadelC,alqueaadeunaseriedemecanismosquele
conviertenenunlenguajeorientadoaobjetos.Notienerecolectordebasuraautomtica,lo
que obliga a utilizar un destructor de objetos no utilizados. En este lenguaje es donde
aparece el concepto de clase tal y como lo conocemos actualmente, como un conjunto de
datosyfuncionesquelosmanipulan.

Eiffel(1986).Creadoen1985porBertrandMeyer,recibesunombreenhonoralafamosa
torredePars.Tieneuna sintaxissimilaraC.Soportatodaslaspropiedades fundamentales
delosobjetos,utilizadosobretodoenambientesuniversitariosydeinvestigacin.Entresus
caractersticasdestacalaposibilidaddetraduccindecdigoEiffelaLenguajeC.Aunquees
unlenguajebastantepotente,nologrlaaceptacindeC++yJava.

Java (1995). Diseado por Gosling de Sun Microsystems a finales de 1995. Es un lenguaje
orientado a objetos diseado desde cero, que recibe muchas influencias de C++. Como
sabemos, se caracteriza porque produce un bytecode que posteriormente es interpretado
porlamquinavirtual.LarevolucindeInternethainfluidomuchoenelaugedeJava.

C#(2000).EllenguajeC#,tambinesconocidocomoSharp.FuecreadoporMicrosoft,como
una ampliacin de C con orientacin a objetos. Est basado en C++ y en Java. Una de sus
principalesventajasqueevitamuchosdelosproblemasdediseodeC++.

Autoevaluacin
Relaciona los lenguajes de programacin indicados con la caracterstica
correspondiente, escribiendo el nmero asociado a la caracterstica en el hueco
correspondiente.
Ejercicio de relacionar
Lenguaje de programacin Relacin
Tiene la caracterstica de que
1. Fue el primer lenguaje que introdujo el
3
Java
concepto de clase.
2. Introdujo el concepto del Modelo-Vista2
SmallTalk
Controlador.
3. Produce un bytecode para ser interpretado por
1
Simula
la mquina virtual.
4. Introduce el concepto de clase tal cual lo
4
C++
conocemos, con atributos y mtodos.
C++ fue diseado basndose en C y aadindole la orientacin a objetos. Posteriormente, surgira Java, que recibi
influencias de C++ y de Ada-95.

DesarrollodeAplicacionesWeb

Tema3

3.- Clases y Objetos. Caractersticas de los


objetos.
Caso prctico
Mara ha hecho un descanso de cinco minutos. Se est tomando un caf y est repasando los
conceptos de Programacin Orientada a Objetos. Piensa que este paradigma supone un cambio de
enfoque con respecto a las tcnicas tradicionales. Ahora lo que necesita es ahondar en el concepto
de objeto, que parece ser el eje central de este modelo de programacin.

Al principio de la unidad veamos que el mundo real est compuesto de objetos, y podemos
considerarobjetoscasicualquiercosaquepodemosverysentir.Cuandoescribimosunprogramaen
un lenguaje orientado a objetos, debemos identificar cada una de las partes del problema con
objetospresentesenelmundoreal,paraluegotrasladarlosalmodelocomputacionalqueestamos
creando.
En este contexto, un objeto de software es una representacin de un objeto del mundo real,
compuesto de una serie de caractersticas y un comportamiento especfico. Pero qu es ms
concretamenteunobjetoenProgramacinOrientadaaObjetos?Vemoslo.
Unobjetoesunconjuntodedatosconlasoperacionesdefinidasparaellos.Losobjetostienenun
estadoyuncomportamiento.

Por tanto, estudiando los objetos que estn


presentes en un problema podemos dar con la
solucin a dicho problema. Los objetos tienen unas
caractersticasfundamentalesquelosdistinguen:
9

Identidad. Es la caracterstica que permite


diferenciar un objeto de otro. De esta
manera,aunquedosobjetosseanexactamenteigualesensusatributos,sondistintosentre
s.Puedeserunadireccindememoria,elnombredelobjetoocualquierotroelementoque
utiliceellenguajeparadistinguirlos.Porejemplo,dosvehculosquehayansalidodelamisma
cadenadefabricacinyseanigualesaparentemente,sondistintosporquetienenuncdigo
quelosidentifica.

Estado.Elestadodeunobjetovienedeterminadoporunaseriedeparmetrosoatributos
quelodescriben,ylosvaloresdestos.Porejemplo,sitenemosunobjetoCoche,elestado
estaradefinidoporatributoscomoMarca,Modelo,Color,Cilindrada,etc.

Comportamiento.Sonlasaccionesquesepuedenrealizarsobreelobjeto.Enotraspalabras,
sonlosmtodosoprocedimientosquerealizaelobjeto.Siguiendoconelejemplodelobjeto
Coche, el el comportamiento seran acciones como: arrancar(), parar(),
acelerar(),frenar(),etc.

Utilizacindeobjetos

DAW

3.1.Propiedadesymtodosdelosobjetos.
Como acabamos de ver todo objeto tiene un estado y un comportamiento. Concretando un poco
ms,laspartesdeunobjetoson:
9

Campos, Atributos o Propiedades: Parte del


objeto que almacena los datos. Tambin se les
denomina Variables Miembro. Estos datos
pueden ser de cualquier tipo primitivo
(boolean, char, int, double, etc) o ser su
vezserotroobjeto.Porejemplo,unobjetodela
clase Coche puede tener un objeto de la clase
Ruedas.
9 Mtodos o Funciones Miembro: Parte del
objetoquellevaacabolasoperacionessobrelos
atributosdefinidosparaeseobjeto.
La idea principal es que el objeto rene en una sola entidad los datos y las operaciones, y para
acceder a los datos privados del objeto debemos utilizar los mtodos que hay definidos para ese
objeto.
La nica forma de manipular la informacin del objeto es a travs de sus mtodos. Es decir, si
queremossaberelvalordealgnatributo,tenemosqueutilizarelmtodoquenosmuestreelvalor
deeseatributo.Deestaforma,evitamosquemtodosexternospuedanalterarlosdatosdelobjeto
demanerainadecuada.Sedicequelosdatosylosmtodosestnencapsuladosdentrodelobjeto.

3.2.Interaccinentreobjetos.
Dentrodeunprogramalosobjetossecomunicanllamandounosaotrosasusmtodos.Losmtodos
estndentrodelosobjetosydescribenelcomportamientodeunobjetocuandorecibeunallamada
a uno de sus mtodos. En otras palabras, cuando un objeto, objeto1, quiere actuar sobre otro,
objeto2,tienequeejecutarunodesusmtodos.Entoncessedicequeelobjeto2recibeunmensaje
delobjeto1.
Unmensajeeslaaccinquerealizaunobjeto.Unmtodoeslafuncinoprocedimientoalquese
llamaparaactuarsobreunobjeto.
Losdistintosmensajesquepuederecibirunobjetooalosquepuederesponderrecibenelnombre
deprotocolodeeseobjeto.
Elprocesodeinteraccinentreobjetossesueleresumirdiciendoqueseha"enviadounmensaje"
(hecho una peticin) a un objeto, y el objeto determina "qu hacer con el mensaje" (ejecuta el
cdigodelmtodo).Cuandoseejecutaunprogramaseproducenlassiguientesacciones:
9

Creacindelosobjetosamedidaquesenecesitan.

Comunicacinentrelosobjetosmedianteelenvodemensajesunosaotros,oelusuarioa
losobjetos.

Eliminacindelosobjetoscuandonosonnecesariosparadejarespaciolibreenlamemoria
delcomputador.

10

DesarrollodeAplicacionesWeb

Tema3

Losobjetossepuedencomunicarentreellosinvocandoalosmtodosdelosotrosobjetos.

Autoevaluacin
Cuando un objeto, objeto1, ejecuta un mtodo de otro, objeto2, se dice que el objeto2 le
ha mandado un mensaje al objeto1.
Verdadero.

Falso.

En este caso se dice que es el objeto1 el que le ha mandado un mensaje al objeto2.

3.3.Clases.
Hasta ahora hemos visto lo que son los objetos. Un
programa informtico se compone de muchos objetos,
algunos de los cuales comparten la misma estructura y
comportamiento. Si tuviramos que definir su estructura y
comportamiento objeto cada vez que queremos crear un
objeto,estaramosutilizandomuchocdigoredundante.Por
ello lo que se hace es crear una clase, que es una
descripcindeunconjuntodeobjetosquecompartenunaestructurayuncomportamientocomn.
Yapartirdelaclase,secreantantas"copias"o"instancias"comonecesitemos.Esascopiassonlos
objetosdelaclase.
Lasclasesconstandedatosymtodosqueresumenlascaractersticascomunesdeunconjuntode
objetos.Unprogramainformticoestcompuestoporunconjuntodeclases,apartirdelascualesse
creanobjetosqueinteractanentres.
Si recuerdas, cuando utilizbamos los tipos de datos enumerados, los definamos con la palabra
reservadaenum ylalistadevaloresentrellaves,ydecamosqueuntipodedatosenum noesotra
cosa que una especie de clase en Java. Efectivamente, todas las clases llevan su contenido entre
llaves.Yunaclasetienelamismaestructuraqueuntipodedatoenumerado,aadindoleunaserie
demtodosyvariables.
Enotraspalabras,unaclaseesunaplantillaoprototipodondeseespecifican:
9 Losatributoscomunesatodoslosobjetosdelaclase.
9 Losmtodosquepuedenutilizarseparamanejaresosobjetos.
Para declarar una clase en Java se utiliza la palabra reservada class. La declaracin de una clase
estcompuestapor:
9 Cabecera de la clase. La cabecera es un poco ms
compleja que como aqu definimos, pero por ahora
slo nos interesa saber que est compuesta por una
serie de modificadores, en este caso hemos puesto
publicqueindicaqueesunaclasepblicaalaque
puedenaccederotrasclasesdelprograma,lapalabra
reservadaclassyelnombredelaclase.
9 Cuerpo de la clase. En l se especifican encerrados
entrellaveslosatributosylosmtodosquevaatener
laclase.

11

Utilizacindeobjetos

DAW

Enlaunidadanterioryahemosutilizadoclases,aunqueannosabamossusignificadoexacto.Por
ejemplo, en los ejemplos de la unidad o en la tarea, estbamos utilizando clases, todas ellas eran
clases principales, no tenan ningn atributo y el nico mtodo del que disponan era el mtodo
main().
Elmtodomain()seutilizaparaindicarquesetratadeunaclaseprincipal,apartirdelacualvaa
empezarlaejecucindelprograma.Estemtodonoaparecesilaclasequeestamoscreandonovaa
serlaclaseprincipaldelprograma.

12

DesarrollodeAplicacionesWeb

Tema3

4.- Utilizacin de objetos.


Caso prctico
Mara sigue fuera de la oficina. Esta noche en casa quiere repasar conceptos sobre Programacin
Orientada a objetos, as que aprovecha un momento para llamar a Juan y le comenta:
-Ya s todo sobre objetos -le dice- slo que...
-Solo qu? -aade Juan.
-Solo me falta saber... cmo se crea un objeto?
Juan sonre ante la pregunta de Mara, y le explica que los objetos se crean como si fuera declarando
una variable ms, tan slo que el tipo de datos de dicho objeto ser una clase. Tras declararlos hay
que instanciarlos con la orden new para reservar memoria para ellos, y despus ya podremos
utilizarlos, refirindonos a su contenido con el operador punto.
-Te mando un documento por email que lo explica todo muy bien.
-Ah, gracias! Esta noche le echo un vistazo -aade Mara.

Unavezquehemoscreadounaclase,podemoscrearobjetosennuestroprogramaapartirdeesas
clases.
Cuando creamos un objeto a partir de una clase se dice que hemos creado una "instancia de la
clase". A efectos prcticos, "objeto" e "instancia de clase" son trminos similares. Es decir, nos
referimos a objetos como instancias cuando queremos hacer hincapi que son de una clase
particular.
Losobjetossecreanapartirdelasclases,yrepresentancasosindividualesdestas.

Para entender mejor el concepto entre un objeto y su clase, piensa en un molde de galletas y las
galletas. El molde sera la clase, que define las caractersticas del objeto, por ejemplo su forma y
tamao.Lasgalletascreadasapartirdeesemoldesonlosobjetosoinstancias.
Otro ejemplo, imagina una clase Persona que rena las caractersticas comunes de las personas
(color de pelo, ojos, peso, altura, etc.) y las acciones que pueden realizar (crecer, dormir, comer,
etc.).PosteriormentedentrodelprogramapodremoscrearunobjetoTrabajadorqueestbasadoen
esaclasePersona.EntoncessedicequeelobjetoTrabajadoresunainstanciadelaclasePersona,o
quelaclasePersonaesunaabstraccindelobjetoTrabajador.
Cualquierobjetoinstanciadodeunaclasecontieneunacopiadetodoslosatributosdefinidosenla
clase. En otras palabras, lo que estamos haciendo es reservar un espacio en la memoria del
ordenador para guardar sus atributos y mtodos. Por tanto, cada objeto tiene una zona de
almacenamientopropiadondeseguardatodasuinformacin,queserdistintaaladecualquierotro
objeto.Alasvariablesmiembroinstanciadastambinselesllamavariablesinstancia.Deigualforma,
alosmtodosquemanipulanesasvariablesselesllamamtodosinstancia.
En el ejemplo del objeto Trabajador, las variables instancia seran color_de_pelo, peso,
altura,etc.Ylosmtodosinstanciaserancrecer(),dormir(),comer(),etc.

Autoevaluacin
Las variables instancia son un tipo de variables miembro.
Verdadero.

Falso.

Lasvariablesmiembropuedenservariablesinstanciaovariablesdeclase.Esteltimotipoesuncasoparticularcuandoel
valordelavariableoatributoescompartidoportodoslosobjetosdelaclase.

13

Utilizacindeobjetos

DAW

4.1.Ciclodevidadelosobjetos.

Todo programa en Java parte de una nica clase, que


como hemos comentado se trata de la clase principal.
Estaclaseejecutarelcontenidodesumtodomain(),el
cual ser el que utilice las dems clases del programa,
creeobjetosylancemensajesaotrosobjetos.
Las instancias u objetos tienen un tiempo de vida
determinado.Cuandounobjetonosevaautilizarmsen
el programa, es destruido por el recolector de basura para liberar recursos que pueden ser
reutilizadosporotrosobjetos.
Alavistadeloanterior,podemosconcluirquelosobjetostienenunciclodevida,enelcualpodemos
distinguirlassiguientesfases:
9

Creacin,dondesehacelareservadememoriaeinicializacindeatributos.

Manipulacin,quesellevaacabocuandosehaceusodelosatributosymtodosdelobjeto.

Destruccin,eliminacindelobjetoyliberacinderecursos.

4.2.Declaracin.
Paralacreacindeunobjetohayqueseguirlossiguientespasos:
9

Declaracin:Definireltipodeobjeto.

Instanciacin:Creacindelobjetoutilizandoeloperadornew.

PeroenquconsistenestospasosaniveldeprogramacinenJava?Veamosprimerocmodeclarar
unobjeto.Paraladefinicindeltipodeobjetodebemosemplearlasiguienteinstruccin:
<tipo> nombre_objeto;
Donde:
9

tipoeslaclaseapartirdelacualsevaacrearelobjeto,y

nombre_objetoeselnombredelavariablereferenciaconlacualnosreferiremosalobjeto.

Lostiposreferenciadosoreferenciasseutilizanparaguardarladireccindelosdatosenlamemoria
delordenador.
Nada ms crear una referencia, sta se encuentra vaca. Cuando una referencia a un objeto no
contieneningunainstanciasedicequeesunareferencianula,esdecir,quecontieneelvalornull.
Estoquieredecirquelareferenciaestcreadaperoqueelobjetonoestinstanciadotodava,por
esolareferenciaapuntaaunobjetoinexistentellamado"nulo".
Para entender mejor la declaracin de objetos veamos un ejemplo. Cuando veamos los tipos de
datos en la Unidad 2, decamos que Java proporciona un tipo de dato especial para los textos o

14

DesarrollodeAplicacionesWeb

Tema3

cadenasdecaracteresqueeraeltipodedatoString.Veamosquerealmenteestetipodedatoes
untiporeferenciadoycrebamosunavariablemensajedeesetipodedatodelasiguienteforma:
String mensaje;
Losnombresdelaclaseempiezanconmayscula,comoString,ylosnombresdelosobjetoscon
minscula,comomensaje,assabemosqutipodeelementoutilizando.
Pues bien, String es realmente la clase a partir de la cual creamos nuestro objeto llamado
mensaje.
Siobservaspocosediferenciaestadeclaracindelasdeclaracionesdevariablesquehacamospara
lostiposprimitivos.AntesdecamosquemensajeeraunavariabledeltipodedatoString.Ahora
realmentevemosquemensajeesunobjetodelaclaseString.Peromensajeannocontieneel
objetoporquenohasidoinstanciado,veamoscmohacerlo.
Por tanto, cuando creamos un objeto estamos haciendo uso de una variable que almacena la
direccindeeseobjetoenmemoria.Esavariableesunareferenciaountipodedatosreferenciado,
porquenocontieneeldatosinolaposicindeldatoenlamemoriadelordenador.
String saludo = new String ("Bienvenido a Java");
String s; //s vale null
s = saludo; //asignacin de referencias
En las instrucciones anteriores, las variables s y saludo apuntan al mismo objeto de la clase
String.Estoimplicaquecualquiermodificacinenelobjetosaludomodificatambinelobjetoal
quehacereferencialavariables,yaquerealmentesonelmismo.

4.3.Instanciacin.
Unavezcreadalareferenciaalobjeto,debemoscrearlainstanciauobjetoquesevaaguardaren
esareferencia.Paraelloutilizamoslaordennew conlasiguientesintaxis:
nombre_objeto = new <Constructor_de_la_Clase>([<par1>, <par2>, ...,
<parN>]);
Donde:
9

nombre_objeto es el nombre de la variable referencia con la cual nos referiremos al


objeto,
9 neweseloperadorparacrearelobjeto,
9 Constructor_de_la_Claseesunmtodoespecialdelaclase,quesellamaigualque
ella,yseencargadeinicializarelobjeto,esdecir,dedarunosvaloresinicialesasusatributos,
y
9 par1-parN,sonparmetrosquepuedeononecesitarelconstructorparadarlosvalores
inicialesalosatributosdelobjeto.

15

Utilizacindeobjetos

DAW

Durante la instanciacin del objeto, sereserva memoria suficiente para el objeto. De estatarea se
encargaJavayjuegaunpapelmuyimportanteelrecolectordebasura,queseencargadeeliminar
delamemorialosobjetosnoutilizadosparaquestapuedavolveraserutilizada.
Deestemodo,parainstanciarunobjetoString,haramoslosiguiente:
mensaje = new String;
As estaramos instanciando el objeto mensaje. Para ello utilizaramos el operador new y el
constructordelaclaseString alaqueperteneceelobjetosegnladeclaracinquehemoshecho
en el apartado anterior. A continuacin utilizamos el constructor, que se llama igual que la clase,
String.
En el ejemplo anterior el objeto se creara con la cadena vaca (""), si queremos que tenga un
contenidodebemosutilizarparmetrosenelconstructor,as:
mensaje = new String ("El primer programa");
Javapermiteutilizarla claseString comosideun tipo de datoprimitivosetratara,poresono
hacefaltautilizareloperadornew parainstanciarunobjetodelaclaseString.
Ladeclaracineinstanciacindeunobjetopuederealizarseenlamismainstruccin,as:
String mensaje = new String ("El primer programa");

4.4.Manipulacin.
Una vez creado e instanciado el objeto cmo accedemos a su contenido? Para acceder a los
atributosymtodosdelobjetoutilizaremoselnombredelobjetoseguidodeloperadorpunto(.)yel
nombredelatributoomtodoquequeremosutilizar.Cuandoutilizamoseloperadorpuntosedice
queestamosenviandounmensajealobjeto.Laformageneraldeenviarunmensajeaunobjetoes:
nombre_objeto.mensaje

Porejemplo,paraaccederalasvariablesinstanciaoatributosseutilizalasiguientesintaxis:
nombre_objeto.atributo
Yparaaccederalosmtodosofuncionesmiembrodelobjetoseutilizalasintaxises:
nombre_objeto.mtodo( [par1, par2, ..., parN] )
Enlasentenciaanteriorpar1,par2,etc.sonlosparmetrosqueutilizaelmtodo.Apareceentre
corchetesparaindicarsonopcionales.
Paraentendermejorcmosemanipulanobjetosvamosautilizarunejemplo.Paraellonecesitamos
laBibliotecadeClasesJavaoAPI(ApplicationProgrammingInterfaceInterfazdeprogramacinde
aplicaciones).Unodelospaquetesdelibrerasobibliotecasesjava.awt.Estepaquetecontieneclases
destinadas a la creacin de objetos grficos e imgenes. Vemos por ejemplo cmo crear un
rectngulo.

16

DesarrollodeAplicacionesWeb

Tema3

En primer lugar instanciamos el objeto utilizando el mtodo constructor, que se llama igual que el
objeto,eindicandolosparmetroscorrespondientesalaposicinyalasdimensionesdelrectngulo:
Rectangle rect = new Rectangle(50, 50, 150, 150);
Unavezinstanciadoelobjetorectngulosiqueremoscambiarelvalordelosatributosutilizamosel
operadorpunto.Porejemplo,paracambiarladimensindelrectngulo:
rect.height=100;
rect.width=100;
Obienpodemosutilizarunmtodoparahacerloanterior:
rect.setSize(200, 200);
Acontinuacinpuedesaccederalcdigodelejemplo:
/*
* Muestra como se manipulan objetos en Java
*/
import java.awt.Rectangle;
/**
*
* @author FMA
*/
public class Manipular {
public static void main(String[] args) {
// Instanciamos el objeto rect indicando posicion y dimensiones
Rectangle rect = new Rectangle( 50, 50, 150, 150 );
//Consultamos las coordenadas x e y del rectangulo
System.out.println( "------- Coordenadas esquina superior izqda. -------");
System.out.println("\tx = " + rect.x + "\n\ty = " + rect.y);
// Consultamos las dimensiones (altura y anchura) del rectangulo
System.out.println( "\n----------------- Dimensiones -------------------");
System.out.println("\tAlto = " + rect.height );
System.out.println( "\tAncho = " + rect.width);
//Cambiar coordenadas del rectangulo
rect.height=100;
rect.width=100;
rect.setSize(200, 200);
System.out.println( "\n-- Nuevos valores de los atributos --");
System.out.println("\tx = " + rect.x + "\n\ty = " + rect.y);
System.out.println("\tAlto = " + rect.height );
System.out.println( "\tAncho = " + rect.width);
}
}

4.5.Destruccindeobjetosyliberacindememoria.
Cuandounobjetodejadeserutilizado,esnecesarioliberarelespaciodememoriayotrosrecursos
queposeaparapoderserreutilizadosporelprograma.Aestaaccinseledenominadestruccindel
objeto.

17

Utilizacindeobjetos

DAW

EnJavaladestruccindeobjetoscorreacargodelrecolectordebasura(garbagecollector).Esun
sistemadedestruccinautomticadeobjetosqueyanosonutilizados.Loquesehaceesliberaruna
zonadememoriaquehabasidoreservadapreviamentemedianteeloperadornew.Estoevitaque
losprogramadorestenganquepreocuparsederealizarlaliberacindememoria.
Elrecolectordebasuraseejecutaenmodosegundoplanoydemaneramuyeficienteparanoafectar
alavelocidaddelprogramaqueseestejecutando.Loquehaceesqueperidicamentevabuscando
objetos que ya no son referenciados, y cuando encuentra alguno lo marca para ser eliminado.
Despusloseliminaenelmomentoqueconsideraoportuno.
Justo antes de que un objeto sea eliminado por el recolector de basura, se ejecuta su mtodo
finalize().Siqueremosforzarqueseejecuteelprocesodefinalizacindetodoslosobjetosdel
programa podemos utilizar el mtodo runFinalization() de la clase System. La clase
System formapartedelaBibliotecadeClasesdeJavaycontienediversasclasesparalaentraday
salida de informacin, acceso a variables de entorno del programa y otros mtodos de diversa
utilidad.Paraforzarelprocesodefinalizacinejecutaramos:
System.runFinalization();

Autoevaluacin
Las fases del ciclo de vida de un objeto son: Creacin, Manipulacin y Destruccin.
Verdadero.

Falso.

Efectivamente, los objetos tienen un tiempo de vida limitado y esas son las fases que atraviesan durante su vida til.

18

DesarrollodeAplicacionesWeb

Tema3

5.- Utilizacin de mtodos.


Caso prctico
Mara est contenta con lo que est aprendiendo sobre Java, bsicamente se trata de ampliar sus
conocimientos y con la experiencia que ella tiene no le resultar difcil ponerse a programar en poco
tiempo.
Juan ha comenzado el proyecto de la Clnica Veterinaria y quiere implicarse ella tambin lo antes
posible. Adems, estn los dos becarios Ana y Carlos, que se han incorporado al proyecto hace
poco y hay que comenzar a pensar en tareas para ellos.
Por lo pronto, Mara contina con el documento facilitado por Juan, ahora tiene que ver cmo se
utilizan los mtodos, aunque intuye que no va a ser algo muy diferente a las funciones y
procedimientos de cualquier otro lenguaje.

Losmtodos,juntoconlosatributos,formanparte
delaestructurainternadeunobjeto.Losmtodos
contienen la declaracin de variables locales y las
operacionesquesepuedenrealizarparaelobjeto,
y que son ejecutadas cuando el mtodo es
invocado. Se definen en el cuerpo de la clase y
posteriormentesoninstanciadosparaconvertirseenmtodosinstanciadeunobjeto.

Para utilizar los mtodos adecuadamente es conveniente conocer la estructura bsica de que
disponen.
Al igual que las clases, los mtodos estn
compuestos por una cabecera y un cuerpo. La
cabecera tambin tiene modificadores, en este
caso hemos utilizado public para indicar que
elmtodoespblico,locualquieredecirquele
pueden enviar mensajes no slo los mtodos
del objeto sino los mtodos de cualquier otro
objetoexterno.
Dentro de un mtodo nos encontramos el
cuerpodelmtodoquecontieneelcdigodela
accin a realizar. Las acciones que un mtodo
puederealizarson:
9

Inicializarlosatributosdelobjeto
9 Consultarlosvaloresdelosatributos
9 Modificarlosvaloresdelosatributos
9 Llamaraotrosmtodos,delmismodelobjetoodeobjetosexternos

Citas para pensar


En cuestin de sentido comn tomar un mtodo y probarlo. Pero lo importante es
probaralgo.
(FranklinDelanoRoosevelt)

19

Utilizacindeobjetos

DAW

5.1.Parmetrosyvaloresdevueltos.
Los mtodos se pueden utilizar tanto para consultar informacin sobre el objeto como para
modificarsuestado.Lainformacinconsultadadelobjetosedevuelveatravsdeloqueseconoce
como valor de retorno, y la modificacin del estado del objeto, o sea, de sus atributos, se hace
mediantelalistadeparmetros.
Engeneral,lalistadeparmetrosdeunmtodosepuededeclarardedosformasdiferentes:
9

Porvalor.Elvalordelosparmetrosnosedevuelvealfinalizarelmtodo,esdecir,cualquier
modificacinquesehagaenlosparmetrosnotendrefectounavezsesalgadelmtodo.
Esto es as porque cuando se llama al mtodo desde cualquier parte del programa, dicho
mtodorecibeunacopiadelosargumentos,portantocualquiermodificacinquehagaser
sobrelacopia,nosobrelasvariablesoriginales.
9 Por referencia. La modificacin en los valores de los parmetros s tienen efecto tras la
finalizacin del mtodo. Cuando pasamos una variable a un mtodo por referencia lo que
estamoshaciendoespasarladireccindeldatoenmemoria,portantocualquiercambioen
eldatoseguirmodificadounavezquesalgamosdelmtodo.
En el lenguaje Java, todas las variables se pasan por valor, excepto los objetos que se pasan por
referencia.EnJava,ladeclaracindeunmtodotienedosrestricciones:
9

Unmtodosiempre tieneque devolverunvalor (nohayvalorpordefecto). Estevalor de


retorno es el valor que devuelve el mtodo cuando termina de ejecutarse, al mtodo o
programa que lo llam. Puede ser un tipo primitivo, un tipo referenciado o bien el tipo
void,queindicaqueelmtodonodevuelveningnvalor.
9 Unmtodotieneunnmerofijodeargumentos.Losargumentossonvariablesatravsde
las cuales se pasa informacin al mtodo desde el lugar del que se llame, para que ste
pueda utilizar dichos valores durante su ejecucin. Los argumentos reciben el nombre de
parmetroscuandoaparecenenladeclaracindelmtodo.
Elvalorderetornoeslainformacinquedevuelveunmtodotrassuejecucin.

Segnhemosvistoenelapartadoanterior,lacabeceradeunmtodosedeclaracomosigue:
public tipo_de_dato_devuelto nombre_metodo (lista_de_parametros);
Comovemos,eltipodedatodevueltoaparecedespusdelmodificadorpublicysecorresponde
conelvalorderetorno.
La lista de parmetros aparece al final de la cabecera del mtodo, justo despus del nombre,
encerradosentresignosdeparntesisyseparadosporcomas.Sedebeindicareltipodedatodecada
parmetroas:
(tipo_parmetro1 nombre_parmetro1, ..., tipo_parmetroN nombre_parmetroN)

Cuandosellamealmtodo,sedeberutilizarelnombredelmtodo,seguidodelosargumentosque
debencoincidirconlalistadeparmetros.

20

DesarrollodeAplicacionesWeb

Tema3

Lalistadeargumentosenlallamadaaunmtododebecoincidirennmero,tipoyordenconlos
parmetrosdelmtodo,yaquedelocontrarioseproduciraunerrordesintaxis.
5.2.Constructores.
Recuerdas cuando hablbamos de la creacin e instanciacin de un objeto? Decamos que
utilizbamoseloperadornewseguidodelnombredelaclaseyunaparejadeabrircerrarparntesis.
Adems,elnombredelaclaseerarealmenteelconstructordelamisma,ylodefinamoscomoun
mtodoespecialquesirveparainicializarvalores.Enesteapartadovamosaverunpocomssobre
losconstructores.
Unconstructoresunmtodoespecialconelmismonombredelaclaseyquenodevuelveningn
valortrassuejecucin.

Cuando creamos un objeto debemos instanciarlo


utilizando el constructor de la clase. Veamos la clase
Date proporcionada por la Biblioteca de Clases de
Java. Si queremos instanciar un objeto a partir de la
clase Date tan slo tendremos que utilizar el
constructor seguido de una pareja de abrircerrar
parntesis:
Date fecha = new Date();
Con la anterior instruccin estamos creando un
objetofechadetipoDate,quecontendrlafechayhoraactualdelsistema.
La estructura de los constructores es similar a la de cualquier mtodo, salvo que no tiene tipo de
dato devuelto porque no devuelve ningn valor. Est formada por una cabecera y un cuerpo, que
contienelainicializacindeatributosyrestodeinstruccionesdelconstructor.
Elmtodoconstructortienelassiguientesparticularidades:
9
9
9
9
9

Elconstructoresinvocadoautomticamenteenlacreacindeunobjeto,ysloesavez.
Los constructores no empiezan con minscula, como el resto de los mtodos, ya que se
llamanigualquelaclaseylasclasesempiezanconletramayscula.
Puedehabervariosconstructoresparaunaclase.
Comocualquiermtodo,elconstructorpuedetenerparmetrosparadefinirquvaloresdar
alosatributosdelobjeto.
Elconstructorpordefectoesaqulquenotieneargumentosoparmetros.Cuandocreamos
unobjetollamandoalnombredelaclasesinargumentos,estamosutilizandoelconstructor
pordefecto.
Esnecesario quetodaclasetengaal menos unconstructor.Si nodefinimosconstructores
paraunaclase,ysloenesecaso,elcompiladorcreaunconstructorpordefectovaco,que
inicializa los atributos a sus valores por defecto, segn del tipo que sean: 0 para los tipos
numricos,falseparalosboolean ynull paralostipocarcterylasreferencias.Dicho
constructorloquehaceesllamaralconstructorsinargumentosdelasuperclase(clasedela
cual hereda); si la superclase no tiene constructor sin argumentos se produce un error de
compilacin.

21

Utilizacindeobjetos

DAW

Cuando definimos constructores personalizados, el constructor por defecto deja de existir, y si no


definimos nosotros un constructor sin argumentos cuando intentemos utilizar el constructor por
defectonosdarunerrordecompilacin.

5.3.Eloperadorthis.
Los constructores y mtodos de un objeto
suelenutilizareloperadorthis.Esteoperador
sirveparareferirsealosatributosdeunobjeto
cuando estamos dentro de l. Sobre todo se
utiliza cuando existe ambigedad entre el
nombre de un parmetro y el nombre de un
atributo, entonces en lugar del nombre del
atributo solamente escribiremos this.nombre_atributo, y as no habr duda de a qu
elementonosestamosrefiriendo.
Vamos a ilustrar mediante un ejemplo la utilizacin de objetos y mtodos, as como el uso de
parmetrosyeloperadorthis.Aunquelacreacindeclaseslaveremosenlassiguientesunidades,
en este ejercicio creamos una pequea clase para que podamos instanciar el objeto con el que
vamosatrabajar.
Las clases se suelen representar como un rectngulo, y dentro de l se sitan los atributos y los
mtodosdedichaclase.
Enlaimagen,laclasePajaro estcompuestaportresatributos,unodeelloselnombreyotros
dosqueindicanlaposicindelave,posX yposY.Tienedosmtodosconstructoresyunmtodo
volar().Comosabemos,losmtodosconstructoresrecibenelmismonombredelaclase,ypuede
habervariosparaunamismaclase,dentrodeellasediferencianunosdeotrosporlosparmetros
queutilizan.

Ejercicioresuelto
Dada una clase principal llamada Pajaro, se definen los atributos y mtodos que aparecen en la
imagen.Losmtodosrealizanlassiguientesacciones:
9

pajaro(). Constructor por defecto. En este caso, el constructor por defecto no contiene
ningunainstruccin,yaqueJavainicializadeformaautomticalasvariablesmiembro,sino
ledamosningnvalor.
9 pajaro(String nombre, int posX, int posY). Constructor que recibe como
argumentosunacadenadetextoydosenterosparainicializarelvalordelosatributos.
9 volar(int posX, int posY). Mtodo que recibe como argumentos dos enteros:
posX y posY, y devuelve un valor de tipo double como resultado, usando la palabra
clave return. El valor devuelto es el resultado de aplicar un desplazamiento de acuerdo
conlasiguientefrmula:

Disea un programa que utilice la clase Pajaro, cree una instancia de dicha clase y ejecute sus
mtodos.

22

DesarrollodeAplicacionesWeb

Tema3

LoprimeroquedebemoshacerescrearlaclasePajaro,consusmtodosyatributos.Deacuerdo
conlosdatosquetenemos,elcdigodelaclaseseraelsiguiente:
Debemos tener en cuenta que se trata de una clase
principal, lo cual quiere decir que debe contener un
mtodo main() dentro de ella. En el mtodo
main() vamos a situar el cdigo de nuestro
programa.Elejerciciodicequetenemosquecrearuna
instanciadelaclaseyejecutarsusmtodos,entrelos
que estn el constructor y el mtodo volar().
Tambin es conveniente imprimir el resultado de
ejecutarelmtodovolar().Portanto,loquehara
elprogramasera:
9

Crearunobjetodelaclaseeinicializarlo.
9 Invocaralmtodovolar.
9 Imprimirporpantallaladistanciarecorrida.
Para inicializar el objeto utilizaremos el constructor con parmetros, despus ejecutaremos el
mtodo volar() del objeto creado y finalmente imprimiremos el valor que nos devuelve el
mtodo.Elcdigodelaclasemain()quedaracomosigue:

Siejecutamosnuestroprogramaelresultadoseraelsiguiente:

5.4.Mtodosestticos.
Cuando trabajbamos con cadenas de caracteres utilizando la
claseString,veamoslasoperacionesquepodamoshacercon
ellas: obtener longitud, comparar dos cadenas de caracteres,
cambiar a maysculas o minsculas, etc. Pues bien, sin saberlo
estbamos utilizando mtodos estticos definidos por Java para
la clase String. Pero qu son los mtodos estticos?
Vemoslo.
Los mtodos estticos son aquellos mtodos definidos para una clase que se pueden usar
directamente,sinnecesidaddecrearunobjetodedichaclase.Tambinsellamanmtodosdeclase.
Parallamaraunmtodoestticoutilizaremos:
9

Elnombredelmtodo,silollamamosdesdelamismaclaseenlaqueseencuentradefinido.
9 Elnombredelaclase,seguidoporeloperadorpunto(.)mselnombredelmtodoesttico,
silollamamosdesdeunaclasedistintaalaqueseencuentradefinido:

23

Utilizacindeobjetos

DAW

9 nombre_clase.nombre_metodo_estatico
9 Elnombredelobjeto,seguidoporeloperadorpunto(.)mselnombredelmtodoesttico.
Utilizaremos esta forma cuando tengamos un objeto instanciado de la clase en la que se
encuentradefinidoelmtodoesttico,ynopodamosutilizarlaanterior:
nombre_objeto.nombre_metodo_estatico
Los mtodos estticos no afectan al estado de los objetos instanciados de la clase (variables
instancia),ysuelenutilizarsepararealizaroperacionescomunesatodoslosobjetosdelaclase.Por
ejemplo,sinecesitamoscontarelnmerodeobjetosinstanciadosdeunaclase,podramosutilizarun
mtodo esttico que fuera incrementando el valor de una variable entera de la clase conforme se
vancreandolosobjetos.
EnlaBibliotecadeClasesdeJavaexistenmuchasclasesquecontienenmtodosestticos.Pensemos
en las clases que ya hemos utilizado en unidades anteriores, como hemos comentado la clase
String con todas las operaciones que podamos hacer con ella y con los objetos instanciados a
partirdeella.ObienlaclaseMath.paralaconversindetiposdedatos.Todosellossonmtodos
estticosquelaAPIdeJavadefineparaesasclases.Loimportanteesquetengamosencuentaqueal
tratarsedemtodosestticos,parautilizarlosnonecesitamoscrearunobjetodedichasclases.

Autoevaluacin
Los mtodos estticos, tambin llamados mtodos instancia, suelen utilizarse para
realizar operaciones comunes a todos los objetos de la clase.
Verdadero.

Falso.

Los mtodos estticos no pueden ser mtodos instancia porque se utilizan directamente, sin crear un objeto de la clase

24

DesarrollodeAplicacionesWeb

Tema3

6.- Libreras de objetos (paquetes).


Caso prctico
-Vaya! -exclama Mara- No consigo encontrar la clase Persona dentro del conjunto de clases que
hasta ahora he creado.
-Por qu no pruebas a dividir las clases en paquetes? -pregunta Juan- En un paquete agrupas las
que estn relacionadas, y as te ser ms fcil encontrar una clase la prxima vez. Adems puedes
crear paquetes dentro de otros, como si fuera una estructura de directorios.
-Ah s? Pues es justo lo que necesito para resolver este desorden. Voy a ponerme con ello -aade
Mara.

Conforme nuestros programas se van haciendo ms grandes, el nmero de clases va creciendo.


Metertodaslasclasesennicodirectorionoayudaaqueestnbienorganizadas,lomejoreshacer
grupos de clases, de forma que todas las clases que estn relacionadas o traten sobre un mismo
temaestnenelmismogrupo.
Unpaquetedeclasesesunaagrupacindeclasesqueconsideramosqueestnrelacionadasentres
otratandeuntemacomn.
Lasclasesdeunmismopaquetetienenunaccesoprivilegiadoalosatributosymtodosdeotras
clases de dicho paquete. Es por ello por lo que se considera que los paquetes son tambin, en
ciertomodo,unidadesdeencapsulacinyocultacindeinformacin.
Javanosayudaaorganizarlasclasesenpaquetes.Encadafichero.javaquehagamos,alprincipio,
podemosindicaraqupaquetepertenecelaclasequehagamosenesefichero.
Los paquetes se declaran utilizando la palabra clave package seguida del nombre del paquete.
Paraestablecerelpaquetealqueperteneceunaclasehayqueponerunasentenciadedeclaracin
comolasiguientealprincipiodelaclase:
package Nombre_de_Paquete;
Por ejemplo, si decidimos agrupar en un paquete
"ejemplos" un programa llamado "Bienvenida",
pondramos
en
nuestro
fichero
Bienvenida.java losiguiente:

El cdigo es exactamente igual que como hemos venido haciendo hasta ahora, solamente hemos
aadidolalnea"package ejemplos;"alprincipio.Enlaimagensemuestracmoaparecenlos
paquetesenelentornointegradodeNetbeans.

Debesconocer
En la siguiente presentacin puedes ver una demostracin de cmo hemos creado el
proyectoBienvenida:
Creacindeproyectoconpaquetes

25

Utilizacindeobjetos

DAW

SeleccionamosFichero/Nuevoproyecto

EnlaventanadeproyectonuevoseleccionamosenCategoras
JavayeneltipodeproyectoAplicacinJava

EscribimoselnombredelproyectoBienvenidaysiqueremos
cambiarlaubicacindelosarchivosdelproyectoseleccionamos
Browse

Escribimoselnombredelpaqueteydelaclaseprincipalde
nuestroproyecto

Unavezcreadoelproyectoharemosdobleclicenelarchivodel
paquetedefuentesyescribiremoselcdigodelejemploindicado
enlaunidad

ClicderechosobrelaclaseJavayseleccionamosRunFileoclicen
elbotnejecutar

6.1.Sentenciaimport.
Cuando queremos utilizar una clase que est en un paquete distinto a la clase que estamos
utilizando,sesueleutilizarlasentenciaimport.Porejemplo,siqueremosutilizarlaclaseScanner
queestenelpaquetejava.util delaBibliotecadeClasesdeJava,tendremosqueutilizaresta
sentencia:
import java.util.Scanner;
Sepuedenimportartodaslasclasesdeunpaquete,as:

26

DesarrollodeAplicacionesWeb

import java.awt.*;

Tema3

Estasentenciadebeapareceralprincipiodelaclase,justodespusdelasentenciapackage,sista
existiese.
Tambin podemos utilizar la clase sin sentencia import, en cuyo caso cada vez que queramos
usarladebemosindicarsurutacompleta:
java.util.Scanner teclado = new java.util.Scanner (System.in);
Hasta aqu todo correcto. Sin embargo, al trabajar con paquetes, Java nos obliga a organizar los
directorios,compilaryejecutardeciertaformaparaquetodofuncioneadecuadamente.

6.2.Compilaryejecutarclasesconpaquetes.
Si hacemos que Bienvenida.java pertenezca al paquete ejemplos, debemos crear un subdirectorio
"ejemplos"ymeterdentroelarchivoBienvenida.java.
Porejemplo,enLinuxtendramosestaestructuradedirectorios:
/<directorio_usuario>/Proyecto_Bienvenida/ejemplos/Bienvenida.java
Debemos tener cuidado con las maysculas y las minsculas, para evitar problemas, tenemos que
ponerelnombreen"package"exactamenteigualqueelnombredelsubdirectorio.
Para compilar la clase Bienvenida.java que est en el paquete ejemplos debemos situarnos en el
directoriopadredelpaqueteycompilardesdeah:
$ cd /<directorio_usuario>/Proyecto_Bienvenida
$ javac ejemplos/Bienvenida.java
Sitodovabien,eneldirectorioejemplosnosaparecerlaclasecompiladaBienvenida.class.

Para ejecutar la clase compilada Bienvenida.class que est en el directorio ejemplos,


debemos seguir situados en el directorio padre del paquete. El nombre completo de la clase es
"paquete.clase",esdecir"ejemplos.Bienvenida".Lospasosseranlossiguientes:
$ cd /<directorio_usuario>/Proyecto_Bienvenida
$ java ejemplos/Bienvenida

27

Utilizacindeobjetos

Bienvenido a Java

DAW

Sitodoescorrecto,debesalirelmensaje"BienvenidoaJava"porlapantalla.
Si el proyecto lo hemos creado desde un entorno integrado como Netbeans, la compilacin y
ejecucin se realizar al ejecutar la opcin RunFile (Ejecutar archivo) o hacer clic sobre el botn
Ejecutar.

6.3.Jerarquadepaquetes.
Para organizar mejor las cosas, un paquete, en vez de clases, tambin puede contener otros
paquetes.Esdecir,podemoshacersubpaquetesdelospaquetesysubpaquetesdelossubpaquetesy
as sucesivamente. Esto permite agrupar paquetes relacionados en un paquete ms grande. Por
ejemplo,siquierodividirmisclasesdeejemplosenejemplosbsicosyejemplosavanzados,puedo
ponermsnivelesdepaquetesseparandoporpuntos:
package ejemplos.basicos;
package ejemplos.avanzados;
Aniveldesistemaoperativo,tendramosquecrearlossubdirectoriosbsicosyavanzadosdentrodel
directorioejemplos,ymeterahlasclasesquecorrespondan.
Paracompilar,eneldirectoriodelproyectohabraquecompilarponiendotodoelpathhastallegara
laclase.Esdecir,elnombredelaclasevacontodoslospaquetesseparadosporpuntos,porejemplo
ejemplos.basicos.Bienvenida.
Laestructuradedirectoriosenelsistemaoperativocuandousamossubpaquetessera:
/<directorio_usuario>/Proyecto_Bienvenida/ejemplos/basicos/HolaMundo
.java
Ylacompilacinyejecucinsera:
$ cd /<directorio_usuario>/Proyecto_Bienvenida
$ javac ejemplos/basicos/Bienvenida.java
$ java ejemplos/basicos/Bienvenida
Hola Mundo

28

DesarrollodeAplicacionesWeb

Tema3

La Biblioteca de Clases de Java se organiza haciendo uso de esta jerarqua de paquetes. As por
ejemplo,siquieroaccederalaclaseDate,tendrqueimportarlaindicandosurutacompleta,osea,
java.util.Date,as:
import java.util.Date;

Citas para pensar


Tanbuenocomoesheredarunabiblioteca,esmejorcoleccionaruna.AugustineBirrel

6.4.LibrerasJava.
CuandodescargamoselentornodecompilacinyejecucindeJava,obtenemoslaAPIdeJava.Como
ya sabemos, se trata de un conjunto de bibliotecas que nos proporciona paquetes de clases tiles
paranuestrosprogramas.
UtilizarlasclasesymtodosdelaBibliotecadeJavanosvaayudarareducireltiempodedesarrollo
considerablemente,porloqueesimportantequeaprendamosaconsultarlayconozcamoslasclases
msutilizadas.
LospaquetesmsimportantesqueofreceellenguajeJavason:
9

9
9

9
9
9

java.io.Contienelasclasesquegestionanlaentradaysalida,yaseaparamanipularficheros,
leer o escribir en pantalla, en memoria, etc. Este paquete contiene por ejemplo la clase
BufferedReaderqueseutilizaparalaentradaporteclado.
java.lang.Contienelasclasesbsicasdellenguaje.Estepaquetenoesnecesarioimportarlo,
ya que es importado automticamente por el entorno de ejecucin. En este paquete se
encuentralaclaseObject,quesirvecomorazparalajerarquadeclasesdeJava,olaclase
System queyahemosutilizadoenalgunosejemplosyquerepresentaalsistemaenelque
seestejecutandolaaplicacin.Tambinpodemosencontrarenestepaquetelasclasesque
"envuelven" los tipos primitivos de datos. Lo que proporciona una serie de mtodos para
cadatipodedatodeutilidad,comoporejemplolasconversionesdedatos.
java.util.Bibliotecadeclasesdeutilidadgeneralparaelprogramador.Estepaquetecontiene
por ejemplo la clase Scanner utilizada para la entrada por teclado de diferentes tipos de
datos,laclaseDate,paraeltratamientodefechas,etc.
java.math.Contieneherramientasparamanipulacionesmatemticas.
java.awt. Incluye las clases relacionadas con la construccin de interfaces de usuario, es
decir,lasquenospermitenconstruirventanas,cajasdetexto,botones,etc.Algunasdelas
clasesquepodemosencontrarenestepaquetesonButton,TextField,Frame,Label,
etc.
java.swing.Contieneotroconjuntodeclasesparalaconstruccindeinterfacesavanzadasde
usuario. Los componentes que se engloban dentro de este paquete se denominan
componentes Swing, y suponen una alternativa mucho ms potente que AWT para
construirinterfacesdeusuario.
java.net.ConjuntodeclasesparalaprogramacinenlaredlocaleInternet.
java.sql. Contiene las clases necesarias para programar en Java el acceso a las bases de
datos.
java.security.Bibliotecadeclasesparaimplementarmecanismosdeseguridad.

29

Utilizacindeobjetos

DAW

Como se puede comprobar Java ofrece una completa jerarqua de clases organizadas a travs de
paquetes.

Parasaberms
EnelsiguienteenlacepuedesaccederalainformacinoficialsobrelaBibliotecadeClasesde
Java(estenIngls).
InformacinoficialsobrelaBibliotecadeClasesdeJava.
http://www.oracle.com/technetwork/java/javase/documentation/apijsp136079.html

30

DesarrollodeAplicacionesWeb

Tema3

7.- Programacin de la consola: entrada y


salida de la informacin.
Caso prctico
Juan va a realizar algunas pruebas con el proyecto de la Clnica Veterinaria. Le comenta a Mara que
lo que tienen ahora mismo es la estructura bsica del proyecto, que bsicamente se trata de la
definicin de algunas clases y objetos que se van a utilizar. Van a necesitar introducir datos por
pantalla para ver cmo se comportan esos objetos, y mostrar por pantalla el resultado de
manipularlos. Para ello utilizarn las clases System y Scanner.
Estas clases ya las hemos utilizado anteriormente, estn en los paquetes java.lang y java.util,
respectivamente, observa en el siguiente cdigo cmo las utilizo dice Juan.
De acuerdo, ensame ese cdigo comenta Mara.

Los programas a veces necesitan acceder a los


recursos del sistema, como por ejemplo los
dispositivos de entrada/salida estndar, para
recoger datos de teclado o mostrar datos por
pantalla.
En Java, la entrada por teclado y la salida de
informacin por pantalla se hace mediante la
clase System del paquete java.lang de la
BibliotecadeClasesdeJava.
Comocualquierotraclase,estcompuestademtodosyatributos.LosatributosdelaclaseSystem
sontresobjetosqueseutilizanparalaentradaysalidaestndar.Estosobjetossonlossiguientes:
9

System.in.Entradaestndar:teclado.
9 System.out.Salidaestndar:pantalla.
9 System.err.Salidadeerrorestndar,seproducetambinporpantalla,peroseimplementa
como un fichero distinto al anterior para distinguir la salida normal del programa de los
mensajesdeerror.Seutilizaparamostrarmensajesdeerror.
NosepuedencrearobjetosapartirdelaclaseSystem,sinoqueseutilizadirectamentellamandoa
cualquieradesusmtodosconeloperadordemanipulacindeobjetos,esdecir,eloperadorpunto
(.):
System.out.println("Bienvenido a Java");

Parasaberms
En el siguiente enlace puedes consultar los atributos y mtodos de la clase System del
paquetejava.langpertenecientealaBibliotecadeClasesdeJava:
ClaseSystemdeJava.
http://download.oracle.com/javase/7/docs/api/
Autoevaluacin
La clase System del paquete java.io, como cualquier clase, est formada por mtodos y
atributos, y adems es una clase que no se puede instanciar, sino que se utiliza
directamente.
Verdadero.

Falso.

La clase System pertenece al paquete java.lang.

31

Utilizacindeobjetos

DAW

7.1.ConceptossobrelaclaseSystem.
La lectura por teclado es muy importante cuando
empezamos a hacer nuestros primeros programas.
Para entender mejor en qu consiste la clase
System, y en particular el objeto System.in
vamosadescribirlomsdetenidamente.
En el apartado anterior hemos dicho que System.in
es un atributo de la clase System, que est dentro
delpaquetejava.lang.Peroadems,siconsultamoslaBibliotecadeClasesdeJava,nosdamos
cuenta que es un objeto, y como todos los objetos debe ser instanciado. En efecto, volviendo a
consultarlabibliotecadeclasesnosdamoscuentaqueSystem.in esunainstanciadeunaclase
dejavaquesellamaInputStream.
En Java, InputStream nos permite leer en bytes, desde teclado, un archivo o cualquier otro
dispositivo de entrada. Con esta clase podemos utilizar por ejemplo el mtodo read() que
permiteleerunbytedelaentradaoskip(long n),quesaltanbytesdelaentrada.Peroloque
realmente nos interesa es poder leer texto o nmeros, no bytes, para hacernos ms cmoda la
entradadedatos.Paraelloseutilizanlasclases:
9

InputStreamReader. Convierte los bytes ledos en


caracteres.Particularmente,nosvaaservirparaconvertir
el objeto System.in en otro tipo de objeto que nos
permitaleercaracteres.
9 BufferedReader. Lee hasta un fin de lnea. Esta es la
clase que nos interesa utilizar, pues tiene un mtodo
readLine()quenosvaapermitirleercaractereshasta
elfinaldelnea.

LaformadeinstanciarestasclasesparausarlasconSystem.ineslasiguiente:
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader (isr);
En el cdigo anterior hemos creado un InputStreamReader a partir de System.ini y
pasamosdichoInputStreamReader alconstructordeBufferedReader.Elresultadoesque
laslecturasquehagamosconelobjetobr sonenrealidadrealizadassobreSystem.in,perocon
laventajadequepodemosleerunalneacompleta.As,porejemplo,siescribimosunaA,con:
String cadena = br.readLine();
Obtendremosencadenauna"A".
Sinembargo,seguimosnecesitandohacerlaconversinsiqueremosleernmeros.Porejemplo,si
escribimos un entero 32, en cadena obtendremos "32". Si recordamos, para convertir cadenas de

32

DesarrollodeAplicacionesWeb

Tema3

texto a enteros se utiliza el mtodo esttico parseInt() de la clase Integer, con lo cual la
lecturalaharamosas:
int numero = Integer.parseInt (br.readLine());

7.2.Entradaporteclado.ClaseSystem.
AcontinuacinvamosaverunejemplodecmoutilizarlaclaseSystem paralaentradadedatos
portecladoenJava.
Comoyahemosvistoenunidadesanteriores,paracompilaryejecutarelejemplopuedesutilizarlas
rdenes javac y java, o bien crear un nuevo proyecto en Netbeans y copiar el cdigo que se
proporcionaenelarchivosiguiente:
import java.io.BufferedReader;
import java.io.InputStreamReader;
/*
* Ejemplo de entrada por teclado con la clase System
*/
/**
*
* @author FMA
*/
public class EntradaTecladoSystem {
public static void main(String[] args) {
try{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
System.out.print("Introduce el texto: ");
String cad = br.readLine();
//salida por pantalla del texto introducido
System.out.println(cad);
System.out.print("Introduce un numero: ");
int num = Integer.parseInt(br.readLine());
// salida por pantalla del numero introducido
System.out.println(num);
} catch (Exception e) {
// System.out.println("Error al leer datos");
e.printStackTrace();
}
}
}

Observaquehemosmetidoelcdigoentreexcepcionestry-catch.Cuandoennuestroprograma
fallaalgo,porejemplolaconversindeunString aint,Javanosavisalanzandoexcepciones.Si
"capturamos"esaexcepcinennuestroprograma,podemosavisaralusuariodequhapasado.Esto
esconvenienteporquesinotratamoslaSystem excepcinseguramenteelprogramasepareyno
siga ejecutndose. El control de excepciones lo veremos en unidades posteriores, ahora slo nos
bastasaberqueenlasllavesdeltry colocamoselcdigoquepuedefallaryenlasllavesdelcatch
eltratamientodelaexcepcin.

7.3.Entradaporteclado.ClaseScanner.
Laentradaportecladoquehemosvistoenelapartadoanteriortieneelinconvenientedequeslo
podemos leer de manera fcil tipos de datos String. Si queremos leer otros tipos de datos
deberemosconvertirlacadenadetextoledaenesostiposdedatos.

33

Utilizacindeobjetos

DAW

ElkitdeDesarrollodeJava,apartirdesuversin1.5,incorporalaclasejava.util.Scanner,la
cualpermiteleertiposdedatosString,int,long,etc.,atravsdelaconsoladelaaplicacin.
Porejemploparaleeruntipodedatosenteroportecladosera:
Scanner teclado = new Scanner (System.in);
int i = teclado.nextInt ();
Obienestaotrainstruccinparaleerunalneacompleta,incluidotexto,nmerosoloquesea:
String cadena = teclado.nextLine();
En las instrucciones anteriores hemos creado un objeto de la clase Scanner llamado teclado
utilizandoelconstructordelaclase,alcuallehemospasadocomoparmetrolaentradabsicadel
sistemaSystem.inquepordefectoestasociadaalteclado.
Para conocer cmo funciona un objeto de la clase Scanner te proporcionamos el siguiente
ejemplo:
import java.util.Scanner;
/*
* Ejemplo de entrada de teclado con la clase Scanner
*/
/**
*
* @author FMA
*/
public class EntradaTecladoScanner {
public static void main(String[] args) {
// Creamos objeto teclado
Scanner teclado = new Scanner(System.in);
// Declaramos variables a utilizar
String nombre;
int edad;
boolean estudias;
float salario;
// Entrada de datos
System.out.println("Nombre: ");
nombre=teclado.nextLine();
System.out.println("Edad: ");
edad=teclado.nextInt();
System.out.println("Estudias: ");
estudias=teclado.nextBoolean();
System.out.println("Salario: ");
salario=teclado.nextFloat();
// Salida de datos
System.out.println("Bienvenido: " + nombre);
System.out.println("Tienes: " + edad +" aos");
System.out.println("Estudias: " + estudias);
System.out.println("Tu salario es: " + salario +" euros");
}
}

Parasaberms
SiquieresconoceralgomssobrelaclaseScannerpuedesconsultarelsiguienteenlace:
CapturardatosdesdetecladoconScanner.

34

DesarrollodeAplicacionesWeb

Tema3

http://chuwiki.chuidiang.org/index.php?title=Lectura_de_teclado_en_java

7.4.Salidaporpantalla.

LasalidaporpantallaenJavasehaceconelobjetoSystem.out.
Este objeto es una instancia de la clase PrintStream del
paquete java.lang. Si miramos la API de PrintStream
obtendremos la variedad de mtodos para mostrar datos por
pantalla,algunosdeestosson:
9

void print(String s):Escribeunacadenadetexto.


9 void println(String x):Escribeunacadenadetextoyterminalalnea.
9 void printf(String format, Object args): Escribe una cadena de texto
utilizandoformato.
En la orden print y println, cuando queramos escribir un mensaje y el valor de una variable
debemosutilizareloperadordeconcatenacindecadenas(+),porejemplo:
System.out.println(Bienvenido, + nombre);
Escribeelmensajede"Bienvenido,Carlos",sielvalordelavariablenombreesCarlos.
Lasrdenesprint yprintln todaslasvariablesqueescribenlasconsiderancomocadenasde
textosinformato,porejemplo,noseraposibleindicarqueescribaunnmerodecimalcondoscifras
decimalesoredondearlascifras,oescribirlospuntosdelosmiles,porejemplo.Paraelloseutilizala
ordenprintf().
La orden printf() utiliza unos cdigos de conversin para indicar si el contenido a mostrar de
qutipoes.Estoscdigossecaracterizanporquellevandelanteelsmbolo%,algunosdeellosson:
9
9
9
9
9

%c:Escribeuncarcter.
%s:Escribeunacadenadetexto.
%d:Escribeunentero.
%f:Escribeunnmeroenpuntoflotante.
%e:Escribeunnmeroenpuntoflotanteennotacincientfica.

Porejemplo,siqueremosescribirelnmerofloat12345.1684conelpuntodelosmilesyslodos
cifrasdecimaleslaordensera:
System.out.printf("% ,.2f\n", 12345.1684);
Estaordenmostraraelnmero12.345,17porpantalla.
Estasrdenespuedenutilizarlassecuenciasdeescapequevimosenunidadesanteriores,como"\n"
paracrearunsaltodelnea,"\t"paraintroducirunsaltodetabulacineneltexto,etc.

Parasaberms

35

Utilizacindeobjetos

DAW

Si quieres conocer algo ms sobre la orden printf() en el siguiente enlace tienes varios
ejemplosdeutilizacin:
Salidadedatosconlaordenprintf().
http://www.java2s.com/Tutorial/Java/0120__Development/UsingJavasprintfMethod.htm
EnesteotroenlacepuedesverunejemplointeresantedeusodelaclaseScannerjuntocon
lasrdenesprintfyprintln:
Ejemplodeentradaysalidadedatos.
http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Java/Chapter09/scannerConsol
e.html

7.5.Salidadeerror.
La salida de error est representada por el objeto System.err. Este objeto es tambin una
instancia de la clase PrintStream, por lo que podemos utilizar los mismos mtodos vistos
anteriormente.
Noparecemuytilutilizarout yerr sisudestinoeslamismapantalla,oalmenosenelcasode
la consola del sistema donde las dos salidas son representadas con el mismo color y no notamos
diferencia alguna. En cambio en la consola de varios entornos integrados de desarrollo como
NetBeansoEclipselasalidadeerr seveenuncolordiferente.Teniendoelsiguientecdigo:

LasalidadeesteejemploenNetbeanses:

ComovemosenunentornocomoNetbeans,utilizarlasdossalidasnospuedeayudaraunamejor
depuracindelcdigo.

Autoevaluacin
Relaciona cada clase con su funcin, escribiendo el nmero asociado a la funcin en el
hueco correspondiente.
Clase.

Relacin.

Funcin.

Scanner

1. Convierte los bytes ledos en caracteres.

PrintStream

2. Lee hasta un fin de lnea.

InputStreamReader

3. Lee diferentes tipos de datos desde la consola de la


aplicacin.

BufferedReader

4. Contiene varios mtodos para mostrar datos por pantalla.

PrintStream se utiliza para la salida de datos por pantalla y las otras clases, para la entrada de datos por teclado.

36

TEMA4

Contenido

1.Introduccin........................................................................................................................................1
2.Sentenciasybloques...........................................................................................................................3
3.Estructurasdeseleccin......................................................................................................................6
3.1.Estructuraifeifelse....................................................................................................................................7
3.2.Estructuraswitch.........................................................................................................................................9
4.Estructurasderepeticin..................................................................................................................11
4.1.Estructurafor.............................................................................................................................................11
4.2.Estructurafor/in.........................................................................................................................................13
4.3.Estructurawhile.........................................................................................................................................14
4.4.Estructuradowhile....................................................................................................................................15
5.Estructurasdesalto...........................................................................................................................17
5.1.Sentenciasbreakycontinue......................................................................................................................17
5.2.Etiquetas....................................................................................................................................................18
5.3.SentenciaReturn........................................................................................................................................19
6.Excepciones.......................................................................................................................................21
6.1.Capturarunaexcepcin.............................................................................................................................22
EJERCICIORESUELTO.......................................................................................................................................................................23
6.2.Elmanejodeexcepciones..........................................................................................................................24
6.3.Delegacindeexcepcionesconthrows.....................................................................................................25

7.Pruebadeprogramas........................................................................................................................26
7.1.Laespecificacin........................................................................................................................................27
7.2.Pruebasexhaustivas...................................................................................................................................27
7.3.PruebasdeCajaNegraoPruebasFuncionales..........................................................................................28
7.4.PruebasdeCajaBlancaoPruebasEstructurales.......................................................................................28
7.5.Otraspruebas.............................................................................................................................................29
Sabidurapopular:Cuatroojosvenmsquedos..........................................................................................29
7.6.RealizacindePruebasUnitariasconJUnit...............................................................................................30
TestconJUnit..................................................................................................................................................................30
8.Depuracindeprogramas.................................................................................................................36
DepuracinbsicaenNetBeans.......................................................................................................................39
9.Documentacindelcdigo................................................................................................................45
R.Caron.:"donotdocumentbadcoderewriteit".........................................................................................46
9.1Etiquetasyposicin....................................................................................................................................46
9.2.Usodelasetiquetas...................................................................................................................................47
9.3.Ordendelasetiquetas...............................................................................................................................48
DocumentacindeclasesconJavadoc............................................................................................................................................49

DiseodeAplicacionesWeb

Tema4

1. Introduccin
CASO PRCTICO
Los miembros de BK Programacin estn inmersos en el mundo de Java, ya conocen una buena
parte del lenguaje y ahora van a empezar a controlar el comportamiento de sus programas.
Mara pregunta a Juan: Dime Juan, En Java tambin hay condicionales y bucles?
Efectivamente Mara, como la gran mayora de los lenguajes de programacin, Java incorpora
estructuras que nos permiten tomar decisiones, repetir cdigo, etc. Cada estructura tiene sus ventajas
e inconvenientes y hay que saber dnde utilizar cada una de ellas. Aclara Juan.

EnunidadesanterioreshaspodidoaprendercuestionesbsicassobreellenguajeJAVA:definicinde
variables, tipos de datos, asignacin de valores, uso de literales, diferentes operadores que se
pueden aplicar, conversiones de tipos, insercin de comentarios, etc. Posteriormente, nos
sumergimos de lleno en el mundo de los objetos. Primero hemos conocido su filosofa, para ms
tardeirrecorriendolosconceptosytcnicasmsimportantesrelacionadasconellos:
Propiedades,mtodos,clases,declaracinyusodeobjetos,libreras,etc.
Vale,pareceserquetenemosloselementossuficientesparacomenzaragenerarprogramasescritos
enJAVA,Seguro?.
REFLEXIONA
Piensaenlasiguientepregunta:Cmounprogramapuededeterminarlaaparicinenpantallade
unmensajedeXITOoERROR,segnlosdatosdeentradaaportadosporunusuario?
Nosonslolosdatosdeentradaaportadosporunusuario,existenmsvariables.Sigueconatencinlaunidadylocomprenders.

Como habrs deducido, con lo que sabemos hasta ahora no es suficiente. Existen mltiples
situaciones que nuestros programas deben representar y que requieren tomar ciertas decisiones,
ofrecer diferentes alternativas o llevar a cabo determinadas operaciones repetitivamente para
conseguirsusobjetivos.
Si has programado alguna vez o tienes ciertos conocimientos bsicos sobre lenguajes de
programacin, sabes que la gran mayora de lenguajes poseen estructuras que permiten a los
programadorescontrolarelflujodelainformacindesusprogramas.Estorealmenteesunaventaja
paralapersonaqueestaprendiendounnuevolenguaje,otieneprevistoaprendermsdeuno,ya
que estas estructuras suelen ser comunes a todos (con algunos cambios de sintaxis o conjunto de
reglasquedefinenlassecuenciascorrectasdelos elementosdeunlenguajedeprogramacin.).Es
decir,siconocassentenciasdecontroldeflujoenotroslenguajes,loquevamosaveralolargode
estaunidadtevaasonarbastante.
Paraalguienquenohaprogramadonunca,unejemplosencillolevaapermitirentenderqueseso
delassentenciasdecontroldeflujo.Piensaenunfontanero(programador),principalmentetrabaja
conagua(datos)yseencargadehacerquestafluyapordondelquiere(programa)atravsdeun
conjuntodetuberas,codos,latiguillos,llavesdepaso,etc.(sentenciasdecontroldeflujo).
Pues esas estructuras de control de flujo son las que estudiaremos, conoceremos su estructura,
funcionamiento, cmo utilizarlas y dnde. A travs de ellas, al construir nuestros programas
podremoshacerquelosdatos(agua)fluyanporloscaminosadecuadospararepresentarlarealidad
delproblemayobtenerunresultadoadecuado.

Usodeestructurasdecontrol

DAW

Lostiposdeestructurasdeprogramacinqueseempleanparaelcontroldelflujodelosdatosson
lossiguientes:
9 Secuencia: compuestas por 0, 1 o N sentencias que se ejecutan en el orden en que han sido
escritas.Eslaestructuramssencillaysobrelaqueseconstruirnelrestodeestructuras.
9 Seleccin: es un tipo de sentencia especial de decisin y de un conjunto de secuencias de
instrucciones asociadas a ella. Segn la evaluacin de la sentencia de decisin se generar un
resultado(quesueleserverdaderoofalso)yenfuncindeste,seejecutarnunasecuenciade
instruccionesuotra.Lasestructurasdeseleccinpodrnsersimples,compuestasymltiples.
9 Iteracin: es un tipo de sentencia especial de decisin y una secuencia de instrucciones que
puedenserrepetidassegnelresultadodelaevaluacindelasentenciadedecisin.Esdecir,la
secuenciadeinstruccionesseejecutarrepetidamentesilasentenciadedecisinarrojaunvalor
correcto,enotrolaestructuraderepeticinsedetendr.
Adems de las sentencias tpicas de control de flujo, en esta unidad haremos una revisin de las
sentenciasdesalto,queaunquenosondemasiadorecomendables,esnecesarioconocerlas.Como
nuestrosprogramaspodrngenerarerroresysituacionesespeciales,echaremosunvistazoalmanejo
deexcepcionesenJAVA.Posteriormente,analizaremoslamejormaneradellevaracabolaspruebas
de nuestros programas y la depuracin de los mismos. Y finalmente, aprenderemos a valorar y
utilizarlasherramientasdedocumentacindeprogramas.
Vamosentoncesaponernoselmonodetrabajoyacogernuestracajadeherramientas,aversino
nosmojamosmucho!

DiseodeAplicacionesWeb

Tema4

2. Sentencias y bloques
CASO PRCTICO
Ada valora muy positivamente en un programador el orden y la pulcritud. Organizar correctamente el
cdigo fuente es de vital importancia cuando se trabaja en entornos colaborativos, en los que son
varios los desarrolladores los que forman los equipos de programacin. Por ello, incide en la
necesidad de recordar a Juan y Mara las nociones bsicas a la hora de escribir programas.

Este epgrafe lo utilizaremos para reafirmar cuestiones que son obvias y que en el transcurso de
anterioresunidadessehandadoporsabidas.Aunque,aveces,esconvenienterecordar.Loharemos
comounconjuntodeFAQs:
9 Cmo se escribe un programa sencillo? Si queremos que un programa sencillo realice
instrucciones o sentencias para obtener un determinado resultado, es necesario colocar stas
unadetrsdelaotra,exactamenteenelordenenquedebenejecutarse.
9 Podran colocarse todas las sentencias una detrs de otra, separadas por puntos y comas en
unamismalnea?,claroques,peronoesmuyrecomendable.Cadasentenciadebeestarescrita
enunalnea,deestamaneratucdigosermuchomslegibleylalocalizacindeerroresentus
programas ser ms sencilla y rpida. De hecho, cuando se utilizan herramientas de
programacin,loserroressuelenasociarseaunnmeroonmerosdelnea.
9 Puede una misma sentencia ocupar varias lneas en el programa?, s. Existen sentencias que,
porsutamao,puedengenerarvariaslneas.Perosiemprefinalizarnconunpuntoycoma.
9 EnJavatodaslassentenciasseterminanconpuntoycoma?,Efectivamente.Sidetrsdeuna
sentenciahadevenirotra,pondremosunpuntoycoma.Escribiendolasiguientesentenciaen
una nueva lnea. Pero en algunas ocasiones, sobre todo cuando utilizamos estructuras de
controldeflujo,detrsdelacabeceradeunaestructuradeestetiponodebecolocarsepuntoy
coma.Notepreocupes,loentenderscuandoanalicemoscadaunadeellas.
9 Qu es la sentencia nula en Java? La sentencia nula es una lnea que no contiene ninguna
instruccinyenlaquesloexisteunpuntoycoma.Comosunombreindica,estasentenciano
hacenada.
9 Quesunbloquedesentencias?Esunconjuntodesentenciasqueseencierraentrellavesy
queseejecutaracomosifueraunanicaorden.Sirveparaagruparsentenciasyparaclarificar
elcdigo.LosbloquesdesentenciassonutilizadosenJavaenlaprcticatotalidaddeestructuras
decontroldeflujo,clases,mtodos,etc.Lasiguientetablamuestradosformasdeconstruirun
bloquedesentencias.
Bloquedesentencias1

Bloquedesentencias2
{
sentencia1;
sentencia2;
;
sentenciaN;

{sentencia1; sentencia2;...; sentencia N;}


}

9 Enunbloquedesentencias,stasdebenestarcolocadasconunordenexacto?Enciertoscasos
s,aunquesialfinaldesuejecucinseobtieneelmismoresultado,podranocupardiferentes
posicionesennuestroprograma.

Usodeestructurasdecontrol

DAW

DEBESCONOCER
Observa los tres archivos que te ofrecemos a continuacin y compara su cdigo fuente.
Versquelostresobtienenelmismoresultado,perolaorganizacindelassentenciasque
loscomponenesdiferenteentreellos.
Sentencias,bloquesydiferentesorganizaciones
package organizacion_sentencias;
/**
*
* Organizacin de sentencias secuencial
*/
public class Organizacion_sentencias_1 {
public static void main(String[] args) {
System.out.println ("Organizacin secuencial de sentencias");
int dia=12;
System.out.println ("El da es: " + dia);
int mes=11;
System.out.println ("El mes es: " + mes);
int anio=2011;
System.out.println ("El anio es: " + anio);
}
}

Enesteprimerarchivo,lassentenciasestncolocadasenordensecuencial.
package organizacion_sentencias;
/**
*
* Organizacin de sentencias con declaracin previa
* de variables
*/
public class Organizacion_sentencias_2 {
public static void main(String[] args) {
// Zona de declaracin de variables
int dia=10;
int mes=11;
int anio=2011;
System.out.println ("Organizacin con declaracin previa de variables");
System.out.println ("El da es: " + dia);
System.out.println ("El mes es: " + mes);
System.out.println ("El anio es: " + anio);
}
}

Enestesegundoarchivo,sedeclaranalprincipiolasvariablesnecesarias.
EnJavanoesimprescindiblehacerloas,perosqueantesdeutilizarcualquiervariablestadebe
estarpreviamentedeclarada.Aunqueladeclaracindedichavariablepuedehacerseencualquier
lugardenuestroprograma.
package organizacion_sentencias;
/**
*
* Organizacin de sentencias en zonas diferenciadas
* segn las operaciones que se realicen en el cdigo
*/
public class Organizacion_sentencias_3 {
public static void main(String[] args) {
// Zona de declaracin de variables
int dia;
int mes;
int anio;
String fecha;
//Zona de inicializacin o entrada de datos
dia=10;
mes=11;
anio=2011;
fecha="";
//Zona de procesamiento
fecha=dia+"/"+mes+"/"+anio;

DiseodeAplicacionesWeb

Tema4

//Zona de salida
System.out.println ("Organizacin con zonas diferenciadas en el cdigo");
System.out.println ("La fecha es: " + fecha);
}
}

En este tercer archivo, podrs apreciar que se ha organizado el cdigo en las siguientes partes:
declaracin de variables, peticin de datos de entrada, procesamiento de dichos datos y
obtencin de la salida. Este tipo de organizacin est ms estandarizada y hace que nuestros
programasganenenlegibilidad.

Construyas de una forma o de otra tus programas, debes tener en cuenta siempre en Java las
siguientespremisas:
9 Declaracadavariableantesdeutilizarla.
9 Inicializaconunvalorcadavariablelaprimeravezquelautilices.
9 No es recomendable usar variables no inicializadas en nuestros programas, pueden provocar
erroresoresultadosimprevistos.

AUTOEVALUACIN
Indica qu afirmacin es correcta:

Paracrearunbloquedesentencias,esnecesariodelimitarstasentrellaves.Estebloque
funcionarcomosihubiramoscolocadounanicaorden.
LasentencianulaenJava,sepuederepresentarconunpuntoycomasloenunanicalnea.
ParafinalizarenJavacualquiersentencia,esnecesariohacerloconunpuntoycoma.
Todaslasafirmacionessoncorrectas.

Usodeestructurasdecontrol

DAW

3. Estructuras de seleccin
CASO PRCTICO
Juan est desarrollando un mtodo en el que ha de comparar los valores de las entradas de un login
y una contrasea hechas desde el teclado, con los valores almacenados en una base de datos. Para
poder hacer dicha comparacin necesitar utilizar una estructura condicional que le permita llevar a
cabo esta operacin, incluso necesitar que dicha estructura condicional sea capaz de decidir qu
hacer en funcin de si ambos valores son correctos o no.

Al principio de la unidad nos hacamos esta pregunta: Cmo un programa puede determinar la
aparicinenpantalladeunmensajedeXITOoERROR,segnlosdatosdeentradaaportadosporun
usuario?. Esta y otras preguntas se nos plantean en mltiples ocasiones cuando desarrollamos
programas.
Cmoconseguimosquenuestrosprogramaspuedantomardecisiones?Paracomenzar,loharemos
a travs de las estructuras de seleccin. Estas estructuras constan de una sentencia especial de
decisinydeunconjuntodesecuenciasdeinstrucciones.
El funcionamiento es sencillo, la sentencia de decisin ser evaluada y sta devolver un valor
(verdaderoofalso),enfuncindelvalordevueltoseejecutarunasecuenciadeinstruccionesuotra.
Por ejemplo, si el valor de una variable es mayor o igual que 5 se imprime por pantalla la palabra
APROBADOysiesmenor,seimprimeSUSPENSO.Paraesteejemplo,lacomprobacindelvalordela
variable ser la sentencia especial de decisin. La impresin de la palabra APROBADO ser una
secuenciadeinstruccionesylaimpresindelapalabraSUSPENSOserotra.Cadasecuenciaestar
asociada a cada uno de los resultados que puede arrojar la evaluacin de la sentencia especial de
decisin.

PARASABERMS
En el lenguaje de programacin C, verdadero o falso se representan mediante un literal
entero. 0 representar Falso y 1 o cualquier otro valor, representar Verdadero. Como
sabes,enJavalasvariablesdetipobooleano(en computacin es aquel que puede representar valores de lgica
binaria,estoes2 valores,valoresquenormalmenterepresentanfalsooverdadero)slopodrntomarlosvalorestrue
(verdadero)ofalse(falso).
Laevaluacindelassentenciasdedecisinoexpresionesquecontrolanlasestructurasde
seleccin,devolvernsiempreunvalorverdaderoofalso.
Lasestructurasdeseleccinsedividenen:
1.
2.
3.
4.

Estructurasdeseleccinsimplesoestructuraif.
Estructurasdeseleccincompuestaoestructuraifelse.
Estructurasdeseleccinbasadaseneloperadorcondicional.
Estructurasdeseleccinmltiplesoestructuraswitch.

A continuacin, detallaremos las caractersticas y funcionamiento de cada una de ellas. Es


importantequeatravsdelosejemplosquevamosaver,puedasdeterminarenqucircunstancias
utilizarcadaunadeestasestructuras.Aunqueunmismoproblemapuedeserresueltocondiferentes
estructuraseincluso,condiferentescombinacionesdestas.

DiseodeAplicacionesWeb

Tema4

3.1.Estructuraifeifelse
La estructura if es una estructura de seleccin o estructura condicional, en la que se evala una
expresin lgica o sentencia de decisin y en funcin del resultado, se ejecuta una sentencia o un
bloquedestas.
Laestructuraif puedepresentarsedelassiguientesformas:
Estructuraif simple.

if (expresin-lgica)
sentencia1;

Estructuraif dedoblealternativa.

if (expresin-lgica)
{
sentencia1;
sentencia2;
;
sentenciaN;
}

Si la evaluacin de la expresinlgica ofrece un resultado


verdadero,seejecutalasentencia1obienelbloquedesentencias
asociado. Si el resultado de dicha evaluacin es falso, no se
ejecutar ninguna instruccin asociada a la estructura
condicional.

if (expresin-lgica)
{
sentencia1;
if (expresin-lgica)
;
sentencia1;
sentenciaN;
else
} else {
sentencia1;
sentencia2;
;
sentenciaN;
}
Si la evaluacin de la expresinlgica ofrece un resultado
verdadero,seejecutarlaprimerasentenciaoelprimerbloquede
sentencias.Si,porelcontrario,laevaluacindelaexpresinlgica
ofreceunresultadofalso,noseejecutarlaprimerasentenciaoel
primerbloqueysseejecutarlasegundasentenciaoelsegundo
bloque.

Haciendo una interpretacin cercana al pseudocdigo


tendramosquesisecumplelacondicin(expresinlgica),
seejecutarunconjuntodeinstruccionesysinosecumple,
seejecutarotroconjuntodeinstrucciones.
Hay que tener en cuenta que la clusula else de la
sentencia if no es obligatoria. En algunos casos no
necesitaremos utilizarla, pero s se recomienda cuando es
necesario llevar a cabo alguna accin en el caso de que la
expresinlgicanosecumpla.
Enaquelloscasosenlosquenoexisteclusulaelse,silaexpresinlgicaesfalsa,simplementese
continuarnejecutandolassiguientessentenciasqueaparezcanbajolaestructuracondicionalif.
Los condicionales if e if-else pueden anidarse, de tal forma que dentro de un bloque de
sentencias puede incluirse otro if o if-else. El nivel de anidamiento queda a criterio del
programador, pero si ste es demasiado profundo podra provocar problemas de eficiencia y
legibilidad en el cdigo. En otras ocasiones, un nivel de anidamiento excesivo puede denotar la
necesidaddeutilizacindeotrasestructurasdeseleccinmsadecuadas.
Cuandoseutilizaanidamientodeestetipodeestructuras,esnecesarioponerespecialatencinen
saberaquif estasociadaunaclusulaelse.Normalmente,unelse estarasociadoconel
if inmediatamente superior o ms cercano que exista dentro del mismo bloque y que no se
encuentreyaasociadoaotroelse.

DEBESCONOCER
Paracompletarlainformacinquedebessabersobrelasestructurasifeifelse,observael
siguiente cdigo. En l podrs analizar el programa que realiza el clculo de la nota de un
examen de tipo test. Adems de calcular el valor de la nota, se ofrece como salida la

Usodeestructurasdecontrol

DAW

calificacin no numrica de dicho examen. Para obtenerla, se combinarn las diferentes


estructurascondicionalesaprendidashastaahora.
Prestaespecialatencinaloscomentariosincorporadosenelcdigofuente,ascomoala
forma de combinar las estructuras condicionales y a las expresiones lgicas utilizadas en
ellas.
package sentencias_condicionales;
/**
*
* Ejemplos de utilizacin de diferentes estructuras
* condicionales simples, completas y anidamiento de stas.
*/
public class Sentencias_condicionales {
/*Vamos a realizar el clculo de la nota de un examen
* de tipo test. Para ello, tendremos en cuenta el nmero
* total de pregunta, los aciertos y los errores. Dos errores
* anulan una respuesta correcta.
*
* Finalmente, se muestra por pantalla la nota obtenida, as
* como su calificacin no numrica.
*
* La obtencin de la calificacin no numrica se ha realizado
* combinando varias estructuras condicionales, mostrando expresiones
* lgicas compuestas, as como anidamiento.
*
*/
public static void main(String[] args) {
// Declaracin e inicializacin de variables
int num_aciertos = 12;
int num_errores = 3;
int num_preguntas = 20;
float nota = 0;
String calificacion="";
//Procesamiento de datos
nota = ((num_aciertos - (num_errores/2))*10)/num_preguntas;
if (nota < 5)
{
calificacion="INSUFICIENTE";
}
else
{
/* Cada expresin lgica de estos if est compuesta por dos
* expresiones lgicas combinadas a travs del operador Y o AND
* que se representa con el smbolo &&. De tal manera, que para
* que la expresin lgica se cumpla (sea verdadera) la variable
* nota debe satisfacer ambas condiciones simultneamente
*/
if (nota >= 5 && nota <6)
calificacion="SUFICIENTE";
if (nota >= 6 && nota <7)
calificacion="BIEN";
if (nota >= 7 && nota <9)
calificacion="NOTABLE";
if (nota >= 9 && nota <=10)
calificacion="SOBRESALIENTE";
}
//Salida de informacin
System.out.println ("La nota obtenida es: " + nota);
System.out.println ("y la calificacin obtenida es: " + calificacion);
}
}

DiseodeAplicacionesWeb

Tema4

AUTOEVALUACIN
Cundo se mostrar por pantalla el mensaje incluido en el siguiente fragmento de
cdigo?
If (numero % 2 == 0);
System.out.print(El nmero es par /n);

Nunca

Siempre

Cuandoelrestodeladivisinentre2delcontenidodelavariablenumero,seacero.

Aunquedetrsdelaexpresinlgicadelaestructuraifexisteunpuntoycoma,lasentenciaqueimprimeelmensajeenpantallasiempre
seejecutar.

3.2.Estructuraswitch
Qu podemos hacer cuando nuestro programa debe elegir entre ms de dos alternativas?, una
posiblesolucinpodraseremplearestructurasifanidadas,aunquenosiempreestasolucinesla
ms eficiente. Cuando estamos ante estas situaciones podemos utilizar la estructura de seleccin
mltipleswitch.Enlasiguientetablasemuestratantolasintaxis,comoelfuncionamientodeesta
estructura.
Estructuraswitch
Sintaxis:

Condiciones:
9 Dondeexpresindebeserdeltipochar,
byte,shortoint,ylasconstantesdecada
casedebenserdeestetipoodeuntipo
compatible.
9 Laexpresindebeirentreparntesis.
9 Cadacasellevarasociadounvaloryse
finalizarcondospuntos.
9 Elbloquedesentenciasasociadoala
clusuladefaultpuedefinalizarconuna
sentenciaderupturabreakono.

switch (expresion) {
case valor1:
sentencia1_1;
sentencia1_2;
.
break;
.
.
case valorN:
sentenciaN_1;
sentenciaN_2;
.
break;
default:
sentencias-default;
}

Funcionamiento:
9 Las diferentes alternativas de esta estructura estarn precedidas de la clusula case que se
ejecutarcuandoelvalorasociadoalcasecoincidaconelvalorobtenidoalevaluarlaexpresin
delswitch.
9 Enlasclusulascase,nopuedenindicarseexpresionescondicionales,rangosdevaloresolistas
de valores. (otros lenguajes de programacin s lo permiten). Habr que asociar una clusula
caseacadaunodelosvaloresquedebansertenidosencuenta.
9 Laclusuladefaultserutilizadaparaindicaruncasopordefecto,lassentenciasasociadasala
clusuladefaultseejecutarnsiningunodelosvaloresindicadosenlasclusulascasecoincide
conelresultadodelaevaluacindelaexpresindelaestructuraswitch.
9 La clusula default puede no existir, y por tanto, si ningn case ha sido activado finalizara el
switch.
9 Cadaclusulacasepuedellevarasociadasunaovariassentencias,sinnecesidaddedelimitar
dichosbloquespormediodellaves.
9 Enelmomentoenelqueelresultadodelaevaluacindelaexpresincoincideconalgunode
losvaloresasociadosalasclusulascase,seejecutarntodaslasinstruccionesasociadashasta
la aparicin de una sentencia break de ruptura. (la sentencia break se analizar en epgrafes
posteriores)

Usodeestructurasdecontrol

DAW

En resumen, se ha de comparar el valor de una expresin con un


conjuntodeconstantes,sielvalordelaexpresincoincideconalgn
valordedichasconstantes,seejecutarnlosbloquesdeinstrucciones
asociados a cada una de ellas. Si no existiese coincidencia, se
ejecutaranunaseriedeinstruccionespordefecto.

DEBESCONOCER
Compruebaelsiguientefragmentodecdigoenelqueseresuelveelclculodelanotade
unexamendetipotest,utilizandolaestructuraswitch.
package sentencias_condicionales;
/**
*
* @author Pc
*/
public class condicional_switch {
/*Vamos a realizar el clculo de la nota de un examen
* de tipo test. Para ello, tendremos en cuenta el nmero
* total de preguntas, los aciertos y los errores. Dos errores
* anulan una respuesta correcta.
*
* La nota que vamos a obtener ser un nmero entero.
*
* Finalmente, se muestra por pantalla la nota obtenida, as
* como su calificacin no numrica.
*
* La obtencin de la calificacin no numrica se ha realizado
* utilizando la estructura condicional mltiple o switch.
*
*/
public static void main(String[] args) {
// Declaracin e inicializacin de variables
int num_aciertos = 17;
int num_errores = 3;
int num_preguntas = 20;
int nota = 0;
String calificacion="";
//Procesamiento de datos
nota = ((num_aciertos - (num_errores/2))*10)/num_preguntas;
switch (nota) {
case 5: calificacion="SUFICIENTE";
break;
case 6: calificacion="BIEN";
break;
case 7: calificacion="NOTABLE";
break;
case 8: calificacion="NOTABLE";
break;
case 9: calificacion="SOBRESALIENTE";
break;
case 10: calificacion="SOBRESALIENTE";
break;
default: calificacion="INSUFICIENTE";
}
//Salida de informacin
System.out.println ("La nota obtenida es: " + nota);
System.out.println ("y la calificacin obtenida es: " + calificacion);
}
}

10

DiseodeAplicacionesWeb

Tema4

4. Estructuras de repeticin
CASO PRCTICO
Juan ya tiene claro cmo realizar la comprobacin de los valores de login y contrasea introducidos
por teclado, pero le surge una duda: Cmo podra controlar el nmero de veces que el usuario ha
introducido mal la contrasea?
Ada le indica que podra utilizar una estructura de repeticin que solicitase al usuario la introduccin
de la contrasea hasta un mximo de tres veces. Aunque comenta que puede haber mltiples
soluciones y todas vlidas, lo importante es conocer las herramientas que podemos emplear y saber
cundo aplicarlas.

Nuestros programas ya son capaces de controlar su ejecucin teniendo en cuenta determinadas


condiciones,peroanhemosdeaprenderunconjuntodeestructurasquenospermitarepetiruna
secuencia de instrucciones determinada. La funcin de estas estructuras es repetir la ejecucin de
unaseriedeinstruccionesteniendoencuentaunacondicin.
Aestetipodeestructurasselasdenominaestructurasderepeticin,estructurasrepetitivas,bucleso
estructurasiterativas.EnJavaexistencuatroclasesdebucles:
9
9
9
9

Buclefor(repitepara)
Buclefor/in(repiteparacada)
BucleWhile(repitemientras)
BucleDoWhile(repitehasta)

Losbuclesforyfor/inseconsideranbuclescontroladosporcontador.Porelcontrario,losbucles
whileydo...whileseconsideranbuclescontroladosporsucesos.
Lautilizacindeunosbuclesuotrosparasolucionarunproblemadependerengranmedidadelas
siguientespreguntas:
9 Sabemosaprioricuntasvecesnecesitamosrepetirunconjuntodeinstrucciones?
9 Sabemos si hemos de repetir un conjunto de instrucciones si una condicin satisface un
conjuntodevalores?
9 Sabemoshastacundodebemosestarrepitiendounconjuntodeinstrucciones?
9 Sabemos si hemos de estar repitiendo un conjunto de instrucciones mientras se cumpla una
condicin?

RECOMENDACIN
Estudia cada tipo de estructura repetitiva, conoce su funcionamiento y podrs llegar a la
conclusindequealgunosdeestosbuclessonequivalentesentres.Unmismoproblema,
podrserresueltoempleandodiferentestiposdebuclesyobtenerlosmismosresultados.
Estasyotraspreguntastendrnsurespuestaencuantoanalicemos
cadaunadeestructurasrepetitivasendetalle.

4.1.Estructurafor
Hemos indicado anteriormente que el bucle for es un bucle
controlado por contador. Este tipo de bucle tiene las siguientes
caractersticas:
9 Seejecutaunnmerodeterminadodeveces.

11

Usodeestructurasdecontrol

9 Utilizaunavariablecontadoraquecontrolalasiteracionesdelbucle.

DAW

Engeneral,existentresoperacionesquesellevanacaboenestetipodebucles:
9 Seinicializalavariablecontadora.
9 Se evala el valor de la variable contador, por medio de una comparacin de su valor con el
nmerodeiteracionesespecificado.
9 Semodificaoactualizaelvalordelcontadoratravsdeincrementosodecrementosdeste,en
cadaunadelasiteraciones.

RECOMENDACIN
Lainicializacindelavariablecontadoradeberealizasecorrectamenteparagarantizarqueel
buclelleveacabo,almenos,laprimerarepeticindesucdigointerno.
La condicin de terminacin del bucle debe variar en el interior del mismo, de no ser as,
podemoscaerenlacreacindeunbucleinfinito.Cuestinquesedebeevitarportodoslos
medios.
Es necesario estudiar el nmero de veces que se repite el bucle, pues debe ajustarse al
nmerodevecesestipulado.
Enlasiguientetabla,podemosverlaespecificacindelaestructurafor:
Estructurarepetitivafor
9 Donde inicializacin es una
Sintaxis:
expresinenlaqueseinicializaunavariable
for (inicializacin; condicin; iteracin)
de control, que ser la encargada de
sentencia;
controlarelfinaldelbucle.
(estructuraforconunanicasentencia)
9 Donde condicin es una expresin que
evaluar la variable de control. Mientras la
Sintaxis:
condicin sea falsa, el cuerpo del bucle
for (inicializacin; condicin; iteracin)
estar repitindose. Cuando la condicin se
{
cumpla,terminarlaejecucindelbucle.
sentencia1;
sentencia2;
9 Donde iteracin indica la manera en la
...
que la variable de control va cambiando en
sentenciaN;
}
cadaiteracindelbucle.Podrsermediante
(estructuraforconunbloquedesentencias)
incrementoodecremento,ynosolodeuno
enuno.

DEBESCONOCER
Como venimos haciendo para el resto de estructuras, observa el siguiente archivo Java y
podrsanalizarunejemplodeutilizacindelbucleforparalaimpresinporpantalladela
tablademultiplicardelsiete.Leeatentamenteloscomentariosincluidosenelcdigo,pues
aclaranalgunascuestionesinteresantessobreestebucle.
public class repetitiva_for {
/* En este ejemplo se utiliza la estructura repetitiva for
* para representar en pantalla la tabla de multiplicar del siete
*/
public static void main(String[] args) {
// Declaracin e inicializacin de variables
int numero = 7;
int contador;
int resultado=0;
//Salida de informacin
System.out.println ("Tabla de multiplicar del " + numero);
System.out.println (".............................. ");

12

DiseodeAplicacionesWeb

Tema4

//Utilizamos ahora el bucle for


for (contador=1; contador<=10;contador++)
/* La cabecera del bucle incorpora la inicializacin de la variable
* de control, la condicin de multiplicacin hasta el 10 y el
* incremento de dicha variable de uno en uno en cada iteracin del
* bucle.
* En este caso contador++ incrementar en una unidad el valor de
* dicha variable.
*/
{
resultado = contador * numero;
System.out.println(numero + " x " + contador + " = " + resultado);
/* A travs del operador + aplicado a cadenas de caracteres,
* concatenamos los valores de las variables con las cadenas de
* caracteres que necesitamos para representar correctamente la
* salida de cada multiplicacin.
*/
}
}
}

AUTOEVALUACIN
Cuando construimos la cabecera de un bucle for, podemos prescindir de alguno de los tres
elementos que la forman e incluso, podemos utilizar ms de una variable contadora separando
stas por comas. Pero, Qu conseguiremos si construimos un bucle de la siguiente forma?
for (;;){
//instrucciones
}

Unbucleinfinito.
Nada,darunerror.
Unbuclequeseejecutaraunanicavez.
Laconstruccindelacabeceradelbuclehaprescindidodecadaunadelaspartestpicas(inicializacin,condicineiteracin),peroal
mantenerlospuntosycomasenloslugaresadecuados,elconjuntodeinstruccionesquepudieranincluirseenelcuerpodelbucleestarn
ejecutndoseeternamente.

4.2.Estructurafor/in
Junto a la estructura for, for/in
tambin se considera un bucle
controlado por contador. Este
bucle es una mejora incorporada
enlaversin5.0.deJava.
Este tipo de bucles permite
realizar recorridos sobre arrays y
coleccionesdeobjetos.Losarrays
son colecciones de variables que
tienenelmismotipoysereferencianporunnombrecomn.Asmismo,lascoleccionesdeobjetos
sonobjetosquesedicesoniterables,oquesepuedeiterarsobreellos.
Estebucleesnombradotambincomobucleformejorado,obucleforeach.Enotroslenguajesde
programacinexistenbuclesmuyparecidosaeste.
Lasintaxiseslasiguiente:

13

Usodeestructurasdecontrol

DAW

for (declaracin: expresin) {


sentencia1;

sentenciaN;
}

9 Dondeexpresinesunarrayounacoleccindeobjetos.
9 Donde declaracin es la declaracin de una variable cuyo tipo sea compatible con
expresin.Normalmente,sereltipoyelnombredelavariableadeclarar.
El funcionamiento consiste en que para cada elemento de la expresin, guarda el elemento en la
variable declarada y haz las instrucciones contenidas en el bucle. Despus, en cada una de las
iteraciones del bucle tendremos en la variable declarada el elemento actual de la expresin. Por
tanto, para el caso de los arrays y de las colecciones de objetos, se recorrer desde el primer
elementoquelosformahastaelltimo.
Observa el contenido del cdigo representado en la siguiente imagen, puedes apreciar cmo se
construyeunbucledeestetipoysuutilizacinsobreunarray.
Los bucles for/in permitirn al programador despreocuparse del nmero de veces que se ha de
iterar,peronosabremosenquiteracinnosencontramossalvoqueseaadaartificialmentealguna
variablecontadoraquenospuedaofrecerestainformacin.

4.3.Estructurawhile
Elbuclewhileeslaprimeradelasestructurasderepeticincontroladasporsucesosquevamosa
estudiar. La utilizacin de este bucle responde al planteamiento de la siguiente pregunta: Qu
podemos hacer si lo nico que sabemos es que se han de repetir un conjunto de instrucciones
mientrassecumplaunadeterminadacondicin?.
La caracterstica fundamental de este tipo de estructura repetitiva estriba en ser til en aquellos
casosenlosquelasinstruccionesqueformanelcuerpodelbuclepodrasernecesarioejecutarlaso
no.Esdecir,enelbuclewhilesiempreseevaluarlacondicinquelocontrola,ysidichacondicin
escierta,elcuerpodelbucleseejecutarunavez,yseseguirejecutandomientraslacondicinsea
cierta.Perosienlaevaluacininicialdelacondicinstanoesverdadera,elcuerpodelbuclenose
ejecutar.
Es imprescindible que en el interior del bucle while se realice alguna accin que modifique la
condicinquecontrolalaejecucindelmismo,encasocontrarioestaramosanteunbucleinfinito.
Estructurarepetitivawhile
Sintaxis:
Sintaxis:
while (condicin)
sentencia;

while (condicin) {
sentencia1;

sentenciaN;
}

Funcionamiento:
Mientraslacondicinseacierta,elbucleserepetir,ejecutandola/sinstruccin/esdesuinterior.
En el momento en el que la condicin no se cumpla, el control del flujo del programa pasar a la
siguienteinstruccinqueexistajustodetrsdelbuclewhile.
La condicin se evaluar siempre al principio, y podr darse el caso de que las instrucciones
contenidasenlnolleguenaejecutarsenuncasinosesatisfacelacondicindepartida.

14

DiseodeAplicacionesWeb

Tema4

En la siguiente imagen puedes ver un diagrama de flujo que


representaelfuncionamientodeestetipodeestructura

DEBESCONOCER
Observaelsiguientecdigojavaypodrsanalizarunejemplo
de utilizacin del bucle while para la impresin por pantalla
de la tabla de multiplicar del siete. Lee atentamente los
comentarios incluidos en el cdigo, pues aclaran algunas
cuestiones interesantes sobre este bucle. Como podrs
comprobar, el resultado de este bucle es totalmente
equivalentealobtenidoutilizandoelbuclefor.
public class repetitiva_while {
public static void main(String[] args) {
// Declaracin e inicializacin de variables
int numero = 7;
int contador;
int resultado=0;
//Salida de informacin
System.out.println ("Tabla de multiplicar del " + numero);
System.out.println (".............................. ");
//Utilizamos ahora el bucle while
contador = 1; //inicializamos la variable contadora
while (contador <= 10) //Establecemos la condicin del bucle
{
resultado = contador * numero;
System.out.println(numero + " x " + contador + " = " + resultado);
//Modificamos el valor de la variable contadora, para hacer que el
//bucle pueda seguir iterando hasta llegar a finalizar
contador++;
}
}
}

AUTOEVALUACIN
Utilizando el siguiente fragmento de cdigo estamos construyendo un bucle infinito.
while (true)
System.out.println(Imprimiendo desde dentro del bucle \n);

Verdadero
Falso
Lacondicindelbuclesiempreserciertayestarcontinuamenteejecutndose.

4.4.Estructuradowhile
La segunda de las estructuras repetitivas controladas por sucesos es dowhile. En este caso, la
preguntaquenosplanteamoseslasiguiente:Qupodemoshacersilonicoquesabemosesquese
handeejecutar,almenosunavez,unconjuntodeinstruccionesyseguirrepitindosehastaquese
cumplaunadeterminadacondicin?.
La caracterstica fundamental de este tipo de estructura repetitiva estriba en ser til en aquellos
casosenlosquelasinstruccionesqueformanelcuerpodelbuclenecesitanserejecutadas,almenos,
una vez y repetir su ejecucin hasta que la condicin sea verdadera. Por tanto, en esta estructura
repetitivasiempreseejecutaelcuerpodelbucleunaprimeravez.
Esimprescindiblequeenelinteriordelbucleserealicealgunaaccinquemodifiquelacondicinque
controlalaejecucindelmismo,encasocontrarioestaramosanteunbucleinfinito.

15

Usodeestructurasdecontrol

Estructurarepetitivadowhile

DAW

Sintaxis:
do
{

Sintaxis:
do

sentencia1;

sentenciaN;

sentencia;
while (condicin);

}
while (condicin);

Funcionamiento:
Elcuerpodelbucleseejecutalaprimeravez,acontinuacinseevaluarlacondiciny,sistaes
falsa,elcuerpoelbuclevolverarepetirse.Elbuclefinalizarcuandolaevaluacindelacondicin
seaverdadera.Enesemomentoelcontroldelflujodelprogramapasaralasiguienteinstruccin
que exista justo detrs del bucle dowhile. La condicin se evaluar siempre despus de una
primera ejecucin del cuerpo del bucle, por lo que no se dar el caso de que las instrucciones
contenidasenlnolleguenaejecutarsenunca.
Enlasiguienteimagenpuedesverundiagramadeflujoquerepresenta
elfuncionamientodeestetipodeestructurarepetitiva.

DEBESCONOCER
Accedealsiguientearchivojavaypodrsanalizarunejemplode
utilizacin del bucle dowhile para la impresin por pantalla de
la tabla de multiplicar del siete. Lee atentamente los
comentarios incluidos en el cdigo, pues aclaran algunas
cuestiones interesantes sobre este bucle. Como podrs
comprobar, el resultado de este bucle es totalmente equivalente al obtenido utilizando el
bucleforyelbuclewhile.
public class repetitiva_dowhile {
public static void main(String[] args) {
// Declaracin e inicializacin de variables
int numero = 7;
int contador;
int resultado=0;
//Salida de informacin
System.out.println ("Tabla de multiplicar del " + numero);
System.out.println (".............................. ");
//Utilizamos ahora el bucle do-while
contador = 1; //inicializamos la variable contadora
do
{
resultado = contador * numero;
System.out.println(numero + " x " + contador + " = " + resultado);
//Modificamos el valor de la variable contadora, para hacer que el
//bucle pueda seguir iterando hasta llegar a finalizar
contador++;
}while (contador <= 10); //Establecemos la condicin del bucle
}
}

16

DiseodeAplicacionesWeb

Tema4

5. Estructuras de salto
CASO PRCTICO
Juan recuerda que algunos lenguajes de programacin permitan realizar saltos a lo largo de la
ejecucin de los programas y conoce dos sentencias que an se siguen utilizando para ello.
Ada, mientras toma un libro sobre Java de la estantera del despacho, le aconseja: Las instrucciones
de salto a veces han sido mal valoradas por la comunidad de programadores, pero en Java algunas
de ellas son totalmente necesarias. Mira, en este libro se habla del uso de las sentencias break,
continue y return...

Saltaronosaltar?heahlacuestin.Enlagranmayoradelibrosdeprogramacinypublicaciones
deInternet,siempresenosrecomiendaqueprescindamosdesentenciasdesaltoincondicional,es
ms,sedesaconsejasuusoporprovocarunamalaestructuracindelcdigoyunincrementoenla
dificultadparaelmantenimientodelosmismos.PeroJavaincorporaciertassentenciasoestructuras
de salto que es necesario conocer y que pueden sernos tiles en algunas partes de nuestros
programas.
Estasestructurasdesaltocorrespondenalassentenciasbreak,continue,lasetiquetasdesaltoyla
sentenciareturn.Pasamosahoraaanalizarsusintaxisyfuncionamiento.

5.1.Sentenciasbreakycontinue
Se trata de dos instrucciones que permiten modificar el comportamiento de otras estructuras o
sentenciasdecontrol,simplementeporelhechodeestarincluidasenalgnpuntodesusecuencia
deinstrucciones.
La sentencia break incidir sobre las estructuras de control switch, while, for y dowhile del
siguientemodo:
9 Siapareceunasentenciabreakdentrodelasecuenciadeinstruccionesdecualquieradelas
estructurasmencionadasanteriormente,dichaestructuraterminarinmediatamente.
9 Si aparece una sentencia break dentro de un bucle anidado slo finalizar la sentencia de
iteracinmsinterna,elrestoseejecutadeformanormal.
Esdecir,quebreaksirvepararomperelflujodecontroldeunbucle,aunquenosehayacumplidola
condicin del bucle. Si colocamos un break dentro del cdigo de un bucle, cuando se alcance el
break, automticamente se saldr del bucle pasando a ejecutarse la siguiente instruccin
inmediatamentedespusdel.
En la siguiente imagen, puedes apreciar
cmoseutilizaralasentenciabreakdentro
deunbuclefor.
La sentencia continue incidir sobre las
sentencias o estructuras de control while,
forydowhiledelsiguientemodo:
9 Siapareceunasentenciacontinuedentrodelasecuenciadeinstruccionesdecualquierade
las sentencias anteriormente indicadas, dicha sentencia dar por terminada la iteracin
actual y se ejecuta una nueva iteracin, evaluando de nuevo la expresin condicional del
bucle.

17

Usodeestructurasdecontrol

DAW

9 Si aparece en el interior de un bucle anidado solo afectar a la sentencia de iteracin ms


interna,elrestoseejecutaradeformanormal.
Esdecir,lasentenciacontinueforzaraqueseejecutelasiguienteiteracindelbucle,sinteneren
cuenta las instrucciones que pudiera haber despus del continue, y hasta el final del cdigo del
bucle.

En la imagen de la izquierda, puedes apreciar


cmo se utiliza la sentencia continue en un
bucle for para imprimir por pantalla slo los
nmerospares.

Para clarificar algo ms el funcionamiento de ambas sentencias de


salto,teofrecemosaladerechaundiagramarepresentativo.

AUTOEVALUACIN
La instruccin break puede utilizarse en las estructuras de control switch, while, for y dowhile, no siendo imprescindible utilizarla en la clusula defaultde la estructura switch.
Verdadero
Falso
si en una clusula default no existe una sentencia break, directamente se pasara a la finalizacin de la estructura condicional mltiple.

5.2.Etiquetas
Ya lo indicbamos al comienzo del epgrafe dedicado a las estructuras de salto, los saltos
incondicionales y en especial, saltos a una etiqueta son totalmente desaconsejables. No obstante,
Javapermiteasociaretiquetascuandosevaarealizarunsalto.Deestemodopuedeconseguirsealgo
msdelegibilidadenelcdigo.
Lasestructurasdesaltobreakycontinue,puedentenerasociadasetiquetas.Esaloquesellama
un break etiquetado o un continue etiquetado. Pero slo se recomienda su uso cuando se hace
necesariosalirdebuclesanidadoshaciadiferentesniveles.
Y cmo se crea un salto a una etiqueta? En primer lugar, crearemos la etiqueta mediante un
identificador seguidodedospuntos(:).Acontinuacin,seescribenlassentenciasJavaasociadasa
dichaetiquetaencerradasentrellaves.Porasdecirlo,lacreacindeunaetiquetaescomofijarun
puntodesaltoenelprogramaparapodersaltaraldesdeotrolugardedichoprograma.

18

DiseodeAplicacionesWeb

Tema4

Cmosellevaacaboelsalto?Essencillo,enellugardondevayamosacolocarlasentenciabreako
continue,aadiremosdetrselidentificadordelaetiqueta.Conello,conseguiremosqueelsaltose
realiceaunlugardeterminado.
Lasintaxisserbreak<etiqueta>.
Quizaaquellos/asquehanprogramadoenHTML lessueneestaherramienta,yaquetienecierta
similitudconlasanclasquepuedencrearseenelinteriordeunapginaweb,alasquenosllevarel
hiperenlaceolinkquehayamosasociado.
Tambinparaaquellos/asquehancreadoalgunavezarchivosporlotesoarchivosbatchbajoMSDOS
es probable que tambin les resulte familiar el uso de etiquetas, pues la sentencia GOTO que se
utilizaba en este tipo de archivos, haca saltar el flujo del programa al lugar donde se ubicaba la
etiquetaqueseindicaraendichasentencia.
A continuacin, te ofrecemos un
ejemplo de declaracin y uso de
etiquetas en un bucle. Como podrs
apreciar, las sentencias asociadas a
cadaetiquetaestnencerradasentre
llavesparadelimitarassumbitode
accin.

5.3.SentenciaReturn
Ya sabemos cmo modificar la ejecucin de bucles y estructuras condicionales mltiples, pero
Podramosmodificarlaejecucindeunmtodo?Esposiblehacerquestosdetengansuejecucin
antes de que finalice el cdigo asociado a ellos?. S es posible, a travs de la sentencia return
podremosconseguirlo.
Lasentenciareturnpuedeutilizarsededosformas:
9 Paraterminarlaejecucindelmtododondeestescrita,conloquetransferirelcontrolal
puntodesdeelquesehizolallamadaalmtodo,continuandoelprogramaporlasentencia
inmediatamenteposterior.
9 Paradevolveroretornarunvalor,siemprequejuntoareturnseincluyaunaexpresinde
untipodeterminado.Portanto,enellugardondeseinvocalmtodoseobtendrelvalor
resultantedelaevaluacindelaexpresinqueacompaabaalmtodo.
En general, una sentencia return suele aparecer al final de un mtodo, de este modo el mtodo
tendrunaentradayunasalida.Tambinesposibleutilizarunasentenciareturnencualquierpunto
de un mtodo, con lo que ste finalizar en el lugar donde se encuentre dicho return. No ser
recomendable incluir ms de un return en un mtodo y por regla general, deber ir al final del
mtodocomohemoscomentado.
Elvalorderetornoesopcional,silohubieradeberadeserdelmismotipoodeuntipocompatibleal
tipo del valor de retorno definido en la cabecera del mtodo, pudiendo ser desde un entero a un
objetocreadopornosotros.Sinolotuviera,eltipoderetornoseravoid,yreturnserviraparasalir

19

Usodeestructurasdecontrol

DAW

delmtodosinnecesidaddellegaraejecutartodaslasinstruccionesqueseencuentrandespusdel
return.

PARASABERMS
Enelsiguientearchivojavaencontrarselcdigodeunprogramaqueobtienelasumade
dosnmeros,empleandoparaellounmtodosencilloqueretornaelvalordelasumadelos
nmerosqueselehanpasadocomoparmetros.
Prestaatencinaloscomentariosyfjateenlasconversionesaenterodelaentradadelos
operandosporconsola.
import java.io.*;
/**
*
* Uso de return en un mtodo
*/
public class sentencia_return {
private
static
BufferedReader
InputStreamReader(System.in));

stdin

new

BufferedReader(

new

public static int suma(int numero1, int numero2)


{
int resultado;
resultado = numero1 + numero2;
return resultado; //Mediante return devolvemos el resultado de la suma
}
public static void main(String[] args) throws IOException {
//Declaracin de variables
String input; //Esta variable recibir la entrada de teclado
int primer_numero, segundo_numero; //Estas variables almacenarn los operandos
// Solicitamos que el usuario introduzca dos nmeros por consola
System.out.print ("Introduce el primer operando:");
input = stdin.readLine(); //Leemos la entrada como cadena de caracteres
primer_numero = Integer.parseInt(input); //Transformamos a entero lo introducido
System.out.print ("Introduce el segundo operando: ");
input = stdin.readLine(); //Leemos la entrada como cadena de caracteres
segundo_numero = Integer.parseInt(input); //Transformamos a entero lo introducido
//Imprimimos los nmeros introducidos
System.out.println ("Los operandos son: " + primer_numero + " y " + segundo_numero);
System.out.println ("obteniendo su suma... ");
//Invocamos al mtodo que realiza la suma, pasndole los parmetros adecuados
System.out.println
("La
suma
de
ambos
operandos
es:
suma(primer_numero,segundo_numero));

"

}
}

AUTOEVALUACIN
Qu afirmacin es correcta?
Conreturn,sepuedefinalizarlaejecucindelmtodoenelqueseencuentre.

Conreturn,siempreseretornarunvalordelmismotipoodeuntipocompatible

aldefinidoenlacabeceradelmtodo.
Conreturn,puederetornarseunvalordeundeterminadotipoysuelehacerseal

finaldelmtodo.Adems,elrestoderespuestastambinsoncorrectas.
Efectivamente,siencontramosunreturnantesdelafinalizacindelcdigoasociadoaunmtodo,stedevolverelcontroldelflujodel
programaalainstruccininmediatamenteposteriorqueexistiesetraslainvocacinalmtodo.

20

DiseodeAplicacionesWeb

Tema4

6. Excepciones
CASO PRCTICO
Para que las aplicaciones desarrolladas por BK Programacin mantengan una valoracin positiva a lo
largo del tiempo por parte de sus clientes, es necesario que stas no se vean comprometidas durante
su ejecucin. Hay innumerables ocasiones en las que programas que aparentemente son formidables
(por su interfaz, facilidad de uso, etc.) comienzan a generar errores en tiempo de ejecucin que hacen
que el usuario desconfe de ellos da a da.
Para evitar estas situaciones, Ada va a fomentar en Mara y Juan la cultura de la deteccin, control y
solucin de errores a travs de las poderosas herramientas que Java les ofrece.

A lo largo de nuestro aprendizaje de Java nos hemos topado en alguna ocasin con errores, pero
stos suelen ser los que nos ha indicado el compilador. Un punto y coma por aqu, un nombre de
variable incorrecto por all, pueden hacer que nuestro compilador nos avise de estos descuidos.
Cuandolosvemos,secorrigenyobtenemosnuestraclasecompiladacorrectamente.
Pero, Slo existen este tipo de errores? Podran existir errores no sintcticos en nuestros
programas?.Estclaroques,unprogramaperfectamentecompiladoenelquenoexistenerroresde
sintaxis,puedegenerarotrostiposdeerroresquequizaparezcanentiempodeejecucin.Aestos
erroresselesconocecomoexcepciones.
Aprenderemos a gestionar de manera adecuada estas excepciones y tendremos la oportunidad de
utilizarelpotentesistemademanejodeerroresqueJavaincorpora.Lapotenciadeestesistemade
manejodeerroresradicaen:
1. Queelcdigoqueseencargademanejarloserrores,esperfectamenteidentificableenlos
programas.Estecdigopuedeestarseparadodelcdigoquemanejalaaplicacin.
2. Que Java tiene una gran cantidad de errores estndar asociados a multitud de fallos
comunes, como por ejemplo divisiones por cero, fallos de entrada de datos, etc. Al tener
tantas excepciones localizadas, podemos gestionar de manera especfica cada uno de los
erroresqueseproduzcan.
EnJavasepuedenprepararlosfragmentosdecdigoquepuedenprovocarerroresdeejecucinpara
que si se produce una excepcin, el flujo del programa es lanzado (throw) hacia ciertas zonas o
rutinas que han sido creadas previamente por el programador y cuya finalidad ser el tratamiento
efectivo de dichas excepciones. Si no se captura la excepcin, el programa se detendr con toda
probabilidad.
En Java, las excepciones estn representadas por clases. El paquete java.lang.Exception y sus
subpaquetescontienentodoslostiposdeexcepciones.Todaslasexcepcionesderivarndelaclase
Throwable,existiendoclasesmsespecficas.PordebajodelaclaseThrowableexistenlasclases
Error y Exception. Error es una clase que se encargar de los errores que se produzcan en la
mquinavirtual,noennuestrosprogramas.YlaclaseExceptionserlaqueanosotrosnosinterese
conocer,puesgestionaloserroresprovocadosenlosprogramas.
Javalanzarunaexcepcinenrespuestaaunasituacinpocousual.Cuandoseproduceunerrorse
generaunobjetoasociadoaesaexcepcin.EsteobjetoesdelaclaseExceptionodealgunadesus
herederas.Esteobjetosepasaalcdigoquesehadefinidoparamanejarlaexcepcin.Dichocdigo
puedemanipularlaspropiedadesdelobjetoException.

21

Usodeestructurasdecontrol

DAW

El programador tambin puede lanzar sus propias excepciones. Las excepciones en Java sern
objetosdeclasesderivadasdelaclasebaseException.Existetodaunajerarquadeclasesderivada
delaclasebaseException.Estasclasesderivadasseubicanendosgruposprincipales:
9 Lasexcepcionesentiempodeejecucin,queocurrencuandoelprogramadornohatenido
cuidadoalescribirsucdigo.
9 Lasexcepcionesqueindicanquehasucedidoalgoinesperadoofueradecontrol.
EnlasiguienteimagenteofrecemosunaaproximacinalajerarquadelasexcepcionesenJava.

6.1.Capturarunaexcepcin
Parapodercapturarexcepciones,emplearemoslaestructuradecapturadeexcepcionestrycatch
finally.
Bsicamente,paracapturarunaexcepcinloqueharemosserdeclararbloquesdecdigodondees
posiblequeocurraunaexcepcin.Estoloharemosmedianteunbloquetry(intentar).Siocurreuna
excepcin dentro de estos bloques, se lanza una excepcin. Estas excepciones lanzadas se pueden
capturarpormediodebloquescatch.Serdentrodeestetipodebloquesdondeseharelmanejo
delasexcepciones.
Susintaxises:
try {
cdigo que puede generar excepciones;
} catch (Tipo_excepcion_1 objeto_excepcion) {
Manejo de excepcin de Tipo_excepcion_1;
} catch (Tipo_excepcion_2 objeto_excepcion) {
Manejo de excepcin de Tipo_excepcion_2;
}
...
finally {
instrucciones que se ejecutan siempre
}

En esta estructura, la parte catch puede repetirse tantas veces como excepciones diferentes se
deseencapturar.Lapartefinallyesopcionaly,siaparece,solopodrhacerlounasolavez.
Cadacatchmanejauntipodeexcepcin.Cuandoseproduceunaexcepcin,sebuscaelcatchque
poseaelmanejadordeexcepcinadecuado,serelqueutiliceelmismotipodeexcepcinqueseha
producido. Esto puede causar problemas si no se tiene cuidado, ya que la clase Exception es la

22

DiseodeAplicacionesWeb

Tema4

superclase de todas las dems. Por lo que si se produjo, por ejemplo, una excepcin de tipo
AritmethicExceptionyelprimercatchcapturaeltipogenricoException,seresecatchelque
seejecuteynolosdems.
Poresoelltimocatchdebeserelquecaptureexcepcionesgenricasylosprimerosdebenserlos
msespecficos.Lgicamentesivamosatrataratodaslasexcepciones(seandeltipoquesean)igual,
entoncesbastaconunsolocatchquecaptureobjetosException.
EJERCICIORESUELTO
RealizaunprogramaenJavaenelquesesolicitealusuariolaintroduccindeunnmeroporteclado
comprendidoentreel0y el100. Utilizandomanejode excepciones,debes controlarlaentradade
dichonmeroyvolverasolicitarloencasodequestaseaincorrecta.
/*
* Ejercicio resuelto sobre manejo de excepciones.
* El programa solicita que el usuario introduzca por teclado
* un nmero entre 0 y 100, debiendo gestionarse la entrada
* por medio de excepciones.
*/
import java.io.*;
public class ejercicio_resuelto_excepciones {
public static void main(String[] args){
int numero=-1;
int intentos=0;
String linea;
BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in));
do{
try{
System.out.print("Introduzca un nmero entre 0 y 100: ");
linea = teclado.readLine();
numero = Integer.parseInt(linea);
}catch(IOException e){
System.out.println("Error al leer del teclado.");
}catch(NumberFormatException e){
System.out.println("Debe introducir un nmero entre 0 y 100.");
}finally{
intentos++;
}
}while (numero < 0 || numero > 100);
System.out.println("El nmero introducido es: " + numero);
System.out.println("Nmero de intentos: " + intentos);
}
}

Enesteprogramasesolicitarepetidamenteunnmeroutilizandounaestructuradowhile,mientras
el nmero introducido sea menor que 0 y mayor que 100. Como al solicitar el nmero pueden
producirseloserroressiguientes:
9 Deentradadeinformacinatravs delaexcepcinIOExceptiongenerada porel mtodo
readLine()delaclaseBufferedReader.
9 DeconversindetiposatravsdelaexcepcinNumberFormatExceptiongeneradaporel
mtodoparseInt().
Entoncessehacenecesarialautilizacindebloquescatchquegestionencadaunadelasexcepciones
quepuedanproducirse.Cuandoseproduceunaexcepcin,secomparasicoincideconlaexcepcin
del primer catch. Si no coincide, se compara con la del segundo catch y as sucesivamente. Si se

23

Usodeestructurasdecontrol

DAW

encuentrauncatchquecoincideconlaexcepcinagestionar,seejecutarelbloquedesentencias
asociadoaste.
Si ningn bloque catch coincide con la excepcin lanzada, dicha excepcin se lanzar fuera de la
estructuratrycatchfinally.
Elbloquefinally,seejecutartantositrytermincorrectamente,comosisecapturunaexcepcin
enalgnbloquecatch.Portanto,siexistebloquefinallysteseejecutarsiempre.

DEBESCONOCER
Sideseasconocerenmayordetalleelmanejodeexcepciones,teaconsejamoselsiguiente
enlaceenelquepodrsencontrarunvdeoilustrativosobresucreacinymanejo.
http://www.youtube.com/watch?v=2gWTVxe31g8&feature=related
Elvideocomienzaindicandoqueexistenvariasformasdecapturarlasposiblesexcepcionesquenuestrosprogramas pueden generar.La
estructuratrycatchesanalizadaenprimerlugar,atravsdeunejemploqueconvierteunacadenadetextoaentero.Primerosehaceuna
gestin de la excepcin de manera sencilla y, posteriormente, se van aadiendo bloques catch para incluir diferentes posibilidades de
tratamiento de la excepcin en funcin del error generado. Seguidamente, se hace referencia a la utilizacin de la sentencia throw
exceptionparaindicarqueunmtodopuedegenerarunaexcepcin,perostanosergestionadaporelpropiomtodo,sinoporelquelo
llam.Esaloquesellamapropagacindeexcepciones.

AUTOEVALUACIN
Si en un programa no capturamos una excepcin, ser la mquina virtual de Java la que lo
har por nosotros, pero inmediatamente detendr la ejecucin del programa y mostrar una
traza y un mensaje de error. Siendo una traza, la forma de localizar dnde se han producido
errores.
Verdadero
Falso

Ases,siunmtodonogestionalasexcepcionesqueseproducenenl,laexcepcinserpasadaalmtodoquellamalmtodo.Yas
ocurrir sucesivamente si no existe gestin de las excepciones en niveles superiores, hasta llegar a la mquina virtual de Java que
detendrlaejecucindelprograma.

6.2.Elmanejodeexcepciones
Comohemoscomentado,siempredebemoscontrolarlasexcepcionesquesepuedanproducirode
lo contrario nuestro software quedar expuesto a fallos. Las excepciones pueden tratarse de dos
formas:
9 Interrupcin. En este caso se asume que el programa ha encontrado un error
irrecuperable.Laoperacinquediolugaralaexcepcinseanulayseentiendequenohay
maneraderegresaralcdigoqueprovoclaexcepcin.Esdecir,laoperacinquedioorigin
elerror,seanula.
9 Reanudacin. Se puede manejar el error y regresar de nuevo al cdigo que provoc el
error.
Javaemplealaprimeraforma,peropuedesimularselasegundamediantelautilizacindeunbloque
try en el interior de un while, que
se repetir hasta que el error deje
de existir. En la siguiente imagen
tienes un ejemplo de cmo llevar a
caboestasimulacin.
En este ejemplo, a travs de la

24

DiseodeAplicacionesWeb

Tema4

funcin de generacin de nmeros aleatorios se obtiene el valor del ndice i. Con dicho valor se
accede a una posicin del array que contiene cinco cadenas de caracteres. Este acceso, a veces
puede generar un error del tipo ArrayIndexOutOfBoundsException, que debemos gestionar a
travs de un catch. Al estar el bloque catch dentro de un while, se seguir intentando el acceso
hastaquenohayaerror.

6.3.Delegacindeexcepcionesconthrows
Puede haber problemas con las excepciones al usar llamadas a mtodos en nuestros programas?
Efectivamente, si se produjese una excepcin es necesario saber quin ser el encargado de
solucionarla. Puede ser que sea el propio mtodo llamado o el cdigo que hizo la llamada a dicho
mtodo.
Quizpudiramospensarquedeberaserelpropiomtodoelqueseencarguedesusexcepciones,
aunqueesposiblehacerquelaexcepcinsearesueltaporelcdigoquehizolallamada.Cuandoun
mtodo utiliza una sentencia que puede generar una excepcin, pero dicha excepcin no es
capturadaytratadaporl,sinoqueseencargasugestinaquinllamalmtodo,decimosquese
haproducidodelegacindeexcepciones.
Para establecer esta delegacin, en la cabecera del mtodo se declara el tipo de excepciones que
puedegeneraryquedebernsergestionadasporquieninvoqueadichomtodo.Utilizaremospara
ellolasentenciathrowsytrasesapalabraseindicaquexcepcionespuedeprovocarelcdigodel
mtodo.Siocurreunaexcepcinenelmtodo,elcdigoabandonaesemtodoyregresaalcdigo
desdeelquesellamalmtodo.Allseposarenelcatchapropiadoparaesaexcepcin.Susintaxis
eslasiguiente:
public
...
public
String
Return
}
...
}

class delegacion_excepciones {
int leeao(BufferedReader lector) throws IOException, NumberFormatException{
linea = teclado.readLine();
Integer.parseInt(linea);

DondeIOExceptionyNumberFormatException,serandosposiblesexcepcionesqueelmtodo
leeaopodragenerar,peroquenogestiona.Portanto,unmtodopuedeincluirensucabeceraun
listadodeexcepcionesquepuedelanzar,separadasporcomas.

PARASABERMS
Si deseas saber algo ms sobre la delegacin de excepciones, te proponemos el siguiente
enlace:
http://dis.um.es/~bmoros/Tutorial/parte9/cap93.html
AdemstevolvemosaremitiralvideodemostrativosobremanejodeexcepcionesenJava
queseincluyenelepgrafeanterior,tituladocapturarunaexcepcin.

25

Usodeestructurasdecontrol

DAW

7. Prueba de programas
CASO PRCTICO
Continuando con el especial inters de BK Programacin porque sus aplicaciones sean de verdadera
calidad, Ada est dispuesta a emprender un plan de pruebas de software que sea capaz de reducir al
mnimo posible los errores que puedan contener las aplicaciones que estn desarrollando.
Juan y Mara ya conocan de la existencia de ciertas pruebas que se suelen hacer al software, pero
necesitarn aprender bien las tcnicas y utilizar las herramientas que los entornos de desarrollo
ofrecen para tal proceso.

A veces, los programas son complejos y es difcil hacer que stos funcionen correctamente. Las
pruebasdelsoftwaresonunconjuntodetcnicasutilizadasparaverificarqueunprogramallevaa
cabosutareacorrectamente.Vindolodesdeotropuntodevista,podramosdecirquelarealizacin
depruebasennuestrosprogramasintentanrevelarlaexistenciadeerrores.Cuandodetectamosque
existeunerror,necesitamoslocalizarlollevandoacabotcnicasdedepuracindecdigo,paraluego
acometerlasmodificacionesnecesariasqueeliminendichoerror.
Noobstante,lastcnicasdepruebadelsoftwarenogarantizanquetodosloserroresvayanasalira
laluzyanas,habrprogramasdegrantamaoquesiganconteniendoerroresocultosenellos.De
todas maneras, la realizacin de pruebas de software est considerada como una etapa de gran
importancia en el desarrollo de software. Casi la mitad del tiempo dedicado al desarrollo de un
programa,seempleaenlarealizacindepruebasalmismo.Enalgunasorganizaciones,larealizacin
de pruebas se considera tan importante que existen equipos de desarrollo de software en los que
haytantosprobadoresdesoftwarecomoprogramadores.
Los procesos de prueba y depuracin requieren una considerable cantidad de tiempo y esfuerzo,
hacindosedifciltomarunadecisinacertadaentrecontinuarlapruebadelprogramaoentregarlo
ensuestadoactualalcliente.
Un concepto muy importante con el que vamos a trabajar es el de verificacin de programas. La
verificacindeprogramasesunprocesoporelqueseintentacorroborarqueunprogramahacelo
queseesperadel.Setratadeconfirmarqueelprogramacumpleconsusespecificaciones.
En esta parte de la unidad nos centraremos en las tcnicas de prueba sistemtica de programas,
verificacinyanlisisdedeficienciasdelsoftware.
Lastcnicasqueveremosson:
9
9
9
9

Pruebasdecajanegraotestfuncionales.
Pruebasdecajablancaotestestructurales.
Revisionesorecorridos.
Anlisispasoapasodelcdigoconundepurador(debugger).

Unpequeoprogramaqueconsistesloenunanicaclase,normalmentepuedeserprobadodeuna
solavez.Encambio,unprogramademayortamaoqueincluyemscantidaddeclases,esposible
queporsucomplejidad,debaserprobadoporpartes.EnJava,eltamaonaturaldecadaunadeesas
partesserlaclaseyserconvenienteprobarnuestrosprogramasclaseporclase.Estoesllamado
PruebasdeUnidad.Ycuandoserealizanpruebasdefuncionamientoreuniendotodaslaspartesdel
programacompleto,laspruebasrecibenelnombredePruebasdeIntegracinoPruebasdeSistema.

26

DiseodeAplicacionesWeb

Tema4

AUTOEVALUACIN
En el proceso de [ verificacin ] se trata de confirmar que el programa cumple con sus [
especificaciones].

7.1.Laespecificacin
Elpuntodepartidaparacualquierpruebaeslaespecificacin.Nopodemosconsiderarunaprdida
de tiempo el anlisis claro de dicha informacin. En ocasiones, podra ser necesario volver a
entrevistaraunclienteoalfuturousuariodelprograma.
Paraentenderlaimportanciadeesteelemento,supongamoslasiguienteespecificacin:
9 Esnecesarioescribirunprogramaquesolicitelaentradaalusuariodenmerosatravsde
cajasdetexto.Elprogramadebecalcularymostrarlasumadelosnmeros.
A priori, esta especificacin puede parecer simple y clara. Nada ms lejos de la realidad, ya que
existenlagunascomo:
1. Losnmerossonenterosocomaflotante?
2. Culeselrangoyprecisindedichosnmeros?
3. Puedenincluirsenmerosnegativos?
Si estas preguntas no son aclaradas antes de que el programador comience su trabajo, pueden
producirse dificultades en el desarrollo del programa. Por tanto, ser parte del proceso de
programacin el estudio de la especificacin para descubrir cualesquiera omisiones o confusin y
paraconseguirunaespecificacintotalmenteclara.
Acontinuacinsemuestraunaversinmuchomsclaradelaespecificacinanterior:
9 Esnecesarioescribirunprogramaquesolicitelaentradaalusuariodeunaseriedenmeros
enterosatravsdeunacajadetexto.Losenterosestnenelrango0a10000.Elprograma
calculaymuestralasumadelosnmeros.
Comopuedesapreciar,estaespecificacinesmsprecisaalestablecerelrangopermitidodeentrada
devalores,porejemplo.
Unavezvaloradalaimportanciadeunacorrectaespecificacin,elprogramadorpuedecomenzarel
proceso de pruebas del software a travs de las herramientas que se detallarn en los siguientes
epgrafesdelaunidad.

7.2.Pruebasexhaustivas
He de probar todas las posibilidades?, es una pregunta que puede surgir cuando comenzamos a
programar. Podramos pensar en que la realizacin de una prueba requerira probar nuestro
software con todos los posibles valores de entrada. Este tipo de prueba se denomina prueba
exhaustiva y significa que seleccionamos todos los posibles valores de entrada, as como todas sus
posiblescombinacionesyhacemosquenuestroprogramaopereconellos.Pensemosunmomento
enelampliorangodeposiblesvaloresquepuedentomarlosnmerosintdeJava.Teimaginaslo
quepuedesuponerrealizarunapruebadeestetipo?podramosestarhablandodeaos!.

27

Usodeestructurasdecontrol
DAW

En resumen, la pruebaa exhaustivaa (aunque sea


s para un
n programa pequeo) n
no es factib
ble. Es
importante reconocer que
q la prueb
ba completaa de program
mas no es posible, por lo que tendrremos
queadoptarotrastcnicasmsadeecuadas.

AUTOEV
VALUACI
N
Durante unna prueba exhaustiva
e
h
hemos
de seeleccionar una
u muestraa de los possibles valorres de
entrada deel programaa y hacer que
q ste tom
me diferentes caminoss de ejecuciin para veer los
resultados que se obtieenen.
dadero
Verd
Falsso

Nosetratadep
probarlosdifereentescaminosdeeejecucin,setra
atadeprobarco
ontodoslosposib
blesvaloresdeen
ntradadelprogrrama,lo
cualpuederesu
ultarextremadam
mentetedioso.

7.3.Prueb
basdeCa
ajaNegraoPruebassFuncion
nales
Descartadass las pruebaas exhaustivvas, una tccnica ms aadecuada paara la
realizacin de
d nuestras pruebas es el empleo de
d las Pruebas de Caja Negra.
N
E
Estetipode
basaenutilizzarunosdato
osdeentrad
daquepuede
enser
pruebasseb
representativo
os de todos los posibles datos de en
ntrada. Con ellos, se pone en
funccionamientoelprogramaayseanalizaaquocurre..
d Caja Negrra porque no se utiliza ningn cono
ocimiento deel funcionam
miento intern
no del
Se llaman de
programa como
c
parte de la prueb
ba, slo se consideran
c
laas entradas y las salidass. El program
ma se
piensacomosifueraun
nacajanegraaquerecibedatosdeen
ntradayofreceunassalid
dasdetermin
nadas.
mbredePruebasFuncio
onalesporqueutilizasolaamenteelco
onocimiento
odela
Tambinreecibenelnom
funcindelprograma(n
nocmotrab
bajainternam
mente).
previsto,anttesdeejecuttarlapruebaa.Esa
Inicialmentee,seanotanlosdatosdeepruebayeelresultadop
loquesedeenominaesp
pecificacino
oplanificaci
ndelaprue
eba.Posterio
ormente,seponeelproggrama
enfuncionaamiento,se introducenllosdatosysseexaminanlassalidasp
paraversieexistendifere
encias
entreelresultadoprevistoyelresu
ultadoobteniido.Losdato
osdepruebaadeberntambincomp
probar
n manejadass por el programa, de acuerdo a su especificacin. Es decir,
si las excepciones son
tendremos que ponerr en aprieto
os a nuestrro programaa a travs de unos d
datos de en
ntrada
determinad
dos,paracom
mprobarsireeaccionacorrectamentealasespecifficacionesqu
uedebacumplir.

7.4.Pru
uebasdeCajaBlan
ncaoPrue
ebasEstru
ucturales
Esteotrotipodeprruebassebaasaenelconocimientodelfuncionam
mientointern
nodel
program
ma,laestruccturadelmismoparase
eleccionarlo
osdatosdep
prueba.Alolargo
de las pruebas de caja blanca cada declarracin que forma
f
parte del program
ma es
ejecutadaenalgnmom
n
mento.Porlo
oquecadasecuenciadeinstruccioneesocaminoporel
quepueda fluirelproggramaesejecutadaenalgunaocasi
nduranted
dichapruebaa.Considerndose
caminosnu
ulos,sentencciascondicionalessimpleesocompuestas,bucles,,etc.Laprueebadeberiincluir
cualquiercaaminodelprrogramaqueepuedageneerarunaexce
epcin.
Estetipodeepruebasesttmuyligadoalcdigoffuentedelprrograma,detalforma,quelaperson
naque
realizalasp
pruebasdebeeescogerdisstintosvaloresdeentrad
daparacheq
quearcadaunodelospo
osibles

28

DiseodeAplicacionesWeb

Tema4

caminosdeejecucinqueexistenenelprogramayverificarquelosresultadosdecadaunodeellos
sonadecuados.

AUTOEVALUACIN
Si nos encontramos realizando pruebas y estamos examinando el funcionamiento de un bucle
while, estaremos realizando Pruebas de Caja [ Blanca ].

7.5.Otraspruebas
Adems de las tpicas pruebas de Caja Blanca y Negra, existen otras tcnicas de prueba que
detallamosacontinuacin:
a) Revisiones,inspeccionesorecorridos:
Estatcnicanohaceusodelcomputadorparaintentarerradicarerroresenelcdigo.Enun
recorridoseestudiaellistadodelprograma(juntoconlaespecificacin)paraintentarhacer
visibleslosposibleserrores.Esrecomendableque quienlleveacaboelrecorridonoseala
mismapersonaquedesarrollelcdigoarevisar.
Sihasprogramadoalgunavez,quiztesueneestasituacin:
Llevasmsdeunahorabuscandounerrorenelcdigodetuprograma,yaquesteteest
generando errores de compilacin o ejecucin. Miras, vuelves a mirar, revisas, repasas,
cambiasalgunavariableosentencia,...Nada,noencuentroelfallo!.Depronto,uncolega
releetucdigomientrassetomauncafyoyesdetrsdetiunavozquedice:Anda,tefalta
unparntesisah!.

Sabidurapopular:Cuatroojosvenmsquedos.
Para llevar a cabo este tipo de prueba necesitaremos la especificacin del programa y el
cdigofuenteenpapel.Lasaccionesquesuelenrealizarseson:inspeccionarlainicializacin
devariables,realizacindellamadasamtodoscorrectas,definicinadecuadadecabeceras
demtodos,parmetroscorrectos,etc.Posteriormente,sehadellevaracabounarevisin
de la lgica del programa simulando ejecutar los mtodos como si nosotros mismos
furamos el computador. Las pruebas de revisin o recorrido no comprueban el estilo del
cdigo, sino posibles deficiencias que pueden provocar errores. Est demostrado que los
recorridossonunavaadecuadaparaencontrarerrores.
a) Anlisispasoapaso:
ExistenalgunosentornosdedesarrolloparaJavaqueincorporandepuracinpasoapasodel
cdigo.Estopermitealprogramadorejecutarunaaunacadainstruccindesuprograma.De
este modo, es posible ver qu camino de ejecucin se est tomando, los valores de las
distintas variables, etc. Este anlisis paso a paso est estructurado y automatizado,
permitindonos comprobar si el flujo del programa es el correcto, si los valores de las
variablesvaranenfuncindelaejecucindelprograma,etc.
Estatcnicasueleconfirmarodesmentirlaexistenciadeundeterminadofallo,aunqueest
mscercadeladepuracindeprogramasquedelapropiapruebadelosmismos.

29

Usodeestructurasdecontrol

DAW

7.6.RealizacindePruebasUnitariasconJUnit
Alcomienzodeestapartedelaunidaddedicadaalaspruebasydepuracindesoftware,hablamos
deuntipodepruebasqueseaplicanacadaunadelasclasesquehayamosdefinido.EranlasPruebas
Unitarias.
Esciertoquecualquiercdigoqueescribamosdeberadeserprobadoantesdedarporfinalizadala
implementacin de una clase, ya que si no, no estaramos totalmente seguros de su correcto
funcionamiento. Para verificar que el cdigo no contiene errores de programacin y que adems
realiza adecuadamente lo que nosotros esperbamos de l, es realizando una serie de test que lo
corroboren.
Quinnohaidoescribiendomensajesdesalidadetextoalolargodesucdigo?Estaesunatcnica
muyutilizadaparacontrolarelvalordeciertasvariablesyparaladeteccindeposibleserrores,lo
queconfirmaquetodosrealizamospruebasanuestrosprogramasdealgunauotramanera.
Pero,Existenformasmsavanzadas,eficientesysegurasdeprobarelcdigo?,S.Podemosutilizar
paraelloJUnit.AtravsdeJUnittendremoslaposibilidadderealizartestanuestrasclasesdeforma
sencilla,rpidayelegante,ascomovalidarlosresultadosquenosofrecen.
YquesJUnit?EsunconjuntodebibliotecasqueseutilizanenprogramacinparahacerPruebas
UnitariasaaplicacionesJava.Elconjuntodeclases(framework)incluidasenJUnitpermitecontrolar
laejecucindelasclasesJava,detalformaquepodremosevaluarsielfuncionamientodecadauno
delosmtodosdelaclaserealizasutrabajocomodebera.JUnitseempleaparaindicarsilaclaseen
cuestin ha pasado los test de prueba, en otro caso se devolver una notificacin de fallo en el
mtodocorrespondiente.
Actualmente, el entorno de desarrollo NetBeans cuanta con plugins que permiten la generacin
automticadeplantillasdepruebasdeclasesJava.
PorquutilizarJUnit?Acontinuacintedamosalgunasrazonesdepesoporlaqueesteframework
estmuyextendidoentrelacomunidaddeprogramadoresJava:
9 AtravsdelostestdeJUnitseincrementalacalidadyvelocidaddegeneracindecdigo.
9 Laescrituradetestessencilla.
9 Los test JUnit chequean sus propios resultados y proporcionan informacin de retorno al
instante.
9 LostestsJUnitincrementanlaestabilidaddelsoftware.
9 LostestJUnitseescribenenJava.
9 JUnitesgratuito.

PARASABERMS
El IDE NetBeans 7.0. ya incorpora JUnit desde la instalacin, por lo que podemos beneficiarnos de
esta herramienta de testeo slo con utilizarla desde el IDE. Si quieres conocer cmo realizar los
primerospasosconellayverejemplosdeutilizacin,terecomendamosveaslosiguiente:

Test con JUnit


ElviernesdicteuntallerenelqueconversbamossobreTecnologasJavayluegodesarrollamos
unaaplicacinmuybsicaparademostrarcmoutilizarJUnitconNetBeans.

30

Dise
odeAplicaccionesWeb

Tema4
4

Pasoss
1

CreearunproyectoDesktop
con
nNetBeans

Creearunaclaseellamada
Operaciones

Diseadosunfo
ormularioy
agrregramoscom
mponentesd
de
maneraquequ
uedesimilaraala
figu
ura:

Cdiggodelosbottones
try {
do
ouble a = Do
ouble.parseDo
ouble(jTextF
Field1.getTe
ext());
do
ouble b = Do
ouble.parseDo
ouble(jTextF
Field2.getTe
ext());
Op
peraciones operaciones
o
= new Operac
ciones();
do
ouble r = op
peraciones.Su
umar(a, b);
jT
TextField3.setText(Strin
ng.valueOf(r
r));
} cat
tch (Excepti
ion ex) {
JO
OptionPane.showMessageDialog(this, ex.getMessa
age().toStri
ing());
}

Creamoslostest

S
Seleccionam
moslasclasess

EnelmenHerramientaas,
mosCrearpru
uebasJUnit
seleccionam

S
Seleccionam
moslaversin
ndeJUnit

31

Usodeestructurasdecontrol

DAW

onamos
Enlaventanasiguienteseleccio
pruebas.
losparrmetrosparranuestrasp
LequittamoslaseleeccinaProb
bar
InicializadoryProb
barFinalizado
or

NetBeaanscrealascclasesdeTesst.
Observvequelasclaasesterminaanen
TEST

oslaclaseOperacionesTTest.java.
Abrimo
10 Segenerarlosmttodosdelaclase
originaal.

Editam
mostodaslassclasesy
comen
ntamoslalineeafail("Thettestcase
isapro
ototype.");colocando//
11
(comentarios)delaantedelasen
ntencia.
Ahoraindicamoslo
osparmetro
osparael
testyeelresultado.

12 Ejecutaamoseltest

Nosmuestralasaliidacolorverrde
13 indican
ndoquelasp
pruebasfuerron
exitosaas.

Pensem
mosquealgu
uienporerro
orcambia
elcdigodelmtodoSumar()
quedandodeestamanera
14

public double Suma


ar(double a,
, double
b){
return a + b * 2;
}

Ejecutaamosnuevam
menteeltesst

32

Dise
odeAplicaccionesWeb

Tema4
4

Observamossendetallelasalida

Estoindicaenelmtodoque
eestaelerro
orypodamo
oscorregirlo..Erauntalleemuybsico
opara
estud
diantesquenuncahanu
utilizadoTestt.

mosotropaso
oapasodeccmousarJU
UnitenNetB
Beans.
Veam
Crearrunaclase(V
Veamoscm
mocrearunaaclasedetesst)

SSobrelaclasequedeseamos
t
testearpulsa
aconelbot
n
d
derechoene
elmen

ToolsCre
eateJUnitT
Test.

PulsaOK.
P
Y
Ysecrearu
unanuevaclaasede
t
testconeles
squeletoquee
p
permitirpro
obarlaclase.
L
Lanuevaclas
sesecreaen
nel
m
mismopaqu
etequelaclasea
enlalocalizacin
t
testearpero

TestPackag
ges.Ademsssellama
c
comolaclase
eoriginalpero
lsufijoTest.
a
aadiendoe

33

Usodeestructurasdecontrol

DAW

Ahorayapuedesprogramarla
clasedeTest.

EjecutandolosTest

Pulsaconelbotnderechosobre
elproyectoyejecutalaopcinde
menTest.

Enesteejemplopodemosverlasiguienteinformacin:
Aparecerenlaventanainferior a) %detestpasados(58,3%),esdecirloquehan
funcionado.
elresultadodeejecutarlosTests.
b) ElNdetestpasados(7tests),elNdetestquehan
fallado(5Tests)yeltiempoquehantardadoen
ejecutarse(0,266segundos)
c) Eliconoenverdesignificaquetodoslostestdeesaclase
hanfuncionadocorrectamente.
d) Eliconoenrojosignificaquealmenosuntesthafallado.
e) Eliconoenverdesignificaqueesetestconcretoenla
clasehafuncionadocorrectamente.

34

DiseodeAplicacionesWeb

f)

Tema4

LosiconosamarillosignificanquesonTestquehan
fallado.

MiraahoraelsiguientevdeodeejemplosconJUnit
http://www.youtube.com/watch?v=SkQH637rpM
En este video se realiza una introduccin inicial a las funciones principales del framework JUnit,
posteriormente se indica dnde y cmo llevar a cabo la descarga del framework y su instalacin
como plugin en el IDE Eclipse. (Estas acciones no habra que llevarlas a cabo en NetBeans 7.0.). A
continuacin,atravsdeunejemplodesumadedosoperandos,creauntestparacomprobarque
losmtodosdelaclasellevanacabocorrectamentesusfunciones.

AUTOEVALUACIN
En versiones anteriores a NetBeans 7.0., para poder trabajar con el FrameWork JUnit era
necesario incorporarlo manualmente al IDE.
Verdadero
Falso

Efectivamente,yaenlaversin7.0.noesnecesarioyalrealizarlainstalacinseaceptalalicenciadeJUnitdesdeelinicio.Conloque
podremosutilizaresteFrameWorkdirectamenteennuestroNetBeans7.0.

35

Usodeestructurasdecontrol

DAW

8. Depuracin de programas
CASO PRCTICO
Ada y Juan ya conocen las capacidades del depurador que incorpora el entorno NetBeans y van a
ensear a Mara las ventajas de utilizarlo.
Puedes depurar tus programas haciendo dos cosas: creando Breakpoints o haciendo ejecuciones
paso a paso. Le comenta Juan.
Mara, que estaba codificando un nuevo mtodo, se detiene un momento y pregunta: Entonces,
cuando el programa llega al Breakpoint podr saber qu valor tiene una variable determinada?
Efectivamente Mara, y podrs saber el valor de aquellas que t decidas. De este modo a travs de
los puntos de ruptura y de las ejecuciones paso a paso podrs descubrir dnde puede haber errores
en tus programas. Conocer bien las herramientas que el depurador nos ofrece es algo que puede
ahorrarnos mucho trabajo. Aporta Ada.

La Depuracin de programas es el proceso por el cual se identifican y corrigen errores de


programacin. Generalmente, en el argot de programacin se utiliza la palabra debugging, que
significalocalizacinyeliminacindebichos(bugs)oerroresdeprograma.Atravsdeesteproceso
sedescubrenloserroresyseidentificaquzonasdelprogramalosproducen.Haytresetapasporlas
queunprogramapasacuandosteesdesarrolladoyquepuedengenerarerrores:
9 Compilacin: Una vez que hemos terminado de afinar un programa, solemos pasar
generalmente cierto tiempo eliminando errores de compilacin. El compilador de Java
mostrar una serie de chequeos en el cdigo, sacando a la luz errores que pueden no
apreciarseasimplevista.Unavezqueelprogramaesliberadodeloserroresdecompilacin,
obtendremosdelalgunosresultadosvisiblesperoquiznohagaanloquequeremos.
9 Enlazado:Todoslosprogramashacenusodelibrerasdemtodosyotrosutilizanmtodos
generadosporlospropiosprogramadores.Unmtodoesenlazado(linked)slocuandoste
es llamado, durante el proceso de ejecucin. Pero cuando el programa es compilado, se
realizan comprobaciones para saber si los mtodos llamados existen y sus parmetros son
correctosennmeroytipo.Asqueloserroresdeenlazadosondetectadosdurantelaetapa
decompilacin.
9 Ejecucin:Cuandoelprogramaentraenejecucin,esmuyfrecuentequestenofuncione
como se esperaba. De hecho, es normal que el programa falle. Algunos errores sern
detectados automticamente y el programador ser informado, como acceder a una parte
deunarrayquenoexiste(errordendices)porejemplo.Otrossonmssutilesydanlugar
simplemente a comportamientos no esperados, debido a la existencia de errores ocultos
(bugs)enelprograma.Deahlostrminosbugydebugging.Elproblemadeladepuracines
quelossntomasdeunposibleerrorsongeneralmentepococlaros,hayquerecurrirauna
labordeinvestigacinparaencontrarlacausa.
Ladepuracindeprogramasesalgoascomoserdoctor:existeunsntoma,hemosdeencontrarla
causayentoncesdeterminarelproblema.Eltrabajodeeliminacindeerrorespuedeserinteresante.
Ladepuracinylapruebasuelenrequerirunacantidaddetiempoconsiderableencomparacincon
eltiempodedicadoalaprimeracodificacindelprograma.Peronotepreocupes,esnormalemplear
mstiempoenesteproceso.
Y cmo llevamos a cabo la depuracin de nuestros programas?, pues a travs del debugger o
depurador del sistema de desarrollo Java que estemos utilizando. Este depurador ser una
herramienta que nos ayudar a eliminar posibles errores de nuestro programa. Podremos utilizar
depuradores simples, como el jdb propio de Java basado en lnea de comandos. O bien, utilizar el

36

DiseodeAplicacionesWeb

Tema4

depurador existente en nuestro IDE (en nuestro caso NetBeans). Este ltimo tipo de depuradores
muestralossiguienteselementosenpantalla:Elprogramaenfuncionamiento,elcdigofuentedel
programaylosnombresyvaloresactualesdelasvariablesqueseseleccionen.
Quelementospodemosutilizareneldepurador?Existenalmenosdoselementosfundamentales
quepodemosutilizarennuestrodebuggerodepurador,sonlossiguientes:
9 Breakpointsopuntosderuptura:Estospuntospuedenserdeterminadosporelpropio
programadoralolargodelcdigofuentedesuaplicacin.UnBreakpointesunlugarenel
programa en el que la ejecucin se detiene. Estos puntos se insertan en una determinada
lnea del cdigo, entonces el programa se pone en funcionamiento y cuando el flujo de
ejecucinllegahastal,laejecucinquedacongeladayunpunteroindicaellugarenelque
la ejecucin se ha detenido. El depurador muestra los valores de las variables tal y como
estnenesemomentodelaejecucin.Cualquierdiscrepanciaentreelvaloractualyelvalor
quedeberantenersuponeunaimportanteinformacinparaelprocesodedepuracin.
9 Ejecucin paso a paso: El depurador tambin nos permite ejecutar un programa paso a
paso,esdecir,lneaporlnea.Atravsdeestaherramientapodremosseguirelprogresode
ejecucindenuestraaplicacinysupervisarsufuncionamiento.Cuandolaejecucinnoesla
esperada quiz estemos cerca de localizar un error o bug. En ocasiones, si utilizamos
mtodosprocedentesdelibrerasestndarnonecesitaremoshacerunrecorridopasoapaso
por el interior de stos mtodos, ya que es seguro que no contendrn errores internos y
podremos ahorrar tiempo no entrando en su interior paso a paso. El debugger ofrece la
posibilidaddeentraronoendichomtodos.

DEBESCONOCER
Para completar tus conocimientos sobre la depuracin de programas, te proponemos los
siguientesenlacesenlosquepodrsencontrarcmosellevanacabolastareasbsicasde
depuracinatravsdelIDENetBeans.
DepuracindeprogramasconNetBeans
La depuracin (debug) permite examinar las aplicaciones para buscar errores, ya que posibilita
observar las lneas que se van ejecutando, as como los valores que van tomando las variables en
cadapaso.
Para realizar la depuracin de un programa, se debe establecer en primer lugar un punto de
interrupcin donde debe pararse la ejecucin de la aplicacin. Esto se consigue con alguna de las
siguientesaccionessobrelalneadecdigoenlaquesedeseeestablecerelpuntodeinterrupcin:

Clicenelmargenizquierdo

Mencontextual>"Ocultar/Mostrarlneade
puntodeinterrupcin"

Pulsandolacombinacindeteclas:Ctrl+F8

Men "Depurar > Ocultar/Mostrar lnea de


puntodeinterrupcin"

37

Usodeestructurasdecontrol

DAW

Al realizar alguna de esas acciones, se marca en color rosado la lnea que se ha convertido en un
puntodeinterrupcin,ysemuestraunpequeocuadradoenelmargenizquierdo.
Una vez establecido al menos un punto de interrupcin, se debe ejecutar la aplicacin en modo
depuracin.Estosepuedellevaracabosobreelproyectooslosobreelarchivoactual:
9

Depurararchivoactual:
Mencontextual>"DebugnombreArchivo"
Men"Depurar>DebugnombreArchivo"
Pulsandolacombinacindeteclas:Ctrl+Maysculas+F5

Depurarproyecto:
Men"Depurar>DebugMainProject"
Icono"DebugMainProject"

Alllegarlaejecucindelaaplicacinalpuntode
interrupcin establecido, se destaca en color
verdelalneadecdigoenlaqueseencuentre
laejecucin.
En la parte inferior se muestra la ventana de
observacin de las variables locales, en la que
se puede comprobar el valor que va tomando
cadavariable.
A partir del momento en que se para la
ejecucindelprogramasepuedecontinuarcon
la ejecucin lnea a lnea utilizando la opcin
"Continuarejecucin":
9

PulsandolateclaF8

Men"Depurar>Continuarejecucin"

Icono"Continuarejecucin"

As se va mostrando en verde la lnea que se va


ejecutando en cada momento, y se van
actualizandoenlaventanainferiorlosvaloresque
vantomandolasvariableslocales.
Encasodequesedeseaqueelprogramacontine
la ejecucin sin ms paradas, se dispone de la
opcin"Continuar":
9
9

PulsandolateclaF5
Men"Depurar>Continuar"

Icono"Continuar"

38

DiseodeAplicacionesWeb

Tema4

39

DepuracinbsicaenNetBeans.

Usodeestructurasdecontrol

DAW

40

DiseodeAplicacionesWeb

Tema4

41

Usodeestructurasdecontrol

DAW

10

11

12

42

DiseodeAplicacionesWeb

Tema4

43

13

14

15

Usodeestructurasdecontrol

DAW

PARASABERMS
Si deseas conocer algo ms sobre depuracin de programas, pero a un nivel algo ms
avanzado,accedealsiguientevdeo.
http://www.youtube.com/watch?v=qAo9bWDzj0
ElvdeocomienzaconunadescripcingenricasobrelasfuncionesdeldepuradordelentornoIDE
NetBeans. Seguidamente se realiza una descripcin de las herramientas principales del depurador,
llevandoacaboejemplosdedepuracinutilizando:Stepinto,StepOut,StepOver,Breakpoints
(simples, condicionales, cuantificados), Watches y Call Stack. Como puede observarse se han
utilizadounaampliagamadeherramientasdeldepuradorquepuedensermuytilesparallevarel
procesodedepuracincongarantas.

44

DiseodeAplicacionesWeb

Tema4

9. Documentacin del cdigo


CASO PRCTICO
Ada est mostrando a Juan la documentacin sobre una serie de mtodos estndar que van a
necesitar para completar el desarrollo de una parte de la aplicacin. Esta documentacin tiene un
formato estructurado y puede accederse a ella a travs del navegador web.
Qu til y fcil est siendo el acceso esta documentacin! La verdad es que los que la han
generado se lo han currado bastante. Generar esta documentacin se llevar mucho tiempo, no
Ada? Pregunta Juan mientras recoge de la impresora la documentacin impresa.
Ada prepara rpidamente una clase en blanco y comienza a incorporarle una serie de comentarios:
Vers Juan, documentar el cdigo es vital y si incorporas a tu cdigo fuente unos comentarios en el
formato que te voy a mostrar, la documentacin puede ser generada automticamente a travs de la
herramienta Javadoc. Observa... Responde Ada.

Llegadosaestepunto,vamosaconsiderarunacuestindegranimportancia,ladocumentacindel
cdigofuente.
Piensaenlassiguientescuestiones:
9 Quincreesqueaccederaladocumentacindelcdigofuente?Puessernlosautoresdel
propiocdigouotrosdesarrolladores.
9 Por qu hemos de documentar nuestro cdigo? Porque facilitaremos su mantenimiento y
reutilizacin.
9 Qudebemosdocumentar?Obligatoriamente:clases,paquetes,constructores,mtodosy
atributos.
Opcionalmente:bucles,partesdealgoritmosqueestimemosoportunocomentar,
A lo largo de nuestra vida como programadores es probable que nos veamos en la necesidad de
reutilizar, modificar y mantener nuestro propio cdigo o incluso, cdigo de otros desarrolladores.
Nocreesqueseramuytilquedichocdigoestuvieraconvenientementedocumentado?Cuntas
vecesnohemosledocdigodeotrosprogramadoresyquiznohayamoscomprendidoquestaban
haciendo en tal o cual mtodo?. Como podrs comprender, la generacin de una documentacin
adecuada de nuestros programas puede suponer una inestimable ayuda para realizar ciertos
procesosenelsoftware.
SianalizamosladocumentacindelasclasesproporcionadaenlospaquetesquedistribuyeSun,nos
daremos cuenta de que dicha documentacin ha sido generada con una herramienta llamada
Javadoc. Pues bien, nosotros tambin podremos generar la documentacin de nuestro cdigo a
travsdedichaherramienta.
Sidesdeelprincipionosacostumbramosadocumentarelfuncionamientodenuestrasclasesdesde
elpropiocdigofuente,estaremosfacilitandolageneracindelafuturadocumentacindenuestras
aplicaciones. Cmo lo logramos? A travs de una serie de comentarios especiales, llamados
comentariosdedocumentacinqueserntomadosporJavadocparagenerarunaseriedearchivos
HTMLquepermitirnposteriormente,navegarpornuestradocumentacinconcualquiernavegador
web.
Loscomentariosdedocumentacintienenunamarcadecomienzo(/**)yunamarcadefin(*/).En
suinteriorpodremosencontrardospartesdiferenciadas:unapararealizarunadescripcinyotraen
laqueencontraremosmsetiquetasdedocumentacin.Veamosunejemplo:

45

Usodeestructurasdecontrol

DAW

/**
* Descripcin principal (texto/HTML)
*
* Etiquetas (texto/HTML)
*/

Este es el formato general de un comentario de documentacin. Comenzamos con la marca de


comienzoenunalnea.
Cada lnea de comentario comenzar con un asterisco. El final del comentario de documentacin
deberincorporarlamarcadefin.Lasdospartesdiferenciadasdeestecomentarioson:
9 Zona de descripcin: es aquella en la que el programador escribe un comentario sobre la
clase,atributo,constructoromtodoquesevayaacodificarbajoelcomentario.Sepuede
incluirlacantidaddetextoquesenecesite,pudiendoaadiretiquetasHTMLqueformateen
el texto escrito y as ofrecer una visualizacin mejorada al generar la documentacin
medianteJavadoc.
9 Zonadeetiquetas:enestapartesecolocarunconjuntodeetiquetasdedocumentacina
las que se asocian textos. Cada etiqueta tendr un significado especial y aparecern en
lugaresdeterminadosdeladocumentacin,unavezhayasidogenerada.
Enlasiguienteimagenpuedesobservarunejemplodeuncomentariodedocumentacin.

R.Caron.:"donotdocumentbadcoderewriteit"
REFLEXIONA
Documentar el cdigo de un programa es aadir suficiente informacin como para explicar lo que
hace,puntoporpunto,deformaquenoslolosordenadoressepanquhacer,sinoqueademslos
humanosentiendanquestnhaciendoyporqu.Documentarunprogramanoesslounactode
buenhacerdelprogramadorporaquellodedejarlaobrarematada.Esademsunanecesidadque
slo se aprecia en su debida magnitud cuando hay errores que reparar o hay que extender el
programaconnuevascapacidadesoadaptarloaunnuevoescenario.

9.1Etiquetasyposicin
Cuandohemosdeincorporardeterminadasetiquetasanuestroscomentariosdedocumentacines
necesario conocer dnde y qu etiquetas colocar, segn el tipo de cdigo que estemos
documentandoenesemomento.Existirndostiposgeneralesdeetiquetas:
1. Etiquetas de bloque: Son etiquetas que slo pueden ser incluidas en el bloque de
documentacin,despusdeladescripcinprincipalycomienzanconelsmbolo@.
2. Etiquetasentexto:Sonetiquetasquepuedenponerseencualquierpuntodeladescripcino
en cualquier punto de la documentacin asociadaa una etiqueta de bloque. Son etiquetas
definidasentrellaves,delasiguienteforma{@etiqueta}

46

DiseodeAplicacionesWeb

Tema4

Enlasiguientetablapodrsencontrarunareferenciasobrelasdiferentesetiquetasysumbitode
uso.

9.2.Usodelasetiquetas
Culessonlasetiquetastpicasysusignificado?Pasaremosseguidamenteaenumerarydescribirla
funcindelasetiquetasmshabitualesalahoradegenerarcomentariosdedocumentacin.
9 @autor texto con el nombre: Esta etiqueta slo se admite en clases e interfaces. El texto
despusdelaetiquetanonecesitarunformatoespecial.Podremosincluirtantasetiquetasde
estetipocomonecesitemos.
9 @version texto de la versin: El texto de la versin no necesitar un formato especial. Es
convenienteincluirelnmerodelaversinylafechadesta.Podremosincluirvariasetiquetas
deestetipounadetrsdeotra.
9 @deprecatedtexto:Indicaquenodeberautilizarse,indicandoeneltextolascausasdeello.Se
puede utilizar en todos los apartados de la documentacin. Si se ha realizado una sustitucin
deberaindicarsequutilizarensulugar.Porejemplo:
@deprecated El
metodoCorrecto}

mtodo

no

funciona

correctamente.

Se

recomienda

el

uso

de

{@ling

9 @exceptionnombreexcepcintexto:Estaetiquetaesequivalentea@throws.
9 @param nombreatributo texto: Esta etiqueta es aplicable a parmetros de constructores y
mtodos. Describe los parmetros del constructor o mtodo. Nombreatributo es idntico al
nombredelparmetro.Cadaetiqueta@paramirseguidadelnombredelparmetroydespus
deunadescripcindeste.Porejemplo:
@param fromIndex El ndice del primer elemento que debe ser eliminado.

9 @return texto: Esta etiqueta se puede omitir en los mtodos que devuelven void. Deber
aparecer en todos los mtodos, dejando explcito qu tipo o clase de valor devuelve y sus
posiblesrangosdevalores.Veamosunejemplo:
/**
* Chequea si un vector no contiene elementos.
*
* @return <code>verdadero</code>si solo si este vector no contiene componentes, esto es,
su tamao es cero;
* <code>falso</code> en cualquier otro caso.
*/
public boolean VectorVacio() {
return elementCount == 0;
}

9 @see referencia: Se aplica a clases, interfaces, constructores, mtodos, atributos y paquetes.


Aadeenlacesdereferenciaaotraspartesdeladocumentacin.Podremosaadiralaetiqueta:
cadenasdecaracteres,enlacesHTMLapginasyaotraszonasdelcdigo.Porejemplo:

47

Usodeestructurasdecontrol

*
a
*
*

DAW

@see "Diseo de patrones: La reusabilidad de los elementos de la programacin orientada


objetos
@see <a href="http://www.w3.org/WAI/">Web Accessibility Initiative</a>
@see String#equals(Object) equals

9 @throws nombreexcepcin texto: En nombreexcepcin tendremos que indicar el nombre


completodesta.Podremosaadirunaetiquetaporcadaexcepcinqueselanceexplcitamente
con una clusula throws, pero siguiendo el orden alfabtico. Esta etiqueta es aplicable a
constructoresymtodos,describiendolasposiblesexcepcionesdelconstructor/mtodo.

AUTOEVALUACIN
Qu etiqueta podra omitirse en un mtodo que devuelve void?
@param

@throws

@return

@returnnoseranecesariaalnodevolvernadaelmtodo.

9.3.Ordendelasetiquetas
Lasetiquetasdebendisponerseenunordendeterminado,eselsiguiente:
Ordendelasetiquetasencomentariosdedocumentacin
etiqueta
Descripcin
En clases e interfaces. Se pueden poner varios. Es mejor ponerlas en orden
@autor
cronolgico.
@version
Enclaseseinterfaces.
En mtodos y constructores. Se colocarn tantos como parmetros tenga el
@param
constructoromtodo.Mejorenelmismoordenenelqueseencuentrendeclarados.
@return
Enmtodos.
Enconstructoresymtodos.Mejorenelmismoordenenelquesehandeclarado,o
@exception
enordenalfabtico.
@throws
Esequivalentea@exception.
Podemos poner varios. Comenzaremos por los ms generales y despus los ms
@see
especficos.
@deprecated

PARASABERMS
SiquieresconocercmoobteneratravsdeJavadocladocumentacindetusaplicaciones,
observaelsiguientecdigo:
/*
* ejemplojavadoc.java
*
* Created on July 5, 2003, 4:24 AM
*/
/**
* Clase que comienza la estructura de escepciones
* @author Roberto Canales
* @since 1.0
* @see Visitar www.adictosaltrabajo.com
*/
class RCException extends Exception
{
void depura(String psError)
{
System.out.println("Error: " + psError);
}

48

DiseodeAplicacionesWeb

Tema4

RCException(String psError)
{
super(psError);
depura(psError);
}
}
/**
*
* @author Roberto Canales
* @since 1.0
* @see Visitar www.adictosaltrabajo.com
*/
public class ejemplojavadoc {
/** Constantes publicas
public static final int
public static final int
public static final int

de gestion errores*/
ERROR
= 0;
LOG
= 1;
INFO
= 2;

/** Constructor por defecto */


public ejemplojavadoc() {
}
void depura(String sError)
{
System.out.println("ejemplojavadoc: " + sError);
}

/**
* @param args Array de argumentos
*/
public static void main(String[] args) {
/** Construimos un objeto no esttico */
ejemplojavadoc objetoAuxiliar = new ejemplojavadoc();
try
{
objetoAuxiliar.ejecuta();
}
catch(RCException e)
{
objetoAuxiliar.depura("Excepcion = " + e.getMessage());
}
}
/**
* Punto de entrada a la aplicacin
* @exception RCException Se genera una excepcin genrica.
* @return true
*/
public boolean ejecuta() throws RCException
{
/** Retornamos true por defecto */
int error = 0;
if(error == 0)
{
throw new RCException("Invocamos excepciones");
}
return true;
}
}

DocumentacindeclasesconJavadoc
Con el fin de facilitar la compresin de uso de una clase y sus mtodos, stos deben estar
debidamente documentados informando de su funcionamiento, de los parmetros que se deben
utilizarydelosresultadosqueseobtienen.

49

Usodeestructurasdecontrol

DAW

Para facilitar esta tarea, Java dispone de la herramienta javadoc, que genera una documentacin
estandarizadaobtenindoseenformatoweb,semejantealaAPIoficialdeJava.
Sedebeseguirunmodeloconcretoparaquesegenereladocumentacindeformacorrecta:
9

Todosloscomentariosdebencomenzarpor/**yterminarcon*/

Sedebedocumentarlaclaseycadamtodo,escribiendouncomentariodelantedecadaunode
ellos.

DentrodelcomentariosepuedenutilizaretiquetasHTML.

Elcomentariocomenzarconunadescripcingeneraldelobjetivodelaclaseydelosmtodos.

Despussepuedenindicarunaseriedevaloresutilizandounasetiquetaspredefinidas,siendo
lasmsimportanteslassiguientes:
@author:Paraindicarelnombredelautordelaclaseomtodo.
@version:Permiteespecificarlaversindelaclaseomtodo.
@param:Descripcindecadaparmetrodelmtodo.
@return:Descripcindelvalorqueretornaelmtodo.
@throws:Excepcinquepuedelanzarelmtodo.

01./**
02.* Aqu se debe escribir una descripcin general del funcionamiento de la clase
03.*
04.* @author nombre del autor
05.* @version 1.0
06.*/
07.public class ClaseEjemploJavadoc {
08.
09./** atributo1 sirve para lo que sea */
10.public String atributo1;
11.private int atributo2;
12.
13./**
14.* Descripcin del mtodo constructor
15.*
16.* @param atributo1 Descripcin del primer parmetro
17.* @param atributo2 Descripcin del segundo parmetro
18.*/
19.ClaseEjemploJavadoc(String atributo1, int atributo2) {
20.this.atributo1 = atributo1;
21.this.atributo2 = atributo2;
22.}
23.
24./**
25.* Descripcin del mtodo mtodo1
26.*
27.* @param parmetro3 Descripcin del valor que debe pasarse como parmetro
28.* @return Descripcin del valor que retorna el mtodo al ser llamado
29.*/
30.public int mtodo1(int parmetro) {
31.return 1;
32.}
33.}

ElentornoNetBeansproporcionaunaformasencilladegenerarladocumentacinenformatoHTML
atravsdejavadoc.ParaellosepuedeutilizarelmenEjecutar>GenerarJavadoc,odesdeelmen
contextualdelproyecto.

50

DiseodeAplicacionesWeb

Tema4

Al generar la documentacin se abre la pgina web que la


contiene,quetendrelsiguienteestilo:

Para comprobar si se ha incluido toda la informacin


necesaria o para facilitar la inclusin de los comentarios,
NetBeans ofrece la herramienta Analizador Javadoc:
Herramientas > Analizar Javadoc, que abre una ventana
informando de la informacin que falta y la posibilidad de
solucionarlosproblemasencontrados.

51

TEMA5

INDICE

1.Conceptodeclase...............................................................................................................................4
1.1Repasodelconceptodeobjeto.....................................................................................................................4
1.2Elconceptodeclase......................................................................................................................................5
2.Estructuraymiembrosdeunaclase...................................................................................................7
2.1Declaracindeunaclase...............................................................................................................................8
2.2Cabeceradeunaclase...................................................................................................................................9
2.3Cuerpodeunaclase....................................................................................................................................10
2.4Miembrosestticosodeclase....................................................................................................................11
3.Atributos............................................................................................................................................12
3.1Declaracindeatributos.............................................................................................................................13
3.2Modificadoresdeacceso............................................................................................................................14
3.3Modificadoresdecontenido.......................................................................................................................15
3.4Atributosestticos......................................................................................................................................16
4.Mtodos............................................................................................................................................18
4.1Declaracindeunmtodo..........................................................................................................................18
4.2Cabecerademtodo...................................................................................................................................19
4.3Modificadoresenladeclaracindeunmtodo.........................................................................................20
4.4Parmetrosenunmtodo..........................................................................................................................22
4.5Cuerpodeunmtodo.................................................................................................................................23
4.6Sobrecargademtodos..............................................................................................................................25
4.7Sobrecargadeoperadores..........................................................................................................................27
4.8Lareferenciathis.........................................................................................................................................27
4.9Mtodosestticos.......................................................................................................................................28
5.Encapsulacin,controldeaccesoyvisibilidad..................................................................................30
5.1Ocultacindeatributos.Mtodosdeacceso.............................................................................................31
5.2Ocultacindemtodos...............................................................................................................................32
6.Utilizacindelosmtodosyatributosdeunaclase.........................................................................35
6.1Declaracindeunobjeto............................................................................................................................35
6.2Creacindeunobjeto.................................................................................................................................36
6.3Manipulacindeunobjeto:utilizacindemtodosyatributos....................................................37
7.Constructores....................................................................................................................................41
7.1Conceptodeconstructor............................................................................................................................41
7.2Creacindeconstructores..........................................................................................................................42
7.3Utilizacindeconstructores........................................................................................................................43
7.4Constructoresdecopia...............................................................................................................................47
EJERCICIORESUELTO.........................................................................................................................................48
7.5Destruccindeobjetos...............................................................................................................................48
8.Introduccinalaherencia.................................................................................................................50
8.1Creacinyutilizacindeclasesheredadas.................................................................................................51
9.Empaquetadodeclases.....................................................................................................................53
9.1Jerarquadepaquetes.................................................................................................................................53
9.2Utilizacindelospaquetes.........................................................................................................................54
9.3Inclusindeunaclaseenunpaquete.........................................................................................................55
9.4Procesodecreacindeunpaquete............................................................................................................56

[PROGRAMACIN]

ProgramacindelcursodeDesarrollodeAplicacionesWeb
JosLuisComesaaCurso2011/2012

Desarrollodeclases

DAW

DesarrollodeAplicacionesWeb

Tema5

DESARROLLODECLASES
CASO PRCTICO
Tras su primer contacto con la Programacin Orientada a Objetos, Mara est muchoms
convencida de los beneficios que se pueden obtener utilizando este tipo de metodologa.
Las explicaciones de Juan y su breve experiencia con los objetos le hacen ahora ver elmundo de la
programacin desde otro punto de vista. Este nuevo mtodo de trabajo les va apermitir distribuir las
tareas de desarrollo de una manera ms eficiente y poder adaptarse acambios, correcciones y
mejoras con mucho menos esfuerzo a la hora de modificar cdigo.
Mara est convencida de que es el momento de empezar a escribir el cdigo de sus propias clases
para, acontinuacin, pasarlas a otros compaeros que las puedan usarlas. Una vez que otras
personas reciban esasclases, podrn desentenderse de cmo estn hechas por dentro (principios de
encapsulamiento y ocultacin deinformacin) y limitarse nicamente a utilizarlas a travs de sus
mtodos.
Para llevar a cabo esta labor Juan va a proseguir con las explicaciones con las que empez cuando
comenzarona trabajar con objetos e introdujo el concepto de clase:
Ha llegado el momento de empezar a desarrollar nuestras propias clases , le dice Juan.
Genial, vamos a comenzar a desarrollar la primera biblioteca de clases para BK Programacin,
no es as?
Bueno, sa es la idea. A ver si tenemos nuestro primer paquete de clases, que podramos
llamarcom.bkprogramacion.
Pues venga vamos all!

Desarrollodeclases

DAW

1.Conceptodeclase
CASO PRCTICO.
El equipo de trabajo que han formado Mara y Juan parece funcionar bastante bien. Elproyecto que
tienen entre manos para la aplicacin informtica de la clnica veterinariaempieza a tomar forma
respecto a los requisitos que el cliente necesita. Es el momento de queempiecen a pensar en los
distintos objetos con los que pueden modelar la informacin cuyotratamiento desean automatizar.
Muchos de estos objetos no van a ser proporcionados por lasbibliotecas de Java, de manera que
habr que fabricarlos, es decir, van a tener que disear eimplementar las clases (los moldes o
plantillas) que les permitirn crear los objetos quevan a necesitar. Ha llegado el momento de
enfrentarse al concepto de clase.

Comoyahasvistoenanterioresunidades,lasclasesestncompuestasporatributosymtodos.Una
claseespecificalascaractersticascomunesdeunconjuntodeobjetos.
Deestaformalosprogramasqueescribasestarnformadosporunconjuntodeclasesapartirdelas
cualesirscreandoobjetosqueseinterrelacionarnunosconotros.
Enestaunidadsevaautilizarelconceptodeobjetoascomoalgunasdelasdiversasestructuras
decontrolbsicasqueofrececualquierlenguajedeprogramacin.Todosesosconceptoshansido
explicados y utilizadosen las unidades anteriores. Si consideras que es necesario hacer un repaso
del concepto de objeto o del uso de lasestructuras de control elementales, ste es el momento de
hacerlo.

1.1Repasodelconceptodeobjeto
Desdeelcomienzodelmdulollevasutilizandoelconceptodeobjetoparadesarrollartusprogramas
deejemplo. En las unidades anteriores se ha descrito un objeto como una entidad que contiene
informacin y quees capaz de realizar ciertas operaciones con esa informacin. Segn los valores
que tenga esa informacin elobjeto tendr un estado determinado y segn las operaciones que
puedallevaracaboconesosdatossernresponsablesdeuncomportamientoconcreto.
Recuerda que entre las caractersticas fundamentales de un objeto se encontraban la identidad
(losobjetossonnicosyportantodistinguiblesentres,aunquepuedahaberobjetosexactamenteiguales),unestado
(los atributos que describen al objeto y los valores que tienen en cada momento) y un determinado
comportamiento(accionesquesepuedenrealizarsobreelobjeto).

Algunosejemplosdeobjetosquepodramosimaginarpodranser:
9 Uncochedecolorrojo,marcaSEAT,modeloToledo,delao2003.Enesteejemplotenemos
unaseriedeatributos,comoelcolor(enestecasorojo),lamarca,elmodelo,elao,etc.As
mismo tambin podramos imaginar determinadas caractersticas como la cantidad de
combustiblequelequeda,oelnmerodekilmetrosrecorridoshastaelmomento.
9 Uncochedecoloramarillo,marcaOpel,modeloAstra,delao2002.
9 Otrocochedecoloramarillo,marcaOpel,modeloAstraytambindelao2002.Setratara
deotroobjetoconlasmismaspropiedadesqueelanterior,peroseraunsegundoobjeto.
9 Uncocodrilodecuatrometrosdelongitudydeveinteaosdeedad.
9 Un crculo de radio 2 centmetros, con centro en las coordenadas (0,0) y relleno de color
amarillo.
9 Un crculo de radio 3 centmetros, con centro en las coordenadas (1,2) y relleno de color
verde.

DesarrollodeAplicacionesWeb

Tema5

Siobservaslosejemplosanteriorespodrsdistinguirsindemasiadadificultadalmenostresfamilias
deobjetosdiferentes,quenotienennadaqueverunaconotra:
9 Loscoches.
9 Loscrculos.
9 Loscocodrilos.
Es de suponer entonces que cada objeto tendr determinadas posibilidades de comportamiento
(acciones)dependiendo de la familia a la que pertenezcan. Por ejemplo, en el caso de los coches
podramosimaginaraccionescomo:arrancar,frenar,acelerar,cambiardemarcha,etc.Enelcasode
loscocodrilospodrasimaginarotrasaccionescomo:desplazarse,comer,dormir,cazar,etc.Parael
casodelcrculosepodranplantearaccionescomo:clculodelasuperficiedelcrculo,clculodela
longituddelacircunferenciaquelorodea,etc.
Por otro lado, tambin podras imaginar algunos atributos cuyos valores podran ir cambiando en
funcin de lasacciones que se realizaran sobre el objeto: ubicacin del coche (coordenadas),
velocidad instantnea, kilmetrosrecorridos, velocidad media, cantidad de combustible en el
depsito, etc. En el caso de los cocodrilos podrasimaginar otros atributos como: peso actual, el
nmerodedientesactuales(irperdiendoalgunosalolargodesuvida),elnmerodepresasqueha
cazadohastaelmomento,etc.
Comopuedesver,unobjetopuedesercualquiercosaquepuedasdescribirentrminosde
atributosyacciones.
Unobjetonoesmsquelarepresentacindecualquierentidadconcretaoabstractaquepuedas
percibir oimaginar y que pueda resultar de utilidad para modelar los elementos el entorno del
problemaquedeseasresolver.

Autoevaluacin
Tenemos un objeto bombilla, de marca ACME, que se puede encender o apagar, que
tiene una potencia de 50vatios y ha costado 3 euros. La bombilla se encuentra en este
momento apagada. A partir de esta informacin,sabras decir qu atributos y qu
acciones (comportamiento) podramos relacionar con ese objeto bombilla?
Objeto bombilla con atributos potencia (50 vatios), precio (3 euros), marca
(ACME) y estado (apagada).Las acciones que se podran ejercer sobre el objeto
seran encender y apagar.
Objeto bombilla con atributos precio (3 euros), marca (ACME) y apagado. Las
acciones que se podranejercer sobre el objeto seran encender y apagar.
Objeto bombilla con atributos precio (3 euros), marca (ACME), potencia (50
vatios) y estado (apagada).No se puede ejercer ninguna accin sobre el objeto.
Se trata de un objeto bombilla cuyas posibles acciones son encender, apagar y
arreglar. Sus atributos seran los mismos que en el primer caso

1.2Elconceptodeclase
Estclaroquedentrodeunmismoprogramatendrslaoportunidaddeencontrardecenas,cientoso
incluso miles de objetos. En algunos casos no se parecern en nada unos a otros,pero tambin
podrs observar que habr muchos que tengan un gran parecido,compartiendo un mismo
comportamiento y unos mismos atributos. Habr muchos objetosque slo se diferenciaran por los
valoresquetomanalgunosdeesosatributos.

Desarrollodeclases

DAW

Esaqudondeentraenescenaelconceptodeclase.Estclaroquenopodemosdefinirlaestructuray
el comportamiento de cada objeto cada vez que va a ser utilizado dentro de unprograma, pues la
escritura del cdigo sera una tarea interminable y redundante. La ideaes poder disponer de una
plantillaomodeloparacadaconjuntodeobjetosqueseandelmismotipo,esdecir,quetenganlos
mismosatributosyuncomportamientosimilar.

DESTACADO.
Una clase consiste en la definicin de un tipo de objeto. Se trata de una descripcin detallada de
cmo van a serlos objetos que pertenezcan a esa clase indicando qu tipo de informacin
contendrn(atributos)ycmosepodrinteractuarconellos(comportamiento).
Comoyahasvistoenunidadesanteriores,unaclaseconsisteenunplantillaenlaqueseespecifican:
9 Los atributos que van a ser comunes a todos los objetos que pertenezcan a esa clase
(informacin).
9 Losmtodosquepermiteninteractuarconesosobjetos(comportamiento).
A partir de este momento podrs hablar ya sin confusin de objetos y de clases,sabiendo que los
primerossoninstanciasconcretasdelassegundas,quenosonmsqueunaabstraccinodefinicin.
Sinosvolvemosafijarenlosejemplosdeobjetosdelapartadoanteriorpodramosobservarquelas
clasesseranloqueclasificamoscomofamiliasdeobjetos(coches,cocodrilosycrculos).
En el lenguaje cotidiano de muchos programadores puede ser habitual la confusin entre los
trminos clase yobjeto. Aunque normalmente el contexto nos permite distinguir si nos estamos
refiriendorealmenteaunaclase(definicin abstracta)oaunobjeto(instancia concreta),hayquetener
cuidadoconsuusoparanodarlugarainterpretacioneserrneas,especialmenteduranteelproceso
deaprendizaje.

AUTOEVALUACIN.
Un objeto y una clase en realidad hacen referencia al mismo concepto. Podra decirse
que son sinnimos.
Verdadero
Falso

DesarrollodeAplicacionesWeb

Tema5

2.Estructuraymiembrosdeunaclase
CASO PRCTICO
Mara empieza a tener bastante ms claro en qu consiste una clase y cul es ladiferencia respecto a
un objeto. Es el momento de empezar a crear en Java algunasde las clases que han estado
pensando que podran ser tiles para su aplicacin. Paraello es necesario saber cmo se declara una
clase en un lenguaje de programacindeterminado. Los becarios Ana y Carlos intuyen que van a
comenzar a ver cmoest hecha una clase por dentro. Parece ser que es el momento de empezar a
tomar notas:
De acuerdo, ya hemos diseado algunas de las clases que queremos para nuestra aplicacin.
Pero, cmoescribimos eso en Java? Cmo declaramos o definimos una clase en Java? Qu
palabras reservadas hay queutilizar? Qu partes tiene esa definicin? pregunta Mara con
inters.
Bien, es el momento de ver cmo es la estructura de una clase y cmo podemos escribirla en Java
para luegopoder fabricar objetos que pertenezcan a esa clase. Le responde Juan.

Comoyahasvistoenanterioresunidades,lasclasesestncompuestasporatributosymtodos.Una
claseespecificalascaractersticascomunesdeunconjuntodeobjetos.Deestaformalosprogramas
queescribasestarnformadosporunconjuntodeclasesapartirdelascualesirscreandoobjetos
queseinterrelacionarnunosconotros.
Enestaunidadsevaautilizarelconceptodeobjetoascomoalgunasdelasdiversasestructuras
decontrolbsicasqueofrececualquierlenguajedeprogramacin.Todosesosconceptoshansido
explicados y utilizadosen las unidades anteriores. Si consideras que es necesario hacer un repaso
del concepto de objeto o del uso de lasestructuras de control elementales, ste es el momento de
hacerlo.

EnunidadesanterioresyaseindicqueparadeclararunaclaseenJavaseusalapalabrareservada
class.Enladeclaracindeunaclasevasaencontrar:
9 Cabeceradelaclase.Compuestaporunaseriedemodificadoresdeacceso,lapalabrareservada
classyelnombredelaclase.
9 Cuerpodelaclase.Enlseespecificanlosdistintosmiembrosdelaclase:atributosymtodos.
Esdecir,elcontenidodelaclase.

Comopuedesobservar,elcuerpodelaclaseesdondese
declaranlosatributosquecaracterizanalosobjetosdela
clase y donde se define e implementa el
comportamiento de dichos objetos; es decir, donde se
declaraneimplementanlosmtodos.

AUTOEVALUACIN.
Toda definicin de una clase consta de cabecera y cuerpo. En la cabecera se definen los
atributos de los objetosque se crearn a partir de esa clase y en el cuerpo estarn
definidos los distintos mtodos disponibles paramanipular esos objetos.
Verdadero

Falso

Desarrollodeclases

DAW

2.1Declaracindeunaclase.
LadeclaracindeunaclaseenJavatienelasiguienteestructurageneral:
[modificadores] class <NombreClase> [herencia] [interfaces] { // Cabecera de la clase
// Cuerpo de la clase
Declaracin de los atributos
Declaracin de los mtodos
}

Unejemplobsicoperocompletopodraser:
/**
*
* Ejemplo de clase Punto
*/
class Punto {
// Atributos
int x,y;
// Mtodos
int obtenerX () { return x; }
int obtenerY() {return y;}
void establecerX (int vx) { x= vx; };
void establecerY (int vy) { y= vy; };
}

Enestecasosetratadeunaclasemuysencillaenlaqueelcuerpodelaclase(elreaentrelasllaves)
contieneelcdigoylasdeclaracionesnecesariasparaquelosobjetosqueseconstruyan(basndose
en esta clase) puedanfuncionar apropiadamente en un programa (declaraciones de atributos para
contener el estado del objeto ymtodos que implementen el comportamiento de la clase y los
objetoscreadosapartirdeella).
Si te fijas en los distintos programas que se han desarrollado en los ejemplos de las unidades
anteriores, podrsobservar que cada uno de esos programas era en s mismo una clase Java: se
declarabanconlapalabrareservadaclassycontenanalgunosatributos(variables)ascomoalgunos
mtodos(comomnimoelmtodomain).
Enelejemploanteriorhemosvistolomnimoquesetienequeindicarenlacabeceradeunaclase(el
nombrede la clase y la palabra reservada class). Se puede proporcionar bastante ms informacin
mediantemodificadoresyotrosindicadorescomoporejemploelnombredesusuperclase(siesque
esa clase hereda deotra), si implementa algn interfaz y algunas cosas ms que irs aprendiendo
pocoapoco.
A la hora de implementar una clase Java (escribirla en un archivo con un editor de textos o con
algunaherramientaintegradacomoporejemploNetbeansoEclipse)debestenerencuenta:
9 Porconvenio,sehadecididoqueenlenguajeJavalosnombresdelasclasesdebendeempezar
por una letra mayscula. As, cada vez que observes en el cdigo una palabra con la primera
letra en mayscula sabrs que se trata de una clase sin necesidad de tener que buscar su
declaracin.Adems,sielnombredelaclaseestformadoporvariaspalabras,cadaunade
ellas tambin tendr su primera letra en mayscula. Siguiendo esta recomendacin, algunos
ejemplos de nombres de clases podran ser: Recta, Circulo, Coche, CocheDeportivo, Jugador,
JugadorFutbol,AnimalMarino,AnimalAcuatico,etc.

DesarrollodeAplicacionesWeb

Tema5

9 ElarchivoenelqueseencuentraunaclaseJavadebetenerelmismonombrequeesaclasesi
queremos poder utilizarla desde otras clases que se encuentren fuera de ese archivo (clase
principaldelarchivo).
9 Tantoladefinicincomolaimplementacindeunaclaseseincluyeenelmismoarchivo(archivo
.java). En otros lenguajes como por ejemplo C++, definicin e implementacin podran ir en
archivosseparados(porejemploenC++,seransendosarchivosconextensiones.hy.cpp).

PARASABERMS.
Siquieresampliarunpocomssobreestetemapuedesecharunvistazoalostutorialesde
iniciacindeJavaenelsitiowebdeOracle(eningls):
http://download.oracle.com/javase/tutorial/java/javaOO/classes.html

2.2Cabeceradeunaclase.
Engeneral,ladeclaracindeunaclasepuedeincluirlossiguienteselementosyenelsiguienteorden:
1. Modificadorestalescomopublic,abstractofinal.
2. Elnombredelaclase(conlaprimeraletradecadapalabraenmaysculas,porconvenio).
3. El nombre de su clase padre (superclase), si es que se especifica, precedido por la palabra
reservadaextends(extiendeoheredade).
4. Unalistaseparadaporcomasdeinterfacesquesonimplementadasporlaclase,precedidapor
lapalabrareservadaimplements(implementa).
5. Elcuerpodelaclase,encerradoentrellaves{}.
Lasintaxiscompletadeunacabecera(loscuatroprimerospuntos)quedadelaforma:
[modificadores]
class
<NombreClase>
<NombreInterface1>]
[[implements<NombreInterface2>] ] {

[extends

<NombreSuperClase>][implements

EnelejemploanteriordelaclasePuntotenamoslasiguientecabecera:
class Punto {

Enestecasonohaymodificadores,niindicadoresdeherencia,niimplementacindeinterfaces.Tan
sololapalabrareservadaclassyelnombredelaclase.Eslomnimoquepuedehaberenlacabecera
deunaclase.
Laherenciaylasinterfaceslasversmsadelante.Vamosaverahoraculessonlosmodificadores
quesepuedenindicaralcrearlaclaseyquefectostienen.Losmodificadoresdeclaseson:
[public] [final | abstract]

Veamosqusignificadotienecadaunodeellos:
9 Modificador public.Indicaquelaclaseesvisible(sepuedencrearobjetosdeesaclase)desde
cualquierotraclase.Esdecir,desdecualquierotrapartedelprograma.Sinoseespecificaeste
modificador, la clase slo podr ser utilizada desde clases que estn en el mismo paquete. El
concepto de paquete lo veremos ms adelante. Slo puede haber una clase public (clase
principal)enunarchivo.java.Elrestodeclasesquesedefinanenesearchivonosernpblicas.
9 Modificadorabstract.Indicaquelaclaseesabstracta.Unaclaseabstractanoesinstanciable.Es
decir,noesposiblecrearobjetosdeesaclase(habrqueutilizarclasesqueheredendeella).En
este momento es posible que te parezca que no tenga sentido que esto pueda suceder (si no

Desarrollodeclases

DAW

puedescrearobjetosdeesaclase,paraqulaquieres?),peropuederesultartilalahorade
crear una jerarqua de clases. Esto lo vers tambin ms adelante al estudiar el concepto de
herencia.
9 Modificador final. Indica que no podrs crear clases que hereden de ella. Tambin volvers a
este modificador cuando estudies el concepto de herencia. Los modificadores final y abstract
sonexcluyentes(slosepuedeutilizarunodeellos).
Todos estos modificadores y palabras reservadas las iremos viendo poco a poco, as que no te
preocupesdemasiadoporintentarentendertodasellasenestemomento.
EnelejemploanteriordelaclasePuntotendramosunaclasequeseraslovisible(utilizable)desde
elmismopaqueteenelqueseencuentralaclase(modificadordeaccesoporomisinodepaquete,o
package). Desdefuera de ese paquete no sera visible o accesible. Para poder utilizarla desde
cualquierpartedelcdigodelprogramabastaraconaadirelatributopublic:publicclassPunto.

AUTOEVALUACIN.
Si queremos poder instanciar objetos de una clase X desde cualquier parte de un
programa, qu modificador omodificadores habr que utilizar en su declaracin?
private
public
abstract
Ninguno de los anteriores

2.3Cuerpodeunaclase.
Como ya has visto anteriormente, el cuerpo de una clase se encuentra encerrado entrellaves y
contieneladeclaracineimplementacindesusmiembros.Losmiembrosdeunaclasepuedenser:
9 Atributos,queespecificanlosdatosquepodrcontenerunobjetodelaclase.
9 Mtodos,queimplementanlasaccionesquesepodrnrealizarconunobjetodelaclase.
Una clase puede no contener en su declaracin atributos o mtodos, pero debe de contener al
menosunodelosdos(laclasenopuedeservaca).
EnelejemploanteriordondesedefinaunaclasePunto,tendramoslossiguientesatributos:
9 Atributox,detipoint.
9 Atributoy,detipoint.
Esdecir,dosvaloresdetipoentero.CualquierobjetodelaclasePuntoqueseacreadoalmacenar
ensuinteriordosnmerosenteros(xey).CadaobjetodiferentedelaclasePuntocontendrsendos
valoresxey,quepodrncoincidironoconelcontenidodeotrosobjetosdeesamismaclasePunto.
Porejemplo,sisehandeclaradovariosobjetosdetipoPunto:
Punto p1, p2, p3;

Sabremosquecadaunodeesosobjetosp1,p2yp3contendrnunpardecoordenadas(x,y)que
definen elestadodeeseobjeto.Puede queesosvalorescoincidanconlosdeotrosobjetosdetipo

10

DesarrollodeAplicacionesWeb

Tema5

Punto,opuedequeno,peroencualquiercasosernobjetosdiferentescreadosapartirdelmismo
molde(delamismaclase).
Porotrolado,laclasePuntotambindefinaunaseriedemtodos:
9
9
9
9

intobtenerX(){returnx;}
intobtenerY(){returny;}
voidestablecerX(intvx){x=vx;};
voidestablecerY(intvy){y=vy;};

Cada uno de esos mtodos puede ser llamado desde cualquier objeto que sea una instancia de la
clasePunto.Setratadeoperacionesquepermitenmanipularlosdatos(atributos)contenidosenel
objetobienparacalcularotrosdatosobienparamodificarlospropiosatributos.

AUTOEVALUACIN.
Si disponemos de varios objetos que han sido creados a partir de la misma definicin de
clase, en realidadtendremos un nico objeto, pues hacen referencia a un mismo tipo de
clase (plantilla).
Verdadero

Falso

2.4Miembrosestticosodeclase.
Cada vez que se produce una instancia de una clase (es decir, se crea un objeto de esa clase), se
desencadenanuna serie de procesos (construccin del objeto) que dan lugar a la creacin en
memoriadeunespaciofsicoqueconstituirelobjetocreado.Deestamaneracadaobjetotendrsus
propiosmiembrosaimagenysemejanzadelaplantillapropuestaporlaclase.
Por otro lado, podrs encontrarte con ocasiones en las que determinados miembrosde la clase
(atributos o mtodos) no tienen demasiado sentido como partes del objeto,sino ms bien como
partesdelaclaseens(partesdelaplantilla,peronodecadainstanciadeesaplantilla).Porejemplo,
si creamos una clase Coche y quisiramosdisponer de un atributo con el nombre de la clase (un
atributo de tipo String con lacadena Coche), no tiene mucho sentido replicar ese atributo para
todos los objetosde la clase Coche, pues para todos va a tener siempre el mismo valor (la
cadenaCoche).Esms,eseatributopuedetenersentidoyexistenciaalmargendelaexistenciade
cualquier objeto detipo Coche. Podra no haberse creado ningn objeto de la clase Coche y sin
embargoseguirateniendosentidopoderaccederaeseatributodenombredelaclase,puessetrata
en efecto de un atributo de la propia clase msque de un atributo de cada objeto instancia de la
clase.
ParapoderdefinirmiembrosestticosenJavaseutilizaelmodificadorstatic.Losmiembros(tanto
atributoscomo mtodos) declarados utilizando este modificador son conocidos como miembros
estticosomiembrosdeclase.Acontinuacinvasaestudiarlacreacinyutilizacindeatributosy
mtodos.Encadacasoverscmodeclararyusaratributosestticosymtodosestticos.

11

Desarrollodeclases

DAW

3.Atributos
CASO PRCTICO.
Mara est entusiasmada con las posibilidades que le ofrece el concepto de clase para podercrear
cualquier tipo de objeto que a ella se le ocurra. Ya ha aprendido cmo declarar lacabecera de una
clase en Java y ha estado probando con algunos de los ejemplos que le haproporcionado Juan.
Entiende ms o menos cmo funcionan algunos de los modificadores dela clase, pero ha visto que el
cuerpo es algo ms complejo: ya no se trata de una simple lneade cdigo como en el caso de la
cabecera. Ahora tiene un conjunto de lneas de cdigo queparecen hasta cierto punto un programa en
pequeo. Puede encontrarse con declaraciones devariables, estructuras de control, realizacin de
clculos, etc.
Lo primero que Mara ha observado es que al principio suele haber algunas declaraciones de
variables:
Estas declaraciones de variables son lo que hemos llamado atributos? le pregunta a Juan.
As es contesta Ada, que en ese momento acaba de entrar por la puerta con Ana y con Carlos.
Ahora que estis todos juntos, creo que ha llegado el momento que os explique algunas cosas
acerca delos miembros de una clase. Vamos a empezar por los atributos.

Losatributosconstituyenlaestructurainternadelosobjetosdeunaclase.Setratadelconjuntode
datosquelosobjetosdeunadeterminadaclasealmacenancuandosoncreados.Esdecirescomosi
fueran variables cuyombito de existencia es el objeto dentro del cual han sido creadas. Fuera del
objetoesasvariablesnotienensentidoysielobjetodejadeexistir,esasvariablestambindeberan
hacerlo (proceso de destruccin del objeto).Los atributos a veces tambin son conocidos con el
nombredevariablesmiembroovariablesdeobjeto.
Los atributos pueden ser de cualquier tipo de los que
pueda ser cualquier otra variable en un programa en
Java:desde tipos elementales como int, boolean o float
hastatiposreferenciadoscomoarrays,Stringsuobjetos.
Adems del tipo y del nombre, la declaracin de un
atributo
puede
contener
tambin
algunos
modificadores(como por ejemplo public, private,
protected o static). Por ejemplo, en el caso de la clase
Punto que habamosdefinido en el aparado anterior
podrashaberdeclaradosusatributoscomo:
public int x;
public int y;

De esta manera estaras indicando que ambos atributos son pblicos, es decir, accesibles por
cualquierpartedelcdigoprogramaquetengaaccesoaunobjetodeesaclase.
Comoyaversmsadelantealestudiarelconceptodeencapsulacin,lonormalesdeclarartodos
losatributos(oalmenoslamayora)comoprivados(private) demaneraquesisedeseaaccedero
manipularalgnatributosetengaquehaceratravsdelosmtodosproporcionadosporlaclase.

AUTOEVALUACIN.
Dado que normalmente se pretende encapsular el contenido de un objeto en su interior y
permitir el acceso a susatributos nicamente a travs de los mtodos, los atributos de
una clase suelen declararse con el modificadorpublic.
Verdadero
Falso

12

DesarrollodeAplicacionesWeb

Tema5

3.1Declaracindeatributos.
Lasintaxisgeneralparaladeclaracindeunatributoenelinteriordeunaclasees:
[modificadores] <tipo><nombreAtributo>;

Ejemplos:
int x;
public int elementoX, elementoY;
private int x, y, z;
static double descuentoGeneral;
final bool casado;

Tesuenabastante,verdad?Ladeclaracindelosatributosenunaclaseesexactamenteigualala
declaracinde cualquier variable tal y como has estudiado en las unidades anteriores y similar a
como se hace en cualquierlenguaje de programacin. Es decir mediante la indicacin del tipo y a
continuacinelnombredelatributo,pudindosedeclararvariosatributosdelmismotipomediante
una lista de nombres de atributos separada porcomas (exactamente como ya has estudiado al
declararvariables).
Ladeclaracindeunatributo(ovariablemiembroovariabledeobjeto)consisteenladeclaracin
deunavariablequenicamenteexisteenelinteriordelobjetoyportantosuvidacomenzarcuando
elobjetocomienceaexistir(elobjetoseacreado).Estosignificaquecadavezquesecreeunobjeto
secrearntantasvariablescomoatributoscontengaeseobjetoensuinterior(definidasenlaclase,
queeslaplantillaomoldedelobjeto).Todasesasvariablesestarnencapsuladasdentrodelobjeto
yslotendrnsentidodentrodel.
EnelejemploqueestamosutilizandodeobjetosdetipoPunto(instanciasdelaclasePunto),cada
vez que secree un nuevo Punto p1, se crearn sendos atributos x, y de tipo int que estarn en el
interiordeesepuntop1.
SiacontinuacinsecreaunnuevoobjetoPuntop2,secrearnotrosdosnuevosatributosx,yde
tipointqueestarnestavezalojadosenelinteriordep2.Yassucesivamente
Dentrodeladeclaracindeunatributopuedesencontrartrespartes:
9 Modificadores. Son palabras reservadas que permiten modificar la utilizacin del atributo
(indicarelcontroldeacceso,sielatributoesconstante,sisetratadeunatributodeclase,etc.).
Losiremosviendounoauno.
9 Tipo.Indicaeltipodelatributo.Puedetratarsedeuntipoprimitivo(int,char,bool,double)o
biendeunoreferenciado(objeto,array,etc.).
9 Nombre. Identificador nico para el nombre del atributo. Por convenio se suelen utilizar las
minsculas.Encasodequesetratedeunidentificadorquecontengavariaspalabras,apartir
de la segunda palabra se suele poner la letra de cada palabra en maysculas. Por ejemplo:
primerValor, valor, puertaIzquierda, cuartoTrasero, equipoVecendor, sumaTotal,
nombreCandidatoFinal,etc.CualquieridentificadorvlidodeJavaseradmitidocomonombre
deatributovlido,peroesimportanteseguiresteconvenioparafacilitarlalegibilidaddelcdigo
(todoslosprogramadoresdeJavaloutilizan).
Como puedes observar, los atributos de una clase tambin pueden contener modificadores en su
declaracin(como suceda al declarar la propia clase). Estos modificadores permiten indicar cierto

13

Desarrollodeclases

DAW

comportamiento de unatributo a la hora de utilizarlo. Entre los modificadores de un atributo


podemosdistinguir:
9 Modificadores de acceso. Indican la forma de acceso al atributo desde otra clase. Son
modificadoresexcluyentesentres.Slosepuedeponeruno.
9 Modificadoresdecontenido.Nosonexcluyentes.Puedenaparecervariosalavez.
9 Otrosmodificadores: transientyvolatile.Elprimeroseutiliza paraindicarqueunatributoes
transitorio (no persistente) y el segundo es para indicar al compilador que no debe realizar
optimizaciones sobre esa variable. Es ms que probable que no necesites utilizarlos en este
mdulo.
Aqutieneslasintaxiscompletadeladeclaracindeunatributoteniendoencuentalalistadetodos
losmodificadoreseindicandoculessonincompatiblesunosconotros:
[private | protected | public] [static] [final] [transient] [volatile] <tipo><nombreAtributo>;

Vamosaestudiarcondetallecadaunodeellos.

3.2Modificadoresdeacceso.
LosmodificadoresdeaccesodisponiblesenJavaparaunatributoson:
9 Modificadordeaccesoporomisin(odepaquete).Sinoseindicaningnmodificadordeacceso
enla declaracin del atributo, se utilizar este tipo de acceso. Se permitir el acceso a este
atributodesdetodaslasclasesqueestndentrodelmismopaquete(package)queestaclase(la
que contiene elatributo que se est declarando). No es necesario escribir ninguna palabra
reservada.Sinoseponenadasesuponesedeseaindicarestemododeacceso.
9 Modificador de acceso public. Indica que cualquier clase (por muy ajena o lejana que sea)
tieneaccesoaeseatributo.Noesmuyhabitualdeclararatributospblicos(public).
9 Modificadordeaccesoprivate.Indicaqueslosepuedeaccederalatributodesdedentrodela
propiaclase.Elatributoestarocultoparacualquierotrazonadecdigofueradelaclaseenla
queestdeclaradoelatributo.Esloopuestoaloquepermitepublic.
9 Modificadordeaccesoprotected.Enestecasosepermitiraccederalatributodesdecualquier
subclase (lo vers msadelante al estudiar la herencia) de la clase en la que se
encuentredeclaradoelatributo,ytambindesdelasclasesdelmismopaquete.
Acontinuacinpuedesobservarunresumendelosdistintosnivelesaccesibilidadquepermitecada
modificador:

Sinmodificador(paquete)
public
private
protected

Mismaclase

Subclase

Mismopaquete

Otropaquete

Recuerdaquelosmodificadoresdeaccesosonexcluyentes!Slosepuedeutilizarunodeellosen
ladeclaracindeunatributo.

EJERCICIORESUELTO.

14

DesarrollodeAplicacionesWeb

Tema5

Imagina que quieres escribir una clase que represente un rectngulo en el plano. Para ello has
pensadoenlossiguientesatributos:
9 Atributosx1,y1,querepresentanlacoordenadasdelvrticeinferiorizquierdodelrectngulo.
Ambosdetipodouble(nmerosreales).
9 Atributosx2,y2,querepresentanlascoordenadasdelvrticesuperiorderechodelrectngulo.
Tambindetipodouble(nmerosreales).
Conestosdospuntos(x1,y1)y(x2,y2)sepuededefinirperfectamentelaubicacindeunrectngulo
enelplano.
Escribeunaclasequecontengatodosesosatributosteniendoencuentaquequeremosqueseauna
clasevisibledesdecualquierpartedel programay quesusatributosseantambinaccesiblesdesde
cualquierpartedelcdigo.
Respuesta:

Dadoquesetratadeunaclasequepodrusarsedesdecualquierpartedelprograma,utilizaremosel
modificadordeaccesopublicparalaclase:
public class Rectangulo

Los cuatro atributos que necesitamos tambin han de ser visibles desde cualquier parte, as que
tambinseutilizarelmodificadordeaccesopublicparalosatributos:
public double x1, y1; // Vrtice inferior izquierdo
public double x2, y2; // Vrtice superior derecho

Deestamaneralaclasecompletaquedara:
public class Rectangulo {
public double x1, y1; // Vrtice inferior izquierdo
public double x2, y2; // Vrtice superior derecho
}

3.3Modificadoresdecontenido.
Los modificadores de contenido no son excluyentes (pueden aparecer varios para un mismo
atributo).Sonlossiguientes:
9 Modificadorstatic.Hacequeelatributoseacomnparatodoslosobjetosdeunamismaclase.
Esdecir, todas las clases compartirn ese mismo atributo con el mismo valor. Es un caso de
miembroesttico o miembro de clase: un atributo esttico o atributo de clase o variable de
clase.
9 Modificadorfinal.Indicaqueelatributoesunaconstante.Suvalornopodrsermodificadoalo
largodelavidadelobjeto.Porconvenio,elnombredelosatributosconstantes(final)seescribe
contodaslasletrasenmaysculas.
Enelsiguienteapartadosobreatributosestticosversunejemplocompletodeunatributoesttico
(static).Veamosahoraunejemplodeatributoconstante(final).
Imagina que ests diseando un conjunto de clases para trabajar con expresionesgeomtricas
(figuras, superficies, volmenes, etc.) y necesitas utilizar muy a menudo laconstante pi con
abundantescifrassignificativas,porejemplo,3.14159265.Utilizaresaconstanteliteralmuyamenudo
puede resultar tedioso adems de poco operativo (imaginaque el futuro hubiera que cambiar la

15

Desarrollodeclases

DAW

cantidaddecifrassignificativas).Laideaesdeclararlaunasolavez,asociarleunnombresimblico(un
identificador) y utilizar eseidentificador cada vez que se necesite la constante. En tal caso puede
resultar muy tildeclarar un atributo final con el valor 3.14159265 dentro de la clase en la que se
considereoportunoutilizarla.Elmejoridentificadorquepodrasutilizarparaellaserprobablemente
elpropionombredelaconstante(yenmaysculas,paraseguirelconveniodenombres),esdecir,PI.
Aspodraquedarladeclaracindelatributo:
class claseGeometria {
// Declaracin de constantes
public final float PI= 3.14159265;

AUTOEVALUACIN.
Con qu modificador puede indicarse en Java que un atributo es constante?
Con el modificador constant.
Con el modificador starter.
Con el modificador final.
Con el modificador static.

3.4Atributosestticos.
Como ya has visto, el modificador static hace que el
atributoseacomn(elmismo)paratodoslosobjetosde
una mismaclase. En este caso s podra decirse que la
existencia delatributo no depende de la existencia del
objeto,sinodelapropiaclaseyportantoslohabruno,
independientementedel nmero de objetos que se
creen. El atributo ser siempre elmismo para todos los
objetos y tendr un valor nicoindependientemente de
cada objeto. Es ms, aunque no existaningn objeto de
esa clase, el atributo s existir y podrcontener un valor (pues se trata de un atributo de la clase
msquedelobjeto).
Unodelosejemplosmshabituales(ysencillos)deatributosestticosodeclaseeseldeuncontador
que indica el nmerode objetos de esa clase que se han ido creando. Por ejemplo, en la clase de
ejemploPuntopodrasincluirunatributoquefueraesecontadorparallevarunregistrodelnmero
deobjetosdelaclasePuntoquesevanconstruyendodurantelaejecucindelprograma.
Otro ejemplo de atributo esttico (y en este caso tambin constante) que tambin se ha
mencionadoanteriormentealhablardemiembrosestticoseradisponerdeunatributonombre,que
contuvieraunStringconelnombredelaclase.Nuevamenteeseatributoslotienesentidoparala
clase,pueshabrdesercompartidoportodoslosobjetosqueseandeesaclase(eselnombredela
clasealaquepertenecenlosobjetosyportantosiempreserlamismaeigualparatodos,notiene
sentidoquecadaobjetodetipoPuntoalmaceneensuinteriorelnombredelaclase,esolodebera
hacerlapropiaclase).
class Punto {
// Coordenadas del punto

16

DesarrollodeAplicacionesWeb

Tema5

private int x, y;
// Atributos de clase: cantidad de puntos creados hasta el momento
public static cantidadPuntos;
public static final nombre;

Obviamente, para que esto funcione como ests pensando, tambin habr que escribir el cdigo
necesario paraque cada vez que se cree un objeto de la clase Punto se incremente el valor del
atributocantidadPuntos.
Volversaesteejemploparaimplementaresaotrapartecuandoestudieslosconstructores.
EJERCICIORESUELTO.
Ampliarelejercicioanteriordelrectnguloincluyendolossiguientesatributos:
9 AtributonumRectangulos,quealmacenaelnmerodeobjetosdetiporectngulocreadoshasta
elmomento.
9 Atributonombre,quealmacenaelnombrequeselequieradaracadarectngulo.
9 AtributonombreFigura,quealmacenaelnombredelaclase,esdecir,Rectngulo.
9 Atributo PI, que contiene el nombre de la constante PI con una precisin de cuatro cifras
decimales.
NosedeseaquelosatributosnombreynumRectangulospuedanservisiblesdesdefueradelaclase.
Yademssedeseaquelaclaseseaaccesiblesolamentedesdesupropiopaquete.
Respuesta:

Los atributos numRectangulos, nombreFigura y PI podran ser estticos pues se trata de valores
msasociadosalapropiaclasequeacadaunodelosobjetosquesepuedanircreando.Adems,en
elcasodePIynombreFigura,tambinpodraserunatributofinal,puessetratadevaloresnicosy
constantes(3.1416enelcasodePIyRectnguloenelcasodenombreFigura).
Dadoquenosedeseaquesetengaaccesibilidada losatributosnombreynumRectangulosdesde
fueradelaclasepodrautilizarseelatributoprivateparacadaunodeellos.
Porltimohayquetenerencuentaquesedeseaquelaclasesloseaaccesibledesdeelinteriordel
paquetealquepertenece,portantohabrqueutilizarelmodificadorporomisinodepaquete.Esto
es,noincluirningnmodificadordeaccesoenlacabeceradelaclase.
Teniendoencuentatodoloanteriorlaclasepodraquedarfinalmenteas:
class Rectangulo { // Sin modificador public para que slo sea accesible desde el paquete
// Atributos de clase
private static int numRectangulos; // Nmero total de rectngulos creados
public static final String nombreFigura= Rectngulo; // Nombre de la clase
public static final double PI= 3.1416; // Constante PI
// Atributos de objeto
private String nombre; // Nombre del rectngulo
public double x1, y1; // Vrtice inferior izquierdo
public double x2, y2; // Vrtice superior derecho
}

17

Desarrollodeclases

DAW

4.Mtodos
CASO PRCTICO.
Mara ya ha estado utilizando mtodos para poder manipular algunos de los objetosque han creado
en programas bsicos de prueba. En el proyecto de la ClnicaVeterinaria en el que est trabajando
junto con Juan van a tener que crear bastantestipos de objetos (clases) que representen el sistema
de informacin que quierenmodelar y automatizar. Ya han pensado y definido muchos de los atributos
que van atener esas clases. Ahora necesitan empezar a definir qu tipos de acciones se van apoder
realizar sobre la informacin que contenga cada clase o familia de objetos:
Ya tengo pensadas algunas de las acciones que van a ser necesarias para manipular algunas de
las clases quehemos planteado Le dice Mara a Juan.
Muy bien. Entonces es el momento de empezar a definir mtodos.
Perfecto. Y cmo lo hacemos? Cuando hemos utilizado objetos de clases ya incorporadas en el
lenguaje,simplemente he utilizado sus mtodos, pero an no he declarado ninguno.
No te preocupes, vamos a ver algunos ejemplos de declaracin, implementacin y utilizacin de
mtodos deuna clase. Vers cmo es mucho ms sencillo de lo que piensas.

Como ya has visto anteriormente, los mtodos son las herramientas que nos sirven paradefinir el
comportamientodeunobjetoensusinteraccionesconotrosobjetos.Formanpartedelaestructura
internadelobjetojuntoconlosatributos.
Enelprocesodedeclaracindeunaclasequeestsestudiandoyahasvistocmoescribirlacabecera
delaclaseycmoespecificarsusatributosdentrodelcuerpodelaclase.Tansolofaltayadeclararlos
mtodos,queestarntambinenelinteriordelcuerpodelaclasejuntoconlosatributos.
Los mtodos suelen declararse despus de los atributos. Aunque atributos y mtodos pueden
aparecermezcladosportodoelinteriordelcuerpodelaclaseesaconsejablenohacerloparamejorar
laclaridadylalegibilidaddelcdigo.Deesemodo,cuandoechemosunvistazorpidoalcontenido
deuna clase, podremos ver rpidamente los atributos al principio (normalmente ocuparn menos
lneasdecdigoysernfcilesdereconocer)ycadaunodelosmtodosinmediatamentedespus.
Cadamtodo puede ocupar un nmero de lneas de cdigo ms o menos grande en funcin de
lacomplejidaddelprocesoquepretendaimplementar.
Los mtodos representan la interfaz de una clase. Son la forma que tienen otros objetos de
comunicarse con unobjeto determinado solicitndole cierta informacin o pidindole que lleve a
cabo una determinada accin. Estemodo de programar, como ya has visto en unidades anteriores,
facilitamucholatareaaldesarrolladordeaplicaciones,pueslepermiteabstraersedelcontenidode
lasclaseshaciendousonicamentedelinterfaz(mtodos).

AUTOEVALUACIN.
Qu elementos forman la interfaz de un objeto?
Los atributos del objeto.
Las variables locales de los mtodos del objeto.
Los mtodos.
Los atributos estticos de la clase.

4.1Declaracindeunmtodo.
Ladefinicindeunmtodosecomponededospartes:
9 Cabecera del mtodo, que contiene el nombre del mtodo junto con el tipo devuelto, un
conjuntodeposiblesmodificadoresyunalistadeparmetros.

18

DesarrollodeAplicacionesWeb

Tema5

9 Cuerpo del mtodo, que contiene las sentencias que implementan el comportamiento del
mtodo(incluidasposiblessentenciasdedeclaracindevariableslocales).
Loselementosmnimosquedebenaparecerenladeclaracindeunmtodoson:
9
9
9
9

Eltipodevueltoporelmtodo.
Elnombredelmtodo.
Losparntesis.
Elcuerpodelmtodoentrellaves:{}.

Por ejemplo, en la clase Punto que se ha estado utilizando en los apartados anteriores podras
encontrarelsiguientemtodo:
int obtenerX ()
{
// Cuerpo del mtodo

Donde:
9
9
9
9

Eltipodevueltoporelmtodoesint.
ElnombredelmtodoesobtenerX.
Norecibeningnparmetro:apareceunalistavacaentreparntesis:().
Elcuerpodelmtodoestodoelcdigoquehabraenceradoentrellaves:{}.
Dentro del cuerpo del mtodo podrs encontrar
declaraciones de variables, sentencias y todo tipo de
estructurasde control (bucles, condiciones, etc.) que has
estudiadoenlosapartadosanteriores.
Ahora bien, la declaracin de un mtodo puede incluir
algunoselementosms.Vamosaestudiarcondetallecada
unodeellos.

4.2Cabecerademtodo.
Ladeclaracindeunmtodopuedeincluirlossiguienteselementos:
1. Modificadores (como por ejemplo los ya vistos public o private, ms algunos otros que irs
conociendopocoapoco).Noesobligatorioincluirmodificadoresenladeclaracin.
2. Eltipodevuelto(otipoderetorno),queconsisteeneltipodedato(primitivooreferencia)que
el mtodo devuelve tras ser ejecutado. Si eliges void como tipo devuelto, el mtodo no
devolverningnvalor.
3. Elnombredelmtodo,aplicndoseparalosnombreselmismoconvenioqueparalosatributos.
4. Unalistadeparmetrosseparadosporcomasyentreparntesisdondecadaparmetrodebeir
precedido por su tipo. Si el mtodo no tiene parmetros la lista estar vaca y nicamente
aparecernlosparntesis.
5. Una lista de excepciones que el mtodo puede lanzar. Se utiliza la palabra reservada throws
seguidadeunalistadenombresdeexcepcionesseparadasporcomas.Noesobligatorioqueun
mtodoincluyaunalistadeexcepciones,aunquemuchasvecesserconveniente.Enunidades

19

Desarrollodeclases

DAW

anterioresyahastrabajadoconelconceptodeexcepcinymsadelantevolversahaceruso
deellas.
6. Elcuerpodelmtodo,encerradoentrellaves.Elcuerpocontendrelcdigodelmtodo (una
lista sentencias y estructuras de control en lenguaje Java) as como la posible declaracin de
variableslocales.
Lasintaxisgeneraldelacabeceradeunmtodopodraentoncesquedaras:
[private | protected | public] [static] [abstract] [final] [native] [synchronized]
<tipo><nombreMtodo> ( [<lista_parametros>] )
[throws<lista_excepciones>]

Como sucede con todos los identificadores en Java


(variables, clases,objetos, mtodos, etc.), puede usarse
cualquier identificador que cumplalas normas. Ahora
bien, para mejorar la legibilidad del cdigo, se
haestablecido el siguiente convenio para nombrar los
mtodos: utilizar unverbo en minscula o bien un
nombre formado por varias palabrasque comience por
unverboenminscula,seguidoporadjetivos,nombres,
etc.loscualessaparecernenmaysculas.
Algunosejemplosdemtodosquesiguenesteconveniopodranser:ejecutar,romper,mover,subir,
responder,obtenerX, establecerValor, estaVacio, estaLleno, moverFicha, subirPalanca,
responderRapido,girarRuedaIzquierda,abrirPuertaDelantera,CambiarMarcha,etc.
EnelejemplodelaclasePunto,puedesobservarcmolosmtodosobtenerXyobtenerYsiguenel
conveniodenombresparalosmtodos,devuelvenenamboscasosuntipoint,sulistadeparmetros
esvaca(notienenparmetros)ynolanzanningntipodeexcepcin:
9 intobtenerX()
9 intobtenerY()

AUTOEVALUACIN.
Con cul de los siguientes modificadores no puede ser declarado un mtodo en Java?
private.
extern.
static.
public.

4.3Modificadoresenladeclaracindeunmtodo.
Enla declaracindeunmtodotambinpuedenaparecermodificadores(comoenladeclaracinde
laclaseodelosatributos).Unmtodopuedetenerlossiguientestiposdemodificadores:
9 Modificadores de acceso. Son los mismos que en el caso de los atributos (por omisin o de
paquete,public, private y protected) y tienen el mismo cometido (acceso al mtodo slo por
parte de clases delmismo paquete, o por cualquier parte del programa, o slo para la propia
clase,otambinparalassubclases).

20

DesarrollodeAplicacionesWeb

Tema5

9 Modificadoresdecontenido.Sontambinlosmismosqueenelcasodelosatributos(staticy
final)juntocon,aunquesusignificadonoeselmismo.
9 Otros modificadores (no son aplicables a los atributos, slo a los mtodos): abstract,
native,synchronized.
Unmtodostaticesunmtodocuyaimplementacinesigualparatodoslosobjetosdelaclaseyslo
tendraccesoalosatributosestticosdelaclase(dadoquesetratadeunmtododeclaseynode
objeto,slopodraccederalainformacindeclaseynoladeunobjetoenparticular).Estetipode
mtodospuedenserllamadossinnecesidaddetenerunobjetodelaclaseinstanciado.
En Java un ejemplo tpico de mtodos estticos se encuentra en la clase Math, cuyosmtodos son
todos estticos (Math.abs, Math.sin, Math.cos, etc.). Como habrspodido comprobar en este
ejemplo,lallamadaamtodosestticossehacenormalmenteusandoelnombredelapropiaclasey
noeldeunainstancia(objeto),puessetratarealmentedeunmtododeclase.Encualquiercaso,los
objetos tambin admiten la invocacin de los mtodos estticos de su clase y funcionara
correctamente.
Un mtodo final es un mtodo que no permite ser sobrescrito por las clases descendientes de la
clase a la quepertenece el mtodo. Volvers a ver este modificador cuando estudies en detalle la
herencia.
El modificador native es utilizado para sealar que un mtodo ha sido implementado en cdigo
nativo (en unlenguaje que ha sido compilado a lenguaje mquina, como por ejemplo C o C++). En
estoscasossimplementeseindicalacabeceradelmtodo,puesnotienecuerpoescritoenJava.
Unmtodoabstract(mtodoabstracto)esunmtodoquenotieneimplementacin(elcuerpoest
vaco). Laimplementacin ser realizada en las clases descendientes. Un mtodo slo puede ser
declarado como abstractsi se encuentra dentro de una clase abstract. Tambin volvers a este
modificadorenunidadesposteriorescuandotrabajesconlaherencia.
Porltimo,siunmtodohasidodeclaradocomosynchronized,elentornodeejecucinobligara
quecuandounprocesoestejecutandoesemtodo,elrestodeprocesosquetenganquellamara
esemismomtododebernesperaraqueelotroprocesotermine.Puederesultartilsisabesqueun
determinado mtodo va a poder serllamado concurrentemente por varios procesos a la vez. Por
ahoranolovasanecesitar.
Dada la cantidad de modificadores que has visto hasta el momento y su posible aplicacin en la
declaracindeclases,atributosomtodos,veamosunresumendetodoslosquehasvistoyenqu
casospuedenaplicarse:

Clase Atributo Mtodo


Sinmodificador(paquete)

public

private

protected

static

final

synchronized

native

abstract

21

Desarrollodeclases

DAW

4.4Parmetrosenunmtodo.
Lalistadeparmetrosdeun mtodosecolocatraselnombredelmtodo.Esta
lista
estarconstituida
por
pares
de
la
forma
<tipoParametro><nombreParametro>. Cadaunodeesosparesestarseparado
porcomasylalistacompletaestarencerradaentreparntesis:
<tipo> nombreMetodo ( <tipo_1><nombreParametro_1>, <tipo_2>
<nombreParametro_2>, , <tipo_n><nombreParametro_n> )

Silalistadeparmetrosesvaca,tansoloaparecernlosparntesis:
<tipo><nombreMetodo> ( )

Alahoradedeclararunmtodo,debestenerencuenta:
9 Puedes incluir cualquier cantidad de parmetros. Se trata de una decisin del programador,
pudiendoserinclusounalistavaca.
9 Losparmetrospodrnserdecualquiertipo(tiposprimitivos,referencias,objetos,arrays,etc.).
9 Noestpermitidoqueelnombredeunavariablelocaldelmtodocoincidaconelnombredeun
parmetro.
9 Nopuedehaberdosparmetrosconelmismonombre.Seproduciraambigedad.
9 Sielnombredealgnparmetrocoincideconelnombredeun atributodelaclase,steser
ocultado por el parmetro. Es decir, al indicar ese nombre en el cdigo del mtodo estars
haciendoreferenciaalparmetroynoalatributo.Parapoderaccederalatributo tendrsque
hacerusodeloperadordeautorreferenciathis,queversunpocomsadelante.
9 En Java el paso de parmetros es siempre por valor, excepto en el caso de los tipos
referenciados (por ejemplo los objetos) en cuyo caso se est pasando efectivamente una
referencia.Lareferencia(elobjetoensmismo)nopodrsercambiadaperoselementosdesu
interior (atributos) a travs de sus mtodos o por acceso directo si se trata de un miembro
pblico.
Esposibleutilizarunaconstruccinespecialllamadavarargs(argumentosvariables)quepermiteque
unmtodopuedatenerunnmerovariabledeparmetros.Parautilizarestemecanismosecolocan
unospuntossuspensivos(trespuntos:)despusdeltipodelcualsepuedetenerunalistavariable
deargumentos,unespacioenblancoyacontinuacinelnombredelparmetroqueaglutinarlalista
deargumentosvariables.
<tipo><nombreMetodo> (<tipo> <nombre<)

Esposibleademsmezclarelusodevarargsconparmetrosfijos.Entalcaso,lalistadeparmetros
variablesdebeapareceralfinal(yslopuedeapareceruna).
En realidad se trata una manera transparente de pasar un array con un nmero variable de
elementosparanotenerquehacerlomanualmente.Dentrodelmtodohabrqueirrecorriendoel
arrayparairobteniendocadaunodeloselementosdelalistadeargumentosvariables.

PARASABERMS.
Si quieres ver algunos ejemplos de cmo utilizar el mecanismo de argumentos variables,
puedesecharunvistazoalossiguientesenlaces(eningls):
http://www.javatips.org/javasetips/java.lang/usingthevarargslanguagefeature.html
http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html

22

DesarrollodeAplicacionesWeb

Tema5

Tambinpuedesecharunvistazoalartculogeneralsobrepasodeparmetrosamtodosen
losmanualesdeOraclesobreJava:
http://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html

4.5Cuerpodeunmtodo.
Elinteriordeunmtodo(cuerpo)estcompuestoporunaseriedesentenciasenlenguajeJava:
9 Sentencias de declaracin de variables locales al
mtodo.
9 Sentencias que implementan la lgica del mtodo
(estructurasdecontrolcomobuclesocondiciones;
utilizacindemtodosdeotrosobjetos;clculode
expresiones matemticas, lgicas o de cadenas;
creacindenuevosobjetos,etc.).Esdecir,todolo
quehasvistoenlasunidadesanteriores.
9 Sentencia de devolucin del valor de retorno
(return).Apareceralfinaldelmtodoyeslaque
permite devolver la informacin que se le ha
pedido al mtodo. Es la ltima parte del proceso y la forma de comunicarse con la parte de
cdigoquellamalmtodo(pasodemensajedevuelta).Estasentenciadedevolucinsiempre
tienequeapareceralfinaldelmtodo.Tansolosieltipodevueltoporelmtodoesvoid(vaco)
nodebeaparecer(puesnohayquedevolvernadaalcdigollamante).
EnelejemplodelaclasePunto,tenaslosmtodosobtenerXyobtenerY.Veamosunodeellos:
int obtenerX ()
{
return x;
}

En ambos casos lo nico que hace el mtodo es precisamente devolver un valor (utilizacin de la
sentenciareturn). No recibe parmetros (mensajes o informacin de entrada) ni hace clculos, ni
obtieneresultadosintermediosofinales.Tansolodevuelveelcontenidodeunatributo.Setratade
unodelosmtodosmssencillosquesepuedenimplementar:unmtodoquedevuelveelvalorde
unatributo.Eninglsselessuelellamarmtodosdetipoget,queeninglssignificaobtener.
Adems de esos dos mtodos, la clase tambin dispona de otros dos que sirven para la funcin
opuesta(establecerXyestablecerX).Veamosunodeellos:
void establecerX (int vx)
{
x= vx;
}

En este caso se trata de pasar un valor al mtodo (parmetro vx de tipo int) el cual ser utilizado
paramodificarelcontenidodelatributoxdelobjeto.Comohabrspodidocomprobar,ahoranose
devuelveningnvalor(eltipodevueltoesvoidynohaysentenciareturn).Eninglssesuelehablar
de mtodos de tipo set, que en inglssignifica poner o fijar (establecer un valor). El mtodo
establecerYesprcticamenteigualperoparaestablecerelvalordelatributoy.

23

Desarrollodeclases

DAW

Normalmente el cdigo en el interior de un mtodo ser algo ms complejo y estar formado un


conjuntodesentenciasenlasqueserealizarnclculos,setomarndecisiones,serepetirnacciones,
etc.Puedesverunejemplomscompletoenelsiguienteejercicio.
EJERCICIORESUELTO.
Vamos a seguir ampliando la clase en la que se representa un rectngulo en el plano (clase
Rectangulo).Paraellohaspensadoenlossiguientesmtodospblicos:
9 Mtodos obtenerNombre y establecerNombre, que permiten el acceso y modificacin del
atributonombredelrectngulo.
9 MtodocalcularSuperfice,quecalculaelreaencerradaporelrectngulo.
9 MtodocalcularPermetro,quecalculalalongituddelpermetrodelrectngulo.
9 Mtododesplazar,quemuevelaubicacindelrectnguloenelplanoenunacantidadX(parael
ejeX) y otra cantidad Y (para el eje Y). Se trata simplemente de sumar el desplazamiento X a
lascoordenadas x1 y x2, y el desplazamiento Y a las coordenadas y1 e y2. Los parmetros de
entradadeestemtodosernportantoXeY,detipodouble.
9 Mtodo obtenerNumRectangulos, que devuelve el nmero de rectngulos creados hasta el
momento.
IncluyelaimplementacindecadaunodeesosmtodosenlaclaseRectangulo.
Respuesta:

En el caso del mtodo obtenerNombre, se trata simplemente de devolver el valor del atributo
nombre:
public String obtenerNombre () {
return nombre;
}

ParaelimplementarelmtodoestablecerNombretambinesmuysencillo.Setratademodificarel
contenidodelatributonombreporelvalorproporcionadoatravsdeunparmetrodeentrada:
public void establecerNombre (String nom) {
nombre= nom;
}

Losmtodosdeclculodesuperficieypermetronovanarecibirningnparmetrodeentrada,tan
solo debenrealizar clculos a partir de los atributos contenidos en el objeto para obtener los
resultadosperseguidos.Encadacasohabrqueaplicarlaexpresinmatemticaapropiada:
9 Enelcasodelasuperficie,habrquecalcularlalongituddelabaseylaalturadelrectnguloa
partirdelascoordenadasdelasesquinasinferiorizquierda(x1,y1)ysuperiorderecha(x2,y2)de
la figura.La base sera la diferencia entre x2 y x1, y la altura la diferencia entre y2 e y1. A
continuacin tan solotendras que utilizar la consabida frmula de base por altura, es decir,
unamultiplicacin.
9 En el caso del permetro habr tambin que calcular la longitud de la base y de la altura del
rectnguloyacontinuacinsumardosveceslalongituddelabaseydosveceslalongituddela
altura.
Enamboscasoselresultadofinaltendrqueserdevueltoatravsdelasentenciareturn.Tambin
esaconsejable en ambos casos la utilizacin de variables locales para almacenar los clculos
intermedios(comolabaseolaaltura).

24

DesarrollodeAplicacionesWeb

Tema5

public double calcularSuperficie () {


double area, base, altura; // Variables locales
// Clculo de la base
base= x2-x1;
// Clculo de la altura
altura= y2-y1;
// Clculo del rea
area= base * altura;
// Devolucin del valor de retorno
return area;
}
public double calcularPerimetro () {
double perimetro, base, altura; // Variables locales
// Clculo de la base
base= x2-x1;
// Clculo de la altura
altura= y2-y1;
// Clculo del permetro
perimetro= 2*base + 2*altura;
// Devolucin del valor de retorno
return perimetro;
}

Enelcasodelmtododesplazar,setratademodificar:
9 Loscontenidosdelosatributosx1yx2sumndoleselparmetroX,
9 Loscontenidosdelosatributosy1ey2sumndoleselparmetroY.
public void desplazar (double X, double Y) {
// Desplazamiento en el eje X
x1= x1 + X;
x2= x2 + X;
// Desplazamiento en el eje X
y1= y1 + Y;
y2= y2 + Y;
}

Enestecasonosedevuelveningnvalor(tipodevueltovaco:void).
Por ltimo, el mtodo obtenerNumRectangulos simplemente debe devolver el valor del
atributonumRectangulos.Enestecasoesrazonableplantearsequeestemtodopodrasermsbien
unmtododeclase(esttico)msqueunmtododeobjeto,puesenrealidadesunacaracterstica
delaclasemsquealgnobjetoenparticular.Paraellotansolotendrasqueutilizarelmodificador
deaccesostatic:
public static int obtenerNumRectangulos () {
return numRectangulos;
}

4.6Sobrecargademtodos
En principio podras pensar que un mtodo puede aparecer una sola vez en la declaracin de
unaclase (no se debera repetir el mismo nombre para varios mtodos). Pero no tiene porqu
siempresuceder as. Es posible tener varias versiones de un mismo mtodo (varios mtodos con el
mismonombre)graciasalasobrecargademtodos.
El lenguaje Java soporta la caracterstica conocida como sobrecarga de mtodos. sta permite
declararenunamismaclasevariasversionesdelmismomtodoconelmismonombre.Laformaque
tendrelcompiladordedistinguirentrevariosmtodosquetenganelmismonombresermediante
la lista de parmetros del mtodo: siel mtodo tiene una lista de parmetros diferente, ser
considerado como un mtodo diferente (aunque tenga elmismo nombre) y el analizador lxico no
producirunerrordecompilacinalencontrardosnombresdemtodoigualesenlamismaclase.

25

Desarrollodeclases

DAW

Imagnate que ests desarrollando una clase para escribir sobre un lienzo que permite utilizar
diferentestipografas en funcin del tipo de informacin que se va a escribir. Es probable que
necesitemos un mtododiferente segn se vaya a pintar un nmero entero (int), un nmero real
(double) o una cadena de caracteres(String). Una primera opcin podra ser definir un nombre de
mtododiferentedependiendodeloquesevayaaescribirenellienzo.Porejemplo:
9
9
9
9

MtodopintarEntero(intentero).
MtodopintarReal(doublereal).
MtodopintarCadena(doubleString).
MtodopintarEnteroCadena(intentero,Stringcadena).

Yassucesivamenteparatodosloscasosquedeseescontemplar
La posibilidad que te ofrece la sobrecarga es utilizar un mismo nombre para todos esos mtodos
(dado que en elfondo hacen lo mismo: pintar). Pero para poder distinguir unos de otros ser
necesario que siempre exista algunadiferencia entre ellos en las listas de parmetros (bien en el
nmerodeparmetros,bieneneltipodelosparmetros).Volviendoalejemploanterior,podramos
utilizarunmismonombre,porejemplopintar,paratodoslosmtodosanteriores:
9
9
9
9

Mtodopintar(intentero).
Mtodopintar(doublereal).
Mtodopintar(doubleString).
Mtodopintar(intentero,Stringcadena).

En este caso el compilador no vaa generar ningn error pues se cumplen las normas yaque unos
mtodossonperfectamentedistinguiblesdeotros(apesardetenerelmismonombre)graciasaque
tienenlistasdeparmetrosdiferentes.
Lo que s habra producido un error de compilacin habra sido por ejemplo incluir otro mtodo
pintar (intentero), pues es imposible distinguirlo de otro mtodo con el mismo nombre y con la
mismalistadeparmetros(yaexisteunmtodopintarconunnicoparmetrodetipoint).
Tambindebestenerencuentaqueeltipodevueltoporelmtodonoesconsideradoalahorade
identificarunmtodo,asqueuntipodevueltodiferentenoessuficienteparadistinguirunmtodo
de otro. Es decir, nopodras definir dos mtodos exactamente iguales en nombre y lista de
parmetroseintentardistinguirlosindicandountipodevueltodiferente.Elcompiladorproducirun
errordeduplicidadenelnombredelmtodoynotelopermitir.
Es conveniente no abusar de sobrecarga de mtodos y utilizarla con cierta moderacin (cuando
realmentepuedebeneficiarsuuso),dadoquepodrahacerelcdigomenoslegible.

AUTOEVALUACIN.
En una clase Java puedes definir tantos mtodos con el mismo nombre como desees y sin
ningn tipo derestriccin pues el lenguaje soporta la sobrecarga de mtodos y el
compilador sabr distinguir unos mtodos deotros.
Verdadero

26

Falso

DesarrollodeAplicacionesWeb

Tema5

4.7Sobrecargadeoperadores.
Delmismomodoquehemosvistolaposibilidaddesobrecargarmtodos(disponer
de variasversiones de un mtodo con el mismo nombre cambiando su lista de
parmetros), podra plantearsetambin la opcin de sobrecargar operadores del
lenguajetalescomo+,,*,(),<,>,etc.paradarlesotrosignificadodependiendodel
tipodeobjetosconlosquevayaaoperar.
Enalgunoscasospuederesultartilparaayudaramejorarlalegibilidaddelcdigo,
puesesosoperadoresresultanmuyintuitivosypuedendarunaidearpidadecules
sufuncionamiento.
Un tpico ejemplo podra ser el de la sobrecarga de operadores aritmticos como la suma (+) o el
producto(*)paraoperarconfracciones.SisedefinenobjetosdeunaclaseFraccin(quecontendr
los atributos numeradory denominador) podran sobrecargarse los operadores aritmticos (habra
queredefinireloperadorsuma(+)paralasuma,eloperadorasterisco(*)paraelproducto,etc.)para
esta clase y as podran utilizarse para sumar omultiplicar objetos de tipo Fraccin mediante el
algoritmo especfico de suma o de producto del objetoFraccin (pues esos operadores no estn
preparadosenellenguajeparaoperarconesosobjetos).
EnalgunoslenguajesdeprogramacincomoporejemploC++oC#sepermitelasobrecarga,perono
esalgosoportadoentodosloslenguajes.QusucedeenelcasoconcretodeJava?
EllenguajeJavanosoportalasobrecargadeoperadores.
En el ejemplo anterior de los objetos de tipo Fraccin, habr que declarar mtodos en la clase
Fraccinqueseencarguenderealizaresasoperaciones,peronolopodremoshacersobrecargando
losoperadoresdellenguaje(lossmbolosdelasuma,resta,producto,etc.).Porejemplo:
public Fraccion sumar (Fraccion sumando)
public Fraccion multiplicar (Fraccion multiplicando)

Yassucesivamente
Dado que en este mdulo se est utilizando el lenguaje Java para aprender a programar, no
podremos hacer usode esta funcionalidad. Ms adelante, cuando aprendas a programar en otros
lenguajes,esposiblequestengaslaposibilidaddeutilizaresterecurso.

AUTOEVALUACIN.
La sobrecarga de operadores en Java permite rescribir el significado de operadores
del lenguaje tales como +,-, *, <, >, etc. Esto puede resultar muy til a la hora de
mejorar la legibilidad del cdigo cuando definimos porejemplo nuevos objetos
matemticos (nmeros racionales, nmeros complejos, conjuntos, etc.).
Verdadero

Falso

4.8Lareferenciathis.
Lapalabrareservadathisconsisteenunareferenciaalobjetoactual.Elusodeesteoperadorpuede
resultar muy til a la hora de evitar la ambigedad que puedeproducirse entre el nombre de un
parmetro de un mtodo y el nombre de unatributo cuando ambos tienen el mismo identificador
(mismonombre).Entalescasoselparmetroocultaalatributoynotendramosaccesodirectoal

27

Desarrollodeclases

DAW

(alescribir el identificador estaramos haciendo referencia al parmetro y no alatributo). En estos


casoslareferenciathisnospermiteaccederaestosatributosocultadosporlosparmetros.
Dadoquethisesunareferenciaalapropiaclaseenlaqueteencuentrasenesemomento,puedes
acceder a susatributos mediante el operador punto (.) como sucede con cualquier otra clase u
objeto. Por tanto, en lugar deponer el nombre del atributo (que estos casos hara referencia al
parmetro), podras escribirthis.nombreAtributo, de manera que el compilador sabr que te ests
refiriendoalatributoyseeliminarlaambigedad.
EnelejemplodelaclasePunto,podramosutilizarlareferenciathissielnombredelparmetrodel
mtodocoincidieraconeldelatributoquesedeseamodificar.Porejemplo:
void establecerX (int x)
{
this.x= x;
}

Enestecasohasidoindispensableelusodethis,puessinoseraimposiblesaberenqu casoste
estsrefiriendo al parmetro x y en cules al atributo x. Para el compilador el identificador x ser
siempreelparmetro,pueshaocultadoalatributo.
Enalgunoscasospuederesultartilhacerusodelareferenciathisaunquenoseanecesario,pues
puedeayudaramejorarlalegibilidaddelcdigo.

PARASABERMS.
PuedesecharunvistazoalartculogeneralsobrelareferenciathisenlosmanualesdeOracle
(eningls):
http://docs.oracle.com/javase/tutorial/java/javaOO/thiskey.html

AUTOEVALUACIN.
La referencia this en Java resulta muy til cuando se quieren utilizar en un mtodo
nombres de parmetros quecoinciden con los nombres de variables locales del mtodo.
Verdadero

Falso

EJERCICIORESUELTO.
Modificar el mtodo obtenerNombre de la clase Rectangulo de ejercicios anteriores utilizando la
referenciathis.
Respuesta:

Si utilizamos la referencia this en este mtodo, entonces podremos utilizar como identificador del
parmetro elmismo identificador que tiene el atributo (aunque no tiene porqu hacerse si no se
desea):
public void establecerNombre (String nombre) {
this.nombre= nombre;
}

4.9Mtodosestticos.
Comoyahasvistoenocasionesanteriores,unmtodoestticoesunmtodoquepuedeserusado
directamente desde la clase, sin necesidad de tener que crear una instancia para poderutilizar al

28

DesarrollodeAplicacionesWeb

Tema5

mtodo.Tambinsonconocidoscomomtodosdeclase(comosucedaconlosatributosdeclase),
frentealosmtodosdeobjeto(esnecesariounobjetoparapoderdisponerdeellos).
Losmtodosestticosnopuedenmanipularatributosdeinstancias(objetos)sinoatributosestticos
(de clase) y suelen ser utilizados para realizar operaciones comunes a todos losobjetos de la clase,
msqueparaunainstanciaconcreta.
Algunosejemplosdeoperacionesquesuelenrealizarsedesdemtodosestticos:
9 Accesoaatributosespecficosdeclase:incrementoodecrementodecontadoresinternosdela
clase(nodeinstancias),accesoaunposibleatributodenombredelaclase,etc.
9 Operacionesgenricasrelacionadasconlaclaseperoquenoutilizanatributosdeinstancia.Por
ejemplouna clase NIF (o DNI) que permite trabajar con el DNI y la letra del NIF y que
proporcionafuncionesadicionalesparacalcularlaletraNIFdeunnmerodeDNIqueselepase
comoparmetro.Esemtodopuedeserinteresanteparaserusadodesdefueradelaclasede
maneraindependientealaexistenciadeobjetosdetipoNIF.
EnlabibliotecadeJavaesmuyhabitualencontrarseconclasesqueproporcionanmtodosestticos
que puedenresultar muy tiles para clculos auxiliares, conversiones de tipos, etc. Por ejemplo, la
mayora de las clases delpaquete java.lang que representan tipos (Integer, String, Float, Double,
Boolean,etc.)ofrecenmtodosestticosparahacerconversiones.Aqutienesalgunosejemplos:
9 staticStringvalueOf(inti).DevuelvelarepresentacinenformatoString(cadena)deunvalor
int.Setratadeunmtodoquenotienequevernadaenabsolutoconinstanciasdeconcretasde
String, sinode un mtodo auxiliar que puede servir como herramienta para ser usada desde
otras clases. Seutilizara directamente con el nombre de la clase. Por ejemplo: String
enteroCadena=String.valueOf(23).
9 static String valueOf (float f). Algo similar para un valor de tipo float. Ejemplo de uso:
StringfloatCadena=String.valueOf(24.341).
9 static int parseInt (String s). En este caso se trata de un mtodo esttico de la clase Integer.
Analizala cadena pasada como parmetro y la transforma en un int. Ejemplo de uso: int
cadenaEntero=Integer.parseInt(12).
Todoslosejemplosanterioressoncasosenlosqueseutilizadirectamentelaclasecomounaespecie
decajadeherramientasquecontienemtodosquepuedenserutilizadosdesdecualquierparte,por
esosuelensermtodospblicos.

PARASABERMS.
Puedesecharunvistazoaalgunasclasesdelpaquetejava.lang(porejemploInteger,String,
Float, Double,Boolean y Math) y observar la gran cantidad de mtodos estticos que
ofrecenparaserutilizadossinnecesidaddetenerquecrearobjetosdeesasclases:
Package
java.lang.http://docs.oracle.com/javase/7/docs/api/java/lang/package
summary.html

29

Desarrollodeclases

DAW

5.Encapsulacin,controldeaccesoyvisibilidad.
CASO PRCTICO.
Juan est desarrollando algunas de las clases que van a necesitar para el proyectode la Clnica
Veterinaria y empiezan a asaltarle dudas acerca de cundo deben servisibles unos u otros
miembros. Recuerda ha estado viendo con Mara los distintosmodificadores de acceso aplicables a
las clases, atributos y mtodos. Est claro quehasta que no empiece a utilizarlos para casos
concretos y con aplicacin prcticareal no terminar de comprender exactamente su mecnica de
funcionamiento:
Cundo interesa ocultar un determinado miembro, cundo interesa que otro miembro sea visible, en
qucasos vale la pena crear un mtodo para acceder al valor de un atributo, etc.

DentrodelaProgramacinOrientadaaObjetosyahasvistoqueesmuyimportanteelconceptode
ocultacin,lacualhasidologradagraciasalaencapsulacindelainformacindentrodelasclases.
Deestamaneraunaclasepuedeocultarpartedesucontenidoorestringirelaccesoalparaevitar
que sea manipulado de manerainadecuada. Los modificadores de acceso en Java permiten
especificarelmbitodevisibilidaddelosmiembrosdeunaclase,proporcionandoasunmecanismo
deaccesibilidadavariosniveles.
Acabasdeestudiarquecuandosedefinenlosmiembrosdeunaclase(atributosomtodos),eincluso
la propia clase, se indica (aunque sea por omisin) un modificador deacceso. En funcin de la
visibilidadquesedeseequetenganlosobjetosolosmiembrosdeesosobjetosseelegiralgunode
losmodificadoresdeaccesoquehasestudiado.Ahoraqueyasabescmoescribirunaclasecompleta
(declaracindelaclase,declaracindesusatributosydeclaracindesusmtodos),vamosahacerun
repasogeneraldelasopcionesdevisibilidad(controldeacceso)quehasestudiado.
Losmodificadoresdeaccesodeterminansiunaclasepuedeutilizardeterminadosmiembros(acceder
aatributosoinvocarmiembros)deotraclase.Existendosnivelesdecontroldeacceso:
1. Anivelgeneral(niveldeclase):visibilidaddelapropiaclase.
2. Aniveldemiembros:especificacin,miembropormiembro,desuniveldevisibilidad.
Enelcasodelaclase,yaestudiastequelosnivelesdevisibilidadpodanser:
9 Pblico (modificador public), en cuyo caso la claseera visible a cualquier otra clase (cualquier
otrofragmentodecdigodelprograma).
9 Privada al paquete (sin modificador o modificador por omisin). En este caso, la clase slo
ser visible a las dems clases del mismo paquete, pero no al resto del cdigo del programa
(otrospaquetes).
En el caso de los miembros, disponas de otras dos posibilidades ms de niveles de accesibilidad,
teniendountotaldecuatroopcionesalahoradedefinirelcontroldeaccesoalmiembro:
9 Pblico(modificadorpublic),igualqueenelcasoglobaldelaclaseyconelmismosignificado
(miembrovisibledesdecualquierpartedelcdigo).
9 Privado al paquete (sin modificador), tambin con el mismo significado que en el caso de la
clase(miembrovisibleslodesdeclasesdelmismopaquete,nisiquieraservisibledesdeuna
subclasesalvosistaestenelmismopaquete).
9 Privado(modificadorprivate),dondeslolapropiaclasetieneaccesoalmiembro.
9 Protegido(modificadorprotected)

30

DesarrollodeAplicacionesWeb

Tema5

PARASABERMS.
Puedesecharunvistazoalartculosobreelcontroldeaccesoalosmiembrosdeunaclase
JavaenlosmanualesdeOracle(eningls):
http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

AUTOEVALUACIN.
Si queremos que un atributo de una clase sea accesible solamente desde el cdigo de la propia
clase o deaquellas clases que hereden de ella, qu modificador de acceso deberamos
utilizar?
private.
protected.
public.
Ninguno de los anteriores.

5.1Ocultacindeatributos.Mtodosdeacceso.
Losatributosdeunaclasesuelenserdeclaradoscomoprivadosalaclaseo,comomucho,protected
(accesiblestambinporclasesheredadas),peronocomopublic.Deestamanerapuedesevitarque
seanmanipuladosinadecuadamente(porejemplosmodificarlossinningntipodecontrol)desdeel
exteriordelobjeto.
En estos casos lo que se suele hacer es declarar esos atributos como privados oprotegidos y crear
mtodos pblicos que permitan acceder a esos atributos. Si setrata de un atributo cuyo contenido
puede ser observado pero no modificadodirectamente, puede implementarse un mtodo de
obtencindelatributo(eninglsselessuelellamarmtododetipoget)ysielatributopuedeser
modificado,puedestambinimplementarotromtodoparalamodificacinoestablecimientodel
valordelatributo(eninglsselesuelellamarmtododetiposet).Estoyalohasvistoenapartados
anteriores.
SirecuerdaslaclasePuntoquehemosutilizadocomoejemplo,yahicistealgoasconlosmtodosde
obtencinyestablecimientodelascoordenadas:
private int x, y;
// Mtodos get
public int obtenerX () { return
public int obtenerY () { return
// Mtodos set
public void establecerX (int x)
public void establecerY (int y)

x; }
y; }
{ this.x= x; }
{ this.y= y; }

As,parapoderobtenerelvalordelatributoxdeunobjetodetipoPuntosernecesarioutilizarel
mtodoobtenerX()ynosepodraccederdirectamentealatributoxdelobjeto.
Enalgunoscasoslosprogramadoresdirectamenteutilizannombreseninglsparanombraraestos
mtodos:
getX ,getY (), setX, setY, getNombre, setNombre, getColor, etc.

Tambinpuedendarsecasosenlosquenointeresaquepuedaobservarsedirectamenteelvalorde
un atributo,sino un determinado procesamiento o clculo que se haga con el atributo (pero no el
valororiginal).PorejemplopodrastenerunatributoDNIquealmacenelos8dgitosdelDNIperono
la letra del NIF (pues se puedecalcular a partir de los dgitos). El mtodo de acceso para el DNI

31

Desarrollodeclases

DAW

(mtodogetDNI)podraproporcionarelDNIcompleto(esdecir,elNIF,incluyendolaletra),mientras
quelaletranoesalmacenadarealmenteenelatributodelobjeto.Algosimilarpodrasucederconel
dgito de control de una cuenta bancaria, que puede no seralmacenado en el objeto, pero s
calculadoydevueltocuandosenospideelnmerodecuentacompleto.
Enotroscasospuedeinteresardisponerdemtodosdemodificacindeunatributoperoatravsde
undeterminado procesamiento previo para por ejemplo poder controlar errores o valores
inadecuados.VolviendoalejemplodelNIF,unmtodoparamodificarunDNI(mtodosetDNI)podra
incluirlaletra(NIFcompleto),demaneraqueaspodracomprobarsesielnmerodeDNIylaletra
coinciden (es un NIF vlido). En tal caso sealmacenar el DNI y en caso contrario se producir un
error de validacin (por ejemplo lanzando unaexcepcin). En cualquier caso, el DNI que se
almacenaraserasolamenteelnmeroynolaletra(pueslaletraescalculableapartirdelnmerode
DNI).

AUTOEVALUACIN.
Los atributos de una clase suelen ser declarados como public para facilitar el acceso y la
visibilidad de losmiembros de la clase.
Verdadero

Falso

5.2Ocultacindemtodos.
Normalmentelosmtodosdeunaclasepertenecenasuinterfazyportantoparecelgicoquesean
declarados como pblicos. Pero tambin es cierto que pueden darse casos en los que existala
necesidad de disponer de algunos mtodos privados a la clase. Se trata de mtodos querealizan
operacionesintermediasoauxiliaresyquesonutilizadosporlosmtodosquesformanpartedela
interfaz.Esetipodemtodos(decomprobacin,deadaptacindeformatos,declculosintermedios,
etc.)suelen declararse comoprivados puesnoson deinters (onoesapropiadoqueseanvisibles)
fueradelcontextodelinteriordelobjeto.
En el ejemplo anterior de objetos que contienen un DNI, ser necesario calcular la letra
correspondienteaundeterminadonmerodeDNIocomprobarsiunadeterminadacombinacinde
nmero y letra forman un DNIvlido. Este tipo de clculos y comprobaciones podran ser
implementadosenmtodosprivadosdelaclase(oalmenoscomomtodosprotegidos).

AUTOEVALUACIN.
Dado que los mtodos de una clase forman la interfaz de comunicacin de esa clase con
otras clases, todos loselementos de una clase deben ser siempre declarados como
pblicos.
Verdadero

Falso

EJERCICIORESUELTO.
Vamos a intentar implementar una clase que incluya todo lo que has visto hasta ahora. Se desea
crearunaclasequerepresenteunDNIespaolyquetengalassiguientescaractersticas:

32

DesarrollodeAplicacionesWeb

Tema5

9 LaclasealmacenarelnmerodeDNIenunint,singuardarlaletra,puessepuedecalculara
partirdel nmero. Este atributo ser privado a la clase. Formato del atributo: private int
numDNI.
9 Para acceder al DNI se dispondr de dos mtodos obtener (get), uno que proporcionar el
nmerodeDNI(slolascifrasnumricas)yotroquedevolverelNIFcompleto(incluidalaletra).
Elformatodelmtodoser:
publicintobtenerDNI().
publicStringobtenerNIF().
9 ParamodificarelDNIsedispondrdedosmtodosestablecer(set),quepermitirnmodificarel
DNI.UnoenelquehabrqueproporcionarelNIFcompleto(nmeroyletra).Yotroenelque
nicamenteser necesario proporcionar el DNI (las siete u ocho cifras). Si el DNI/NIF es
incorrectosedeberalanzaralgntipodeexcepcin.Elformatodelosmtodos(sobrecargados)
ser:
publicvoidestablecer(Stringnif)throws
publicvoidestablecer(intdni)throws
9 Laclasedispondrdealgunosmtodosinternosprivadosparacalcularlaletradeunnmerode
DNIcualquiera,paracomprobarsiunDNIconsuletraesvlido,paraextraerlaletradeunNIF,
etc.Aquellos mtodos que no utilicen ninguna variable de objeto podran declararse como
estticos(pertenecientesalaclase).Formatodelosmtodos:
privatestaticcharcalcularLetraNIF(intdni).
privatebooleanvalidarNIF(Stringnif).
privatestaticcharextraerLetraNIF(Stringnif).
privatestaticintextraerNumeroNIF(Stringnif).
ParacalcularlaletraNIFcorrespondienteaunnmerodeDNIpuedesconsultarelartculosobreel
NIFdelaWikipedia:
http://es.wikipedia.org/wiki/N%C3%BAmero_de_identificaci%C3%B3n_fiscal
Respuesta:

En el siguiente documento puedes observar el proceso completo de elaboracin de todos los


elementosdelaclase:
/**---------------------------------------------------------------* Clase DNI
----------------------------------------------------------------*/
public class DNI {
// Atributos estticos
// Cadena con las letras posibles del DNI ordenados para el clculo de DNI
private static final String LETRAS_DNI= "TRWAGMYFPDXBNJZSQVHLCKE";
// Atributos de objeto
private int numDNI;
// Mtodos
public String obtenerNIF () {
// Variables locales
String cadenaNIF;
// NIF con letra para devolver
char letraNIF;
// Letra del nmero de NIF calculado
// Clculo de la letra del NIF
letraNIF= calcularLetraNIF (numDNI);
// Construccin de la cadena del DNI: nmero + letra
cadenaNIF= Integer.toString(numDNI) + String.valueOf(letraNIF);
// Devolucin del resultado
return cadenaNIF;
}
public int obtenerDNI () {
return numDNI;
}

33

Desarrollodeclases

DAW

public void establecer (String nif) throws Exception {


if (DNI.validarNIF (nif)) { // Valor vlido: lo almacenamos
this.numDNI= DNI.extraerNumeroNIF(nif);
}
else { // Valor invlido: lanzamos una excepcin
throw new Exception ("NIF invlido: " + nif);
}
}
public void establecer (int dni) throws Exception {
// Comprobacin de rangos
if (dni>999999 && dni<99999999) {
this.numDNI= dni; // Valor vlido: lo almacenamos
}
else { // Valor invlido: lanzamos una excepcin
throw new Exception ("DNI invlido: " + String.valueOf(dni));
}
}
private static char calcularLetraNIF (int dni) {
char letra;
// Clculo de la letra NIF
letra= LETRAS_DNI.charAt(dni % 23);
// Devolucin de la letra NIF
return letra;
}
private static char extraerLetraNIF (String nif) {
char letra=
nif.charAt(nif.length()-1);
return letra;
}
private static int extraerNumeroNIF (String nif) {
int numero= Integer.parseInt(nif.substring(0, nif.length()-1));
return numero;
}
private static boolean validarNIF (String nif) {
boolean valido= true;
// Suponemos el NIF vlido mientras no se encuentre algn fallo
char letra_calculada;
char letra_leida;
int dni_leido;
if (nif == null) { // El parmetro debe ser un objeto no vaco
valido= false;
}
else if (nif.length()<8 || nif.length()>9) {
// La cadena debe estar entre 8(7+1) y 9(8+1)
caracteres
valido= false;
}
else {
letra_leida= DNI.extraerLetraNIF (nif);
// Extraemos la letra de NIF
(letra)
dni_leido= DNI.extraerNumeroNIF (nif); // Extraemos el nmero de DNI (int)
letra_calculada= DNI.calcularLetraNIF(dni_leido);
// Calculamos la letra de
NIF a partir del nmero extrado
if (letra_leida == letra_calculada) {
// Comparamos la letra extrada con la calculada
// Todas las comprobaciones han resultado vlidas. El NIF es vlido.
valido= true;
}
else {
valido= false;
}
}
return valido;
}
}

34

DesarrollodeAplicacionesWeb

Tema5

6.Utilizacindelosmtodosyatributosdeunaclase.
CASO PRCTICO.
Juan ya ha terminado de escribir algunas de las clases de prueba para la aplicacin que est
comenzando a desarrollar junto con Mara. Es el momento de crear instancias de esas clases (es
decir, objetos) para probar si estn correctamente implementadas. La idea de Juan es pasar las
clases a Mara junto con cierta documentacin sobre su interfaz para que ella no tenga que examinar
los detalles de implementacin de las clases. De esta manera ella escribir cdigo en el que crear
objetos a partir de las clases de Juan y a continuacin comenzar a utilizar sus miembros pblicos. Si
todo ha ido bien, Mara habr hecho uso de las clases de Juan sin tener que haber participado
directamente en su desarrollo. Si se producen problemas de ejecucin (de compilacin no deberan
producirse porque ya los habra resuelto Juan), Mara podr informar de cules han sido esos errores
para que Juan pueda intentar corregirlos, ya que l es quien sabr en qu parte del cdigo habr que
tocar.

Una vez que ya tienes implementada una clase con todos sus atributos y mtodos, ha llegado el
momento de utilizarla, es decir, de instanciar objetos de esa clase e interaccionar con ellos. En
unidadesanterioresyahasvistocmodeclararunobjetodeunaclasedeterminada,instanciarlocon
eloperadornewyutilizarsusmtodosyatributos

PARASABERMS.
Puedes echar un vistazo a los artculos sobre la creacin y uso de objetos en Java en los
manualesdeOracle:

http://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html
EnlacealartculodelmanualdeJavadeOracleenelquesedescribeelprocesodecreacin
deunobjeto.(eningls).

http://docs.oracle.com/javase/tutorial/java/javaOO/usingobject.html
EnlacealartculodelmanualdeJavadeOracleenelquesedescribecmoutilizarunobjeto
enJava(eningls).

6.1Declaracindeunobjeto.
Comoyahasvistoenunidadesanteriores,ladeclaracindeunobjetoserealizaexactamenteigual
queladeclaracindeunavariabledecualquiertipo:
<tipo> nombreVariable;

En este caso el tipo ser alguna clase que ya hayas implementado o bien alguna de las
proporcionadasporlabibliotecadeJavaoporalgunaotrabibliotecaescritaporterceros.
Porejemplo:
Punto p1;
Rectangulo r1, r2;
Coche cocheAntonio;
String palabra;

Esas variables (p1, r1, r2, cocheAntonio, palabra) en realidad son referencias (tambin conocidas
comopunterosodireccionesdememoria)queapuntan(hacenreferencia)aunobjeto(unazona
dememoria)delaclaseindicadaenladeclaracin.
Como ya estudiaste en la unidad dedicada a los objetos, un objeto recin declarado (referencia
recincreada)noapuntaanada.Sedicequelareferenciaestvacaoqueesunareferencianula(la
variableobjetocontieneelvalornull).Esdecir,lavariableexisteyestpreparadaparaguardaruna

35

Desarrollodeclases

DAW

direccindememoriaqueserlazonadondeseencuentreelobjetoalqueharreferencia,peroel
objeto an no existe (no ha sido creado o instanciado). Por tanto se dice que apunta a un objeto
nulooinexistente.
Paraqueesavariable(referencia)apunterealmenteaunobjeto(contengaunareferenciaodireccin
dememoriaqueapunteaunazonadememoriaenlaquesehareservadoespacioparaunobjeto)es
necesariocrearoinstanciarelobjeto.Paraelloseutilizaeloperadornew.

AUTOEVALUACIN.
Aunque la declaracin de un objeto es imprescindible para poder utilizarlo, ese objeto no
existir hasta que no se construya una instancia de la clase del objeto. Es decir, mientras la
clase no sea instanciada, el objeto an no existir y lo nico que se tendr ser una variable
que contendr un objeto vaco o nulo.
Verdadero

Falso

EJERCICIORESUELTO.
Utilizando la clase Rectangulo implementada en ejercicios anteriores, indica como declararas tres
objetos(variables)deesaclasellamadosr1,r2,r3.
Respuesta

Setratasimplementederealizarunadeclaracindeesastresvariables:
Rectangulo r1;
Rectangulo r2:
Rectangulo r3:

Tambinpodrashaberdeclaradolostresobjetosenlamismasentenciadedeclaracin:
Rectangulo r1, r2, r3;

6.2Creacindeunobjeto.
Para poder crear un objeto (instancia de una clase) es necesario utilizar el operador new, el cual
tienelasiguientesintaxis:
nombreObjeto= new <ConstructorClase> ([listaParametros]);

El constructor de una clase (ConstructorClase) es un mtodo especial que tiene toda clase y cuyo
nombrecoincideconeldelaclase.Esquienseencargadecrearoconstruirelobjeto,solicitandola
reservadememorianecesariaparalosatributoseinicializndolosaalgnvalorsifueranecesario.
Dadoqueelconstructoresunmtodomsdelaclase,podrtenertambinsulistadeparmetros
comotienentodoslosmtodos.
De la tarea de reservar memoria para la estructura del objeto (sus atributos ms alguna otra
informacin de carcter interno para el entorno de ejecucin) se encarga el propio entorno de
ejecucinde Java.Es decir,que porel hecho de ejecutar un mtodoconstructor,elentornosabr
quetienequerealizarunaseriedetareas(solicituddeunazonadememoriadisponible,reservade
memoriaparalosatributos,enlacedelavariableobjetoaesazona,etc.)ysepondrrpidamentea
desempearlas.

36

DesarrollodeAplicacionesWeb

Tema5

Cuandoescribaselcdigodeunaclasenoesnecesarioqueimplementeselmtodoconstructorsino
quieres hacerlo. Java se encarga de dotar de un constructor por omisin (tambin conocido como
constructorpordefecto)atodaclase.Eseconstructorporomisinseocuparexclusivamentedelas
tareasdereservadememoria.Sideseasqueelconstructorrealiceotrastareasadicionales,tendrs
queescribirlot.Elconstructorporomisinnotieneparmetros.
Elconstructorpordefectonoseveenelcdigodeunaclase.LoincluirelcompiladordeJavaal
compilarlaclasesidescubrequenosehacreadoningnmtodoconstructorparaesaclase.
Algunosejemplosdeinstanciacinocreacindeobjetospodranser:
p1= new Punto ();
r1= new Rectangulo ();
r2= new Rectangulo;
cocheAntonio= new Coche();
palabra= String;

Enelcasodelosconstructores,sistosnotienenparmetros,puedenomitirselosparntesisvacos.
Unobjetopuedeserdeclaradoeinstanciadoenlamismalnea.Porejemplo:
Punto p1= new Punto ();

AUTOEVALUACIN.
Si una clase no tiene constructor porque el programador no lo ha implementado, Java se
encargar de dotar a esa clase de un constructor por defecto de manera que cualquier clase
instanciable siempre tendr al menos un constructor
Verdadero

Falso

EJERCICIORESUELTO.
Ampliarelejercicioanteriorinstanciandolosobjetosr1,r2,r3medianteelconstructorpordefecto.
Respuesta

Habra que aadir simplemente una sentencia de creacin o instanciacin (llamada al constructor
medianteeloperadornew)porcadaobjetoquesedeseecrear:
Rectangulo r1, r2,
r1= new Rectangulo
r2= new Rectangulo
r3= new Rectangulo

r3;
();
();
();

6.3Manipulacindeunobjeto:utilizacindemtodosyatributos.
Una vez que un objeto ha sido declarado y creado (clase instanciada) ya s se puede decir que el
objetoexisteenelentornodeejecucin,yportantoquepuedesermanipuladocomounobjetoms
enelprograma,hacindoseusodesusatributosysusmtodos.
Paraaccederaunmiembrodeunobjetoseutilizaeloperadorpunto(.)delsiguientemodo:
<nombreObjeto>.<nombreMiembro>

Donde<nombreMiembro>serelnombredealgnmiembrodelobjeto(atributoomtodo)alcual
setengaacceso.

37

Desarrollodeclases

DAW

Por ejemplo, en el caso de los objetos de tipo Punto que has declarado e instanciado en los
apartadosanteriores,podrasaccederasusmiembrosdelasiguientemanera:
Punto p1, p2, p3;
p1= new Punto();
p1.x= 5;
p1.y= 6;
System.out.printf ("p1.x: %d\np1.y: %d\n", p1.x, p1.y);
System.out.printf ("p1.x: %d\np1.y: %d\n", p1.obtenerX(), p1.obtenerY());
p1.establecerX(25);
p1.establecerX(30);
System.out.printf ("p1.x: %d\np1.y: %d\n", p1.obtenerX(), p1.obtenerY());

Esdecir,colocandoeloperadorpunto(.)acontinuacindelnombredelobjetoyseguidodelnombre
delmiembroalquesedeseaacceder.
EJERCICIORESUELTO.
Utilizarelejemplodelosrectngulosparacrearunrectngulor1,asignarlelosvaloresx1=0,y1=0,
x2=10,y2=10,calcularsureaysupermetroymostrarlosenpantalla.
Respuesta

Setratadedeclarareinstanciarelobjetor1,rellenarsusatributosdeubicacin(coordenadasdelas
esquinas), e invocar a los mtodos calcularSuperficie y calcularPerimetro utilizando el operador
punto(.).Porejemplo:
Rectangulo r1= new Rectangulo ();
r1.x= 0;
r1.y= 0;
r2.x= 10;
r2.y= 10;
area= r1.calcularSuperficie ();
permetro= r1.calcularPerimetro ();

Porltimofaltaramostrarenpantallalainformacincalculada.
PodemosobservaracontinuacinunejemplocompletodondeseinstanciaunobjetoRectanguloy
semanipulansusmiembros:
Claseprincipalomain
/*
Ejemplo de uso de la clase Rectangulo
*/
package ejemplorectangulos01;
/**
*
* Programa Principal (clase principal)
*/
public class EjemploRectangulos01 {

public static void main(String[] args) {


Rectangulo r1, r2;
r1= new Rectangulo ();
r2= new Rectangulo ();
r1.x1= 0;
r1.y1= 0;
r1.x2= 10;
r1.y2= 10;
r1.establecerNombre ("rectangulo1");
System.out.printf ("PRUEBA DE USO DE LA CLASE RECTNGULO\n");
System.out.printf ("------------------------------------\n\n");
System.out.printf ("r1.x1: %4.2f\nr1.y1: %4.2f\n", r1.x1, r1.y1);
System.out.printf ("r1.x2: %4.2f\nr1.y2: %4.2f\n", r1.x2, r1.y2);

38

DesarrollodeAplicacionesWeb

Tema5

System.out.printf
("Perimetro:
%4.2f\nSuperficie:
%4.2f\n",
r1.CalcularPerimetro(),
r1.CalcularSuperficie());
System.out.printf ("Desplazamos X=3, Y=3\n");
r1.desplazar (3,3);
System.out.printf ("r1.x1: %4.2f\nr1.y1: %4.2f\n", r1.x1, r1.y1);
System.out.printf ("r1.x2: %4.2f\nr1.y2: %4.2f\n", r1.x2, r1.y2);
}
}

Claserectngulo
package ejemplorectangulos01;
/**---------------------------------------------------------------* Clase Rectangulo
----------------------------------------------------------------*/
public class Rectangulo {
// Atributos de clase
private static int numRectangulos;
creados
public static final String nombreFigura= "Rectngulo";
public static final double PI= 3.1416;
// Atributos de objeto
private String nombre;
public double x1, y1;
public double x2, y2;

//

Nmero

total

de

rectngulos

// Nombre de la clase
// Constante PI

// Nombre del rectngulo


// Vrtice inferior izquierdo
// Vrtice superior derecho

// Mtodo obtenerNombre
public String obtenerNombre () {
return nombre;
}
// Mtodo establecerNombre
public void establecerNombre (String nom) {
nombre= nom;
}
// Mtodo CalcularSuperficie
public double CalcularSuperficie () {
double area, base, altura;
// Clculo de la base
base= x2-x1;
// Clculo de la altura
altura= y2-y1;
// Clculo del rea
area= base * altura;
// Devolucin del valor de retorno
return area;
}
// Mtodo CalcularPerimetro
public double CalcularPerimetro () {
double perimetro, base, altura;
// Clculo de la base
base= x2-x1;
// Clculo de la altura
altura= y2-y1;
// Clculo del permetro
perimetro= 2*base + 2*altura;
// Devolucin del valor de retorno
return perimetro;
}

39

Desarrollodeclases

// Mtodo desplazar
public void desplazar (double X, double Y) {
// Desplazamiento en el eje X
x1= x1 + X;
x2= x2 + X;
// Desplazamiento en el eje X
y1= y1 + Y;
y2= y2 + Y;
}
// Mtodo obtenerNumRectangulos
public static int obtenerNumRectangulos () {
return numRectangulos;
}
}

40

DAW

DesarrollodeAplicacionesWeb

Tema5

7.Constructores.
CASO PRCTICO.
Mara y Juan ya han creado y utilizado objetos y cuentan con algunos pequeos programas de
ejemplo compuestos por varias clases adems de la clase principal (la que contiene el mtodo main).
Ada ha estado revisando su trabajo y ha quedado muy satisfecha, aunque al observar la estructura
de las clases les ha comentado algo que los ha dejado un poco despistados:
Estas clases tienen muy buena pinta, aunque faltara aadirles algunos constructores para poder
mejorar su flexibilidad a la hora de instanciar objetos, no creis?.
Ambos han asentido porque eran conscientes de que hasta el momento no haban estado incluyendo
constructores en sus clases, estaban aprovechando el constructor por defecto que aada el
compilador.
Parece que ha llegado el momento de aadir nuestros propios constructores, le dice Mara a
Juan.

Comoyahasestudiadoenunidadesanteriores,enelciclodevidadeunobjetosepuedendistinguir
lasfasesde:
9 Construccindelobjeto.
9 Manipulacinyutilizacindelobjetoaccediendoasusmiembros.
9 Destruccindelobjeto.
Comohasvistoenelapartadoanterior,durantelafasedeconstruccinoinstanciacindeunobjeto
es cuando se reserva espacio en memoria para sus atributos y se inicializan algunos de ellos. Un
constructor es un mtodo especial con el mismo nombre de la clase y que se encarga de realizar
esteproceso.
Elprocesodedeclaracinycreacindeunobjetomedianteeloperadornewyahasidoestudiadoen
apartadosanteriores.Sinembargolasclasesquehastaahorahascreadonotenanconstructor.Has
estadoutilizandolosconstructorespordefectoqueproporcionaJavaalcompilarlaclase.Hallegado
elmomentodequeempiecesaimplementartuspropiosconstructores.
Losmtodosconstructoresseencargandellevaracaboelprocesodecreacinoconstruccindeun
objeto.

AUTOEVALUACIN.
Con qu nombre es conocido el mtodo especial de una clase que se encarga de reservar
espacio e inicializar atributos cuando se crea un objeto nuevo? Qu nombre tendr ese
mtodo en la clase?
Mtodo constructor. Su nombre dentro de la clase ser constructor..
Mtodo inicializador. Su nombre dentro de la clase ser el mismo nombre que tenga
la clase..
Mtodo constructor. Su nombre dentro de la clase ser el mismo nombre que tenga la
clase..
Mtodo constructor. Su nombre dentro de la clase ser new.

7.1Conceptodeconstructor.
Unconstructoresunmtodoquetieneelmismonombrequelaclasealaqueperteneceyqueno
devuelveningnvalortrassuejecucin.Sufuncinesladeproporcionarelmecanismodecreacin
deinstancias(objetos)delaclase.

41

Desarrollodeclases

DAW

Cuandounobjetoesdeclarado,enrealidadannoexiste.Tansolosetratadeunnombresimblico
(unavariable)queenelfuturoharreferenciaaunazonadememoriaquecontendrlainformacin
querepresentarealmenteaunobjeto.Paraqueesavariabledeobjetoanvaca(sesueledecir
queesunareferencianulaovaca)apunte,ohagareferenciaaunazonadememoriaquerepresente
a una instancia de clase (objeto) existente, es necesario construir el objeto. Ese proceso se
realizar a travs del mtodo constructor de la clase. Por tanto para crear un nuevo objeto es
necesariorealizaruna llamadaaunmtodoconstructor dela clasealaque perteneceeseobjeto.
Eseprocesoserealizamediantelautilizacindeloperadornew.
Hastaelmomentoyahasutilizadoennumerosasocasioneseloperadornewparainstanciarocrear
objetos. En realidad lo que estabas haciendo era una llamada al constructor de la clase para que
reservaramemoriaparaeseobjetoyportantocrearfsicamenteelobjetoenlamemoria(dotarlo
de existencia fsica dentro de la memoria del ordenador). Dado que en esta unidad ests ya
definiendotuspropiasclases,parecequehallegadoelmomentodequeempiecesaescribirtambin
losconstructoresdetusclases.
Porotrolado,siunconstructoresalfinyalcabounaespeciedemtodo(aunquealgoespecial)y
Javasoportalasobrecargade mtodos,podrasplanteartelasiguientepregunta:podrunaclase
disponerdemsdeconstructor?Enotraspalabras,serposiblelasobrecargadeconstructores?La
respuestaesafirmativa.
Unamismaclasepuededisponerdevariosconstructores.Losconstructoressoportanlasobrecarga.
Esnecesarioquetodaclasetengaalmenosunconstructor.Sinosedefineningnconstructorenuna
clase, el compilador crear por nosotros un constructor por defecto vaco que se encarga de
inicializar todos los atributos a sus valores por defecto (0 para los numricos, null para las
referencias,falseparalosboolean,etc.).
Algunasanalogasquepodrasimaginarpararepresentarelconstructordeunaclasepodranser:
9
9
9
9

Losmoldesdecocinaparaflanes,galletas,pastas,etc.
Uncubodeplayaparacrearcastillosdearena.
Unmoldedeunlingotedeoro.
Unabolsaparahacercubitosdehielo.

Una vez que incluyas un constructor personalizado a una clase, el compilador ya no incluir el
constructor por defecto (sin parmetros) y por tanto si intentas usarlo se producira un error de
compilacin. Si quieres que tu clase tenga tambin un constructor sin parmetros tendrs que
escribirsucdigo(yanoloharportielcompilador)

7.2Creacindeconstructores.
Cuandoseescribeelcdigodeunaclasenormalmentesepretendequelosobjetosdeesaclasese
creendeunadeterminadamanera.Paraellosedefinenunoomsconstructoresenlaclase.Enla
definicindeunconstructorseindican:
9 Eltipodeacceso.
9 Elnombredelaclase(elnombredeunmtodoconstructoressiempreelnombredelapropia
clase).
9 Lalistadeparmetrosquepuedeaceptar.

42

DesarrollodeAplicacionesWeb

9 Silanzaonoexcepciones.
9 Elcuerpodelconstructor(unbloquedecdigocomoeldecualquiermtodo).

Tema5

Comopuedesobservar,laestructuradelosconstructoresessimilaraladecualquiermtodo,conlas
excepcionesdequenotienetipodedatodevuelto(nodevuelveningnvalor)yqueelnombredel
mtodoconstructordebeserobligatoriamenteelnombredelaclase.

REFLEXIONA
Si defines constructores personalizados para una clase, el constructor por defecto (sin
parmetros)paraesaclasedejadesergeneradoporelcompilador,demaneraquetendrs
quecrearlotsiquierespoderutilizarlo.
Sisehacreadounconstructorconparmetrosynosehaimplementadoelconstructorpor
defecto, el intento de utilizacin del constructor por defecto producir un error de
compilacin(elcompiladornoloharpornosotros).
UnejemplodeconstructorparalaclasePuntopodraser:
public Punto (int x, int y)
{
this.x= x;
this.y= y;
cantidadPuntos++; // Suponiendo que tengamos un atributo esttico cantidadPuntos
}

Enestecasoelconstructorrecibedosparmetros.Ademsdereservarespacioparalosatributos(de
locualseencargaautomticamenteJava),tambinasignasendosvaloresinicialesalosatributosxe
y.Porltimoincrementaunatributo(probablementeesttico)llamadocantidadPuntos.

AUTOEVALUACIN.
El constructor por defecto (sin parmetros) est siempre disponible para usarlo en cualquier
clase.
Verdadero
Falso

7.3Utilizacindeconstructores.
Una vez que dispongas de tus propios constructores personalizados, la forma de utilizarlos es
igualque con el constructor por defecto (mediante la utilizacin de la palabra reservada new)
peroteniendo en cuenta que si has declarado parmetros en tu mtodo constructor, tendrs que
llamaralconstructorconalgnvalorparaesosparmetros.
UnejemplodeutilizacindelconstructorquehascreadoparalaclasePuntoenelapartadoanterior
podraser:
Punto p1;
p1= new Punto (10, 7);

En este caso no se estara utilizando el constructor por defecto sino el constructor que acabas de
implementarenelcualademsdereservarmemoriaseasignaunvaloraalgunosdelosatributos.

PARASABERMS.
PuedesecharunvistazoalartculosobreconstructoresdeunaclaseJavaenlosmanualesde
Oracle(eningls):
http://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html

43

Desarrollodeclases

DAW

Tambinpuedesecharunvistazoaestosvdeosqueyasetehanrecomendadoenunidades
anteriores. Ahoraprobablemente comprenders mucho mejor el proceso que se muestra
puesesmsomenosloquehastenidoquehacert:
http://www.youtube.com/watch?v=lhtCbiI8JuE
Resumen:Vdeoenelqueserealizaunadescripcindelaprogramacinorientadaaobjetos.Caracterizacin
deunobjetoyejemplosdesuscaractersticas(comportamiento,estado,identidad).Ejemploenelquesecrea
unaclase en Java: clase ser humano con atributos diversos, mtodos get y set, y constructor. Utilizacin de
lareferenciathis.

TutorialdeJavaenespaolCaptulo14ClasesyObjetos.Parte2.
http://www.youtube.com/watch?v=k92WaQyzVd4
Resumen: Vdeo en el que se contina utilizando la clase ser humano instanciando objetos a travs
delconstructor y aplicando algunos de sus mtodos para observar su comportamiento.

EJERCICIORESUELTO.
AmpliarelejerciciodelaclaseRectanguloaadindoletresconstructores:
1. Un constructor sin parmetros (para sustituir al constructor por defecto) que haga que los
valoresinicialesdelasesquinasdelrectngulosean(0,0)y(1,1);
2. Un constructor con cuatro parmetros, x1, y1, x2, y2, que rellene los valores iniciales de los
atributosdelrectnguloconlosvaloresproporcionadosatravsdelosparmetros.
3. Un constructor con dos parmetros, base y altura, que cree un rectngulo donde el vrtice
inferiorderechoestubicadoenlaposicin(0,0)yquetengaunabaseyunaalturatalycomo
indicanlosdosparmetrosproporcionados.
Respuesta

Enelcasodelprimerconstructorlonicoquehayquehaceresrellenarlosatributosx1,y1,x2,y2
conlosvalores0,0,1,1:
public
{
x1=
y1=
x2=
y2=
}

Rectangulo ()
0.0;
0.0;
1.0;
1.0;

Paraelsegundoconstructoressuficienteconasignaralosatributosx1,y1,x2,y2losvaloresdelos
parmetrosx1, y1, x2, y2. Tan solo hay que tener en cuenta que al tener los mismos nombres los
parmetrosdelmtodoquelosatributosdelaclase,estosltimossonocultadosporlosprimerosy
parapoderteneraccesoaellostendrsqueutilizareloperadordeautorrerferenciathis:
public Rectangulo (double x1, double y1, double x2, double y2)
{
this.x1= x1;
this.y1= y1;
this.x2= x2;
this.y2= y2;
}

Enelcasodeltercerconstructortendrsqueinicializarelvrtice(x1,y1)a(0,0)yelvrtice(x2,y2)a
(0+base,0+altura),esdecira(base,altura):
public Rectangulo (double base, double altura)
{
this.x1= 0.0;
this.y1= 0.0;
this.x2= base;
this.y2= altura;
}

44

DesarrollodeAplicacionesWeb

Tema5

MiraahoraunejemplocompletodondeseamplalaclaseRectanguloconesostresconstructoresy
seutilizanenunprogramadepruebadesdeelsiguienteenlace:
Claseprincipalomain
/*
* Ejemplo de uso de la clase Rectangulo con constructores
*/
package ejemplorectangulos02;
/**
*
* Programa Principal (clase principal)
*/
public class EjemploRectangulos02 {

public static void main(String[] args) {


Rectangulo r1, r2, r3;
System.out.printf ("PRUEBA DE USO DE LA CLASE RECTNGULO\n");
System.out.printf ("------------------------------------\n\n");
System.out.printf ("Creando rectngulos...\n\n");
r1= new Rectangulo ();
r2= new Rectangulo (1,1, 3,3);
r3= new Rectangulo (10, 5);

System.out.printf ("Recngulo r1: \n");


System.out.printf ("r1.x1: %4.2f\nr1.y1: %4.2f\n",
System.out.printf ("r1.x2: %4.2f\nr1.y2: %4.2f\n",
System.out.printf
("Perimetro:
%4.2f\nSuperficie:
r1.CalcularSuperficie());
System.out.printf ("Recngulo r2: \n");
System.out.printf ("r2.x1: %4.2f\nr2.y1: %4.2f\n",
System.out.printf ("r2.x2: %4.2f\nr2.y2: %4.2f\n",
System.out.printf
("Perimetro:
%4.2f\nSuperficie:
r2.CalcularSuperficie());
System.out.printf ("Recngulo r3: \n");
System.out.printf ("r3.x1: %4.2f\nr3.y1: %4.2f\n",
System.out.printf ("r3.x2: %4.2f\nr3.y2: %4.2f\n",
System.out.printf
("Perimetro:
%4.2f\nSuperficie:
r3.CalcularSuperficie());

r1.x1, r1.y1);
r1.x2, r1.y2);
%4.2f\n",
r1.CalcularPerimetro(),

r2.x1, r2.y1);
r2.x2, r2.y2);
%4.2f\n",
r2.CalcularPerimetro(),

r3.x1, r3.y1);
r3.x2, r3.y2);
%4.2f\n",
r3.CalcularPerimetro(),

}
}

ClaseRectangulo
package ejemplorectangulos02;
/**---------------------------------------------------------------* Clase Rectangulo.
* Incluye constructores.
----------------------------------------------------------------*/
public class Rectangulo {
// Atributos de clase (estticos)
private static int numRectangulos;
creados
public static final String nombreFigura= "Rectngulo";
public static final double PI= 3.1416;
// Atributos de objeto
private String nombre;
public double x1, y1;
public double x2, y2;

//

Nmero

total

de

rectngulos

// Nombre de la clase
// Constante PI

// Nombre del rectngulo


// Vrtice inferior izquierdo
// Vrtice superior derecho

//----------------// Constructores
//----------------public Rectangulo ()
{

45

Desarrollodeclases

x1=
y1=
x2=
y2=
}

0.0;
0.0;
1.0;
1.0;

public Rectangulo (double x1, double y1, double x2, double y2)
{
this.x1= x1;
this.y1= y1;
this.x2= x2;
this.y2= y2;
}
public Rectangulo (double base, double altura)
{
this.x1= 0.0;
this.y1= 0.0;
this.x2= base;
this.y2= altura;
}
//------------------------------// Mtodos estticos (de clase)
//------------------------------// Mtodos de estticos pblicos
// ----------------------------// Mtodo obtenerNumRectangulos
public static int obtenerNumRectangulos () {
return numRectangulos;
}
//------------------// Mtodos de objeto
//------------------//Mtodos pblicos
//----------------// Mtodo obtenerNombre
public String obtenerNombre () {
return nombre;
}
// Mtodo establecerNombre
public void establecerNombre (String nom) {
nombre= nom;
}
// Mtodo CalcularSuperficie
public double CalcularSuperficie () {
double area, base, altura;
// Clculo de la base
base= x2-x1;
// Clculo de la altura
altura= y2-y1;
// Clculo del rea
area= base * altura;
// Devolucin del valor de retorno
return area;
}
// Mtodo CalcularPerimetro
public double CalcularPerimetro () {
double perimetro, base, altura;
// Clculo de la base
base= x2-x1;
// Clculo de la altura
altura= y2-y1;

46

DAW

DesarrollodeAplicacionesWeb

Tema5

// Clculo del permetro


perimetro= 2*base + 2*altura;
// Devolucin del valor de retorno
return perimetro;
}
// Mtodo desplazar
public void desplazar (double X, double Y) {
// Desplazamiento en el eje X
x1= x1 + X;
x2= x2 + X;
// Desplazamiento en el eje X
y1= y1 + Y;
y2= y2 + Y;
}
}

7.4Constructoresdecopia.
Una forma de iniciar un objeto podra ser mediante la copia de los valores de los atributos deotro
objeto ya existente. Imagina que necesitas varios objetos iguales (con los mismosvalores en sus
atributos) y que ya tienes uno de ellos perfectamente configurado (susatributos contienen los
valoresquetnecesitas).Estarabiendisponerdeunconstructorquehicieracopiasidnticasdeese
objeto.
Duranteelprocesodecreacindeunobjetopuedesgenerarobjetosexactamenteiguales(basados
en la misma clase) que se distinguirn posteriormente porque podrn tener estados distintos
(valoresdiferentes en los atributos). La idea es poder decirle a la clase que adems de generar un
objetonuevo,quelohagaconlosmismosvaloresquetengaotroobjetoyaexistente.Esdecir,algo
ascomosipudierasclonarelobjetotantasvecescomotehagafalta.Aestetipodemecanismosele
suelellamarconstructorcopiaoconstructordecopia.
Un constructor copia es un mtodo constructor como los que ya has utilizado pero con la
particularidad de querecibe como parmetro una referencia al objeto cuyo contenido se desea
copiar.Estemtodorevisacadaunodelosatributosdelobjetorecibidocomoparmetroysecopian
todos sus valores en los atributos del objeto que seest creando en ese momento en el mtodo
constructor.
UnejemplodeconstructorcopiaparalaclasePuntopodraser:
public Punto (Punto p)
{
this.x= p.obtenerX();
this.y= p.obtenerY();
}

En este caso el constructor recibe como parmetro un objeto del mismo tipo que el que va a ser
creado (clasePunto), inspecciona el valor de sus atributos (atributos x e y), y los reproduce en los
atributosdelobjetoenprocesodeconstruccin(this).
Unejemplodeutilizacindeeseconstructorpodraser:
Punto p1, p2;
p1= new Punto (10, 7);
p2= new Punto (p1);

47

Desarrollodeclases

Enestecasoelobjetop2secreaapartirdelosvaloresdelobjetop1.

DAW

AUTOEVALUACIN.
Toda clase debe incluir un constructor copia en su implementacin. Verdadero o falso?
Verdadero
Falso

EJERCICIORESUELTO.
AmpliarelejerciciodelaclaseRectanguloaadindoleunconstructorcopia.
Respuesta

Setratadeaadirunnuevoconstructorademsdelostresqueyahabamoscreado:
// Constructor copia
public Rectangulo (Rectangulo r) {
this.x1= r.x1;
this.y1= r.y1;
this.x2= r.x2;
this.y2= r.y2;
}

Para usar este constructor basta con haber creado anteriormente otro Rectangulo para utilizarlo
comobasedelacopia.Porejemplo:
Rectangulo r1, r2;
r1= new Rectangulo (0,0,2,2);
r2= new Rectangulo (r1);

7.5Destruccindeobjetos.
Comoyahasestudiadoenunidadesanteriores,cuandounobjetodejadeserutilizado,losrecursos
usados por l (memoria, acceso a archivos, conexiones con bases de datos, etc.) deberande ser
liberadosparaquepuedanvolveraserutilizadosporotrosprocesos(mecanismodedestruccindel
objeto).
Mientras que de la construccin de los objetos se encargan los mtodos constructores, de la
destruccin seencarga un proceso del entorno de ejecucin conocido como recolector de basura
(garbage collector). Esteproceso va buscando peridicamente objetos que ya no son referenciados
(nohayningunavariablequehagareferenciaaellos)ylosmarcaparasereliminados.Posteriormente
losireliminandodelamemoriacuandoloconsidereoportuno(enfuncindelacargadelsistema,
losrecursosdisponibles,etc.).
Normalmente se suele decir que en Java no hay mtodo destructor y que en otros lenguajes
orientados a objetoscomo C++, s se implementa explcitamente el destructor de una clase de la
mismamaneraquesedefineelconstructor.EnrealidadenJavatambinesposibleimplementarel
mtododestructordeunaclase,setratadelmtodofinalize().
Estemtodofinalizeesllamadoporelrecolectordebasuracuandovaadestruirelobjeto(locual
nuncasesabecundovaasucederexactamente,puesunacosaesqueelobjetoseamarcadopara
ser borrado y otra que seaborrado efectivamente). Si ese mtodo no existe, se ejecutar un
destructorpordefecto(elmtodofinalizequecontienelaclaseObject,delacualheredantodaslas
clases en Java) que liberar la memoria ocupada por elobjeto. Se recomienda por tanto que si un
objetoutilizadeterminadosrecursosdeloscualesnotienesgarantaqueelentornodeejecucinlos
vayaaliberar(cerrararchivos,cerrarconexionesdered,cerrarconexionesconbasesdedatos,etc.),

48

DesarrollodeAplicacionesWeb

Tema5

implementesexplcitamenteunmtodofinalizeentusclases.Sielnicorecursoqueutilizatuclase
es la memoria necesaria para albergar sus atributos, eso s ser liberado sin problemas. Pero si
setratadealgomscomplejo,sermejorqueteencarguestmismodehacerloimplementandotu
destructorpersonalizado(finalize).
Porotrolado,estaformadefuncionardelentornodeejecucindeJava(destruccindeobjetosno
referenciadosmedianteelrecolectordebasura)implicaquenopuedassaberexactamentecundoun
objetovaaserdefinitivamentedestruido,puessiunavariabledejadeserreferenciada(secierrael
mbitodeejecucindondefuecreada)noimplicanecesariamentequeseainmediatamenteborrada,
sinoquesimplementeesmarcadaparaqueelrecolectorlaborrecuandopuedahacerlo.
Sienunmomentodadofueranecesariogarantizarqueelprocesodefinalizacin(mtodofinalize)
seainvocado,puedesrecurriralmtodorunFinalization()delaclaseSystemparaforzarlo:
System.runFinalization ();

Estemtodoseencargadellamaratodoslosmtodosfinalizedetodoslosobjetosmarcadosporel
recolectordebasuraparaserdestruidos.
Si necesitas implementar un destructor (normalmente no ser necesario), debes tener en cuenta
que:
9 Elnombredelmtododestructordebeserfinalize().
9 Nopuederecibirparmetros.
9 Slo puede haber un destructor en una clase. No es posible la sobrecarga dado que no tiene
parmetros.
9 Nopuededevolverningnvalor.Debeserdetipovoid.

AUTOEVALUACIN.
Cuando se abandona el mbito de un objeto en Java ste es marcado por el recolector de
basura para serdestruido. En muchas ocasiones una clase Java no tiene un mtodo destructor,
pero si fuera necesario hacerlopodras implementar un mtodo destructor en una clase Java?
Qu nombre habra que ponerle?
S es posible. El nombre del mtodo sera finalize().
No es posible disponer de un mtodo destructor en una clase Java.
S es posible. El nombre del mtodo sera destructor ().
S es posible. El nombre del mtodo sera ~nombreClase, como en el lenguaje C

49

Desarrollodeclases

DAW

8.Introduccinalaherencia.
CASO PRCTICO.
Mara y Juan ya han implementado algunos objetos con atributos y mtodos tanto de objeto como de
clase (estticos), les han incluido constructores y los han utilizado desde otros objetos. Se consideran
relativamente competentes para empezar a desarrollar pequeas aplicaciones basadas en la
metodologa de la Programacin Orientada a Objetos. Ada sigue muy satisfecha con estos avances
y los ha felicitado por su esfuerzo. Pero tambin les ha dicho lo siguiente:
Perfecto, ya sabis trabajar con clases y con objetos, y cmo utilizar sus mtodos, sus atributos y
sus constructores. Sois capaces de trabajar con la sobrecarga y conocis conceptos tales como
encapsulacin, visibilidad u ocultacin de informacin. An nos quedan por ver algunos conceptos
ms dentro de la Programacin Orientada a Objetos. Los iremos viendo poco a poco Por ejemplo,
habis odo hablar alguna vez sobre la herencia?

La herencia es uno de los conceptos


fundamentales
que
introduce
la
programacin orientada a objetos. La idea
fundamental es permitir crear nuevas clases
aprovechando las caractersticas (atributos y
mtodos)deotrasclasesyacreadasevitando
as tener que volver a definir esas
caractersticas(reutilizacin).
A una clase que hereda de otra se le llama
subclase o clase hija y aquella de la que se
heredaesconocidacomosuperclaseoclase
padre. Tambin se puede hablar en general de clases descendientes o clases ascendientes. Al
heredar, la subclase adquiere todas las caractersticas (atributos y mtodos) de su superclase,
aunque algunas de ellas pueden ser sobrescritas o modificadas dentro de la subclase (a eso se le
suelellamarespecializacin).
Unaclasepuedeheredardeotraqueasuvezhapodidoheredardeunatercerayassucesivamente.
Estosignificaquelasclasesvantomandotodaslascaractersticasdesusclasesascendientes(noslo
de su superclase o clase padre inmediata) a lo largo de toda la rama del rbol de la jerarqua de
clasesenlaqueseencuentre.
Imaginaquequieresmodelarelfuncionamientodealgunosvehculosparatrabajarconellosenun
programa de simulacin. Lo primero que haces es pensar en una clase Vehculo que tendr un
conjuntodeatributos(porejemplo:posicinactual,velocidadactualyvelocidadmximaquepuede
alcanzar el vehculo) y de mtodos (por ejemplo: detener, acelerar, frenar, establecerDireccin,
establecersentido).
Dado que vas a trabajar con muchos tipos de vehculos, no tendrs suficiente con esas
caractersticas, as que seguramente vas a necesitar nuevas clases que las incorporen. Pero las
caractersticas bsicas que has definido en la clase Vehculo van a ser compartidas por cualquier
nuevo vehculo que vayas a modelar. Esto significa que si creas otra clase podras heredar de
Vehculotodasesosatributosypropiedadesytansolotendrasqueaadirlasnuevas.
Si vas a trabajar con vehculos que se desplazan por tierra, agua y aire, tendrs que idear nuevas
clases con caractersticas adicionales. Por ejemplo, podras crear una clase VehiculoTerrestre, que
herede las caractersticas de Vehculo, pero que tambin incorpore atributos como el nmero de

50

DesarrollodeAplicacionesWeb

Tema5

ruedas o la altura de los bajos). A su vez, podra idearse una nueva clase que herede de
VehiculoTerrestreyqueincorporenuevosatributosymtodoscomo,porejemplo,unaclaseCoche.
Y as sucesivamente con toda la jerarqua de clases heredadas que consideres oportunas para
representarlomejorposibleelentornoylainformacinsobrelaquevanatrabajartusprogramas.

8.1Creacinyutilizacindeclasesheredadas.
CmoseindicaenJavaqueunaclaseheredadeotra?Paraindicarqueunaclaseheredadeotraes
necesarioutilizarlapalabrareservadaextendsjuntoconelnombredelaclasedelaquesequieren
heredarsuscaractersticas:
class<NombreClase> extends <nombreSuperClase> {
...
}

Enelejemploanteriordelosvehculos,laclaseVehiculoTerrestrepodraquedarasalserdeclarada:
class VehiculoTerrestre extends Vehculo {
...
}

YenelcasodelaclaseCoche:
class Coche extends VehculoTerrestre {
...
}

En unidades posteriores estudiars detalladamente cmo crear una jerarqua de clases y qu


relacin existe entre la herencia y los distintos modificadores de clases, atributos y mtodos. Por
ahoraessuficienteconqueentiendaselconceptodeherenciaysepasreconocercundounaclase
heredadeotra(usodelapalabrareservadaextends).
Puedes comprobar que en las bibliotecas proporcionadas por Java aparecen jerarquas bastante
complejasdeclasesheredadasenlascualessehanidoaprovechandocadaunodelosmiembrosde
unaclasebaseparairconstruyendolasdistintasclasesderivadasaadiendo(yavecesmodificando)
pocoapoconuevafuncionalidad.
Esosuelesucederencualquierproyectodesoftwareconformesevanaanalizando,descomponiendo
y modelando los datos con los que hay que trabajar. La idea es poder representar de una manera
eficiente toda la informacin que es manipulada por el sistema que se desea automatizar. Una
jerarquadeclasessueleserunabuenaformadehacerlo.
EnelcasodeJava,cualquierclaseconlaquetrabajestendrunascendiente.Sienladeclaracinde
clasenoindicaslaclasedelaquesehereda(noseincluye unextends),el compiladorconsiderar
automticamente que se hereda de la clase Object, que es la clase que se encuentra en el nivel
superiordetodalajerarquadeclasesenJava(yqueeslanicaquenoheredadenadie).
TambinirsviendoalestudiardistintoscomponentesdelasbibliotecasdeJava(porejemploenel
caso de las interfaces grficas) que para poder crear objetos basados en las clases proporcionadas
poresasbibliotecastendrsquecreartuspropiasclasesqueheredendealgunasdeesasclases.Para
ellostendrsquehacerusodelapalabrareservadaextends.
EnJavatodaslasclasessondescendientes(demaneraexplcitaoimplcita)delaclaseObject.

AUTOEVALUACIN.
De qu objeto hereda cualquier clase en Java?

51

Desarrollodeclases

Exception
Object
Element
Ninguno de los anteriores

52

DAW

DesarrollodeAplicacionesWeb

Tema5

9.Empaquetadodeclases.
CASO PRCTICO.
Mara y Juan ya han terminado por ahora de escribir todas las clases que haban diseado.
Es el momento de organizar adecuadamente todo el cdigo que tienen implementado a lo largo de
todas esas clases. Mara recuerda que hace algunos das Juan ya le habl de la posibilidad de
organizar las clases en paquetes:
Este sera un buen momento para poner en prctica todo aquello que me enseaste sobre los
paquetes, no?
La verdad es que tienes razn. Esto hay que organizarlo un poco Le contesta Juan.

La encapsulacin de la informacin dentro de las clases ha permitido llevar a cabo el proceso de


ocultacin,queesfundamentalparaeltrabajoconclasesyobjetos.Esposiblequeconformevaya
aumentando la complejidad de tus aplicaciones necesites que algunas de tus clases puedan tener
accesoapartedelaimplementacindeotrasdebidoalasrelacionesqueseestablezcanentreellasa
la hora de disear tu modelo de datos. En estos casos se puede hablar de un nivel superior de
encapsulamientoyocultacinconocidocomoempaquetado.
Un paquete consiste en un conjunto de clases relacionadas entre s y agrupadas bajo un mismo
nombre.Normalmenteseencuentran enunmismopaquete todasaquellasclasesqueformanuna
bibliotecaoquerenenalgntipodecaractersticaencomn.Estolaorganizacindelasclasespara
luegolocalizarfcilmenteaquellasquevayasnecesitando.

9.1Jerarquadepaquetes.
Los paquetes en Java pueden organizarse jerrquicamente de manera similar a lo que puedes
encontrarenlaestructuradecarpetasenundispositivodealmacenamiento,donde:
9 Lasclasesserancomolosarchivos.
9 Cadapaqueteseracomounacarpetaquecontienearchivos(clases).
9 Cada paquete puede adems contener otros paquetes (como las carpetas que contienen
carpetas).
9 Parapoderhacerreferenciaaunaclasedentrodeunaestructuradepaquetes,habrqueindicar
la trayectoria completa desde el paquete raz de la jerarqua hasta el paquete en el que se
encuentra la clase, indicando por ltimo el nombre de la clase (como el path absoluto de un
archivo).
La estructura de paquetes en Java permite organizar y clasificar las clases, evitando conflictos de
nombresyfacilitandolaubicacindeunaclasedentrodeunaestructurajerrquica.
Porotrolado,laorganizacinenpaquetespermitetambinelcontroldeaccesoamiembrosdelas
clases desde otras clases que estn en el mismo paquete gracias a los modificadores de acceso
(recuerdaqueunodelosmodificadoresquevisteeraprecisamenteeldepaquete).
LasclasesqueformanpartedelajerarquadeclasesdeJavaseencuentranorganizadasendiversos
paquetes.
Todas las clases proporcionadas por Java en sus bibliotecas son
miembros de distintos paquetes y se encuentran organizadas
jerrquicamente.Dentrodecadapaquetehabrunconjuntode
clasesconalgntipoderelacinentreellas.Sedicequetodoese
conjunto de paquetes forman la API de Java. Por ejemplo las

53

Desarrollodeclases

DAW

clases bsicas del lenguaje se encuentran en el paquete java.lang, las clases de entrada/salida las
podrs encontrar en el paquete java.io y en el paquete java.math podrs observar algunas clases
paratrabajarconnmerosgrandesydegranprecisin.
RECOMENDACIN.
En la unidad dedicada a la utilizacin de objetos, se hizo una descripcin general de los paquetes
ms importantes ofrecidos por el lenguaje Java. Puede ser un buen momento para volver a echarles
un vistazo.

PARASABERMS.
Puedes echar un vistazo a toda la jerarqua de paquetes de la API de Java en la
documentacinoficialdeOracle(eningls):
http://docs.oracle.com/javase/7/docs/api/index.html

9.2Utilizacindelospaquetes.
Esposibleaccederacualquierclasedecualquierpaquete(siemprequeesepaqueteestdisponible
en nuestro sistema, obviamente) mediante la calificacin completa de la clase dentro de la
estructura jerrquica de paquete. Es decir indicando la trayectoria completa de paquetes desde el
paquete raz hasta la propia clase. Eso se puede hacer utilizando el operador punto (.) para
especificarcadasubpaquete:
paquete_raiz.subpaquete1.subpaquete2. .subpaquete_n.NombreClase

Porejemplo:java.lang.String.
En este caso se est haciendo referencia a la clase String que se encuentra dentro del paquete
java.lang.EstepaquetecontienelasclaseselementalesparapoderdesarrollarunaaplicacinJava.
Otroejemplopodraser:java.util.regex.Patern.
En este otro caso se hace referencia a la clase Patern ubicada en el paquete java.util.regex, que
contieneclasesparatrabajarconexpresionesregulares.
Dado que puede resultar bastante tedioso tener que escribir la trayectoria completa de una clase
cadavezquesequierautilizar,existelaposibilidaddeindicarquesedeseatrabajarconlasclasesde
unoovariospaquetes.Deesamaneracuandosevayaautilizarunaclasequepertenezcaaunode
esospaquetesnosernecesarioindicartodasutrayectoria.Paraelloseutilizalasentenciaimport
(importar):
import paquete_raiz.subpaquete1.subpaquete2. .subpaquete_n.NombreClase;

De esta manera a partir de ese momento podr utilizarse directamente NombreClase en lugar de
todasutrayectoriacompleta.
Losejemplosanterioresquedaranentonces:
import java.lang.String;
import java.util.regex.Patern;

Sisuponemosquevamosautilizarvariasclasesdeunmismopaquete,enlugardehacerunimport
de cada una de ellas, podemos utilizar el comodn (smbolo asterisco: *) para indicar que
queremosimportartodaslasclasesdeesepaqueteynoslounadeterminada:
import java.lang.*;
import java.util.regex.*;

54

DesarrollodeAplicacionesWeb

Tema5

Siunpaquetecontienesubpaquetes,elcomodnnoimportarlasclasesdelossubpaquetes,tansolo
lasquehayaenelpaquete.Laimportacindelasclasescontenidasenlossubpaqueteshabrque
indicarlaexplcitamente.Porejemplo:
import java.util.*;
import java.util.regex.*;

Enestecasoseimportarntodaslasclasesdelpaquetejava.util(clasesDate,Calendar,Timer,etc.)y
de su subpaquete java.util.regex (Matcher y Pattern), pero las de otros subpaquetes como
java.util.concurrentojava.util.jar.
Por ltimo tan solo indicar que en el caso del paquete java.lang, no es necesario realizar
importacin. El compilador, dada la importancia de este paquete, permite el uso de sus clases sin
necesidad de indicar su trayectoria (es como si todo archivo Java incluyera en su primera lnea la
sentenciaimportjava.lang.*).

AUTOEVALUACIN.
La sentencia import nos facilita las cosas a la hora de especificar las clases que queremos
utilizar en nuestro archivo Java. Con el uso del comodn (asterisco) podemos importar todas
las clases y subpaquetes que se encuentran en un determinado paquete a travs de una sola
sentencia import.
Verdadero
Falso

9.3Inclusindeunaclaseenunpaquete.
Al principio de cada archivo .java se puede indicar a qu paquete pertenece mediante la
palabrareservadapackage seguida del nombre del paquete:
package nombre_paquete;

Porejemplo:
package paqueteEjemplo;
class claseEjemplo {

Lasentenciapackagedebeserincluidaencadaarchivofuentedecadaclasequequierasincluirese
paquete.Sienunarchivofuentehaydefinidasmsdeunaclase,todasesasclasesformarnpartedel
paqueteindicadoenlasentenciapackage.
Si al comienzo de un archivo Java no se incluyen ninguna sentencia package, el compilador
considerar que lasclases de ese archivo formarn parte del paquete por omisin (un paquete sin
nombreasociadoalproyecto).
Para evitar la ambigedad, dentro de un mismo paquete no puede haber dos clases con el mismo
nombre,aunque s pueden existir clases con el mismo nombre si estn en paquetes diferentes. El
compiladorsercapazdedistinguirunaclasedeotragraciasaquepertenecenapaquetesdistintos.
Como ya has visto en unidades anteriores, el nombre de un archivo fuente en Java se construye
utilizando elnombre de la clase pblica que contiene junto con la extensin .java, pudiendo haber
nicamente una clasepblica por cada archivo fuente. El nombre de la clase deba coincidir (en
maysculasyminsculas)exactamenteconelnombredelarchivoenelqueseencontrabadefinida.

55

Desarrollodeclases

DAW

As,siporejemplotenasunaclasePuntodentrodeunarchivoPunto.java,lacompilacindaralugar
aunarchivoPunto.class.
Enelcasodelospaquetes,lacorrespondenciaesaniveldedirectoriosocarpetas.Esdecir,silaclase
Puntoseencuentradentrodelpaqueteprog.figuras,elarchivoPunto.javadeberaencontrarseenla
carpetaprog\figuras. Para que esto funcione correctamente el compilador ha de ser capaz de
localizartodoslospaquetes(tantolosestndardeJavacomolosdefinidosporotrosprogramadores).
Es decir, que el compiladordebe tener conocimiento de dnde comienza la estructura de carpetas
definidaporlospaquetesyenlacualseencuentranlasclases.ParaelloseutilizaelClassPathcuyo
funcionamientohabrsestudiadoenlasprimerasunidadesdeestemdulo.Setratadeunavariable
deentornoquecontienetodaslasrutasenlasquecomienzanlasestructurasdedirectorios(distintas
jerarquasposiblesdepaquetes)enlasqueestncontenidaslasclases.

9.4Procesodecreacindeunpaquete.
ParacrearunpaqueteenJavaterecomendamosseguirlossiguientespasos:
1. Ponerunnombrealpaquete.SueleserhabitualutilizareldominiodeInternetdelaempresa
que hacreado el paquete. Por ejemplo, para el caso de miempresa.com, podra utilizarse un
nombredepaquetecom.miempresa.
2. Crear una estructura jerrquica de carpetas equivalente a la estructura de subpaquetes. La
rutadelarazdeesaestructurajerrquicadeberestarespecificadaenelClassPathdeJava.
3. Especificaraqupaquetepertenecenlaclase(oclases)deelarchivo.javamedianteelusode
lasentenciapackagetalycomohasvistoenelapartadoanterior.
Este proceso ya lo has debido de llevar a cabo en unidades anteriores al compilar y ejecutarclases
conpaquetes.Estospasossimplementesonparaquetesirvancomorecordatoriodelprocedimiento
quedebesseguiraalahoradeclasificar,jerarquizaryutilizartuspropiasclases.

56

TEMA6

INDICE
1.Introduccin.......................................................................................................................................4
1.1.Excepciones.................................................................................................................................................4

2.Conceptodeflujo...............................................................................................................................6
Sockets..............................................................................................................................................................................6
Quesunsocket?..............................................................................................................................................................................6
Tiposdesocket..................................................................................................................................................................................6
ClaseSocket.......................................................................................................................................................................................7
ServiciosdelaclaseSocket................................................................................................................................................................7
ClaseServerSocket.............................................................................................................................................................................7
ServiciosdelaclaseServerSocket......................................................................................................................................................7
Comunicacinentreclienteservidor.................................................................................................................................................8
ClaseDatagramSocket.......................................................................................................................................................................8
ServiciosdelaclaseDatagramSocket................................................................................................................................................8
ClaseDatagramPacket.......................................................................................................................................................................8

Threads..............................................................................................................................................................................9
Quesunthread?............................................................................................................................................................................9
Quganamos?.................................................................................................................................................................................9
AtributosdeunthreadenJAVA.........................................................................................................................................................9
ClaseThread......................................................................................................................................................................................9
ServiciosdelaclaseThread.............................................................................................................................................................10
EstadosdeunThread......................................................................................................................................................................10
Sincronizacin..................................................................................................................................................................................10

Ejemplo:Unchat..............................................................................................................................................................11
Servidor.java....................................................................................................................................................................................11
Flujo.java.........................................................................................................................................................................................11
Cliente.java......................................................................................................................................................................................12

3.Clasesrelativasaflujos....................................................................................................................14
3.1.Ejemplocomentadodeunaclaseconflujos.............................................................................................15

4.Flujos................................................................................................................................................16
4.1.Flujospredefinidos.Entradaysalidaestndar.........................................................................................16
4.2.Flujospredefinidos.Entradaysalidaestndar.Ejemplo..........................................................................17
4.3.Flujosbasadosenbytes............................................................................................................................18
4.4.Flujosbasadosencaracteres....................................................................................................................19
4.5.Rutasdelosficheros.................................................................................................................................20

5.Trabajandoconficheros...................................................................................................................21
5.1.Escrituraylecturadeinformacinenficheros.........................................................................................21
5.2.Ficherosbinariosyficherosdetexto(I)....................................................................................................22
5.2.1.Ficherosbinariosyficherosdetexto(II)..............................................................................................................23

5.3.Modosdeacceso.Registros......................................................................................................................25
5.4.Accesosecuencial.....................................................................................................................................25
5.5.Accesoaleatorio........................................................................................................................................27

6.Aplicacionesdelalmacenamientodeinformacinenficheros.......................................................29
7.Utilizacindelossistemasdeficheros............................................................................................30
7.1.ClaseFile...................................................................................................................................................30
7.2.InterfaceFilenameFilter............................................................................................................................31
7.3.Creacinyeliminacindeficherosydirectorios......................................................................................32

8.Almacenamientodeobjetosenficheros.Persistencia.Serializacin..............................................34
8.1.Serializacin:utilidad................................................................................................................................34

Almacenandodatos

DAW

DesarrollodeAplicacionesWeb

Tema6

Almacenandodatos.
Caso prctico
Ada est repasando los requisitos de la aplicacin informtica que estn desarrollando para la clnica
veterinaria.
En particular, ahora mismo se est centrando en estudiar las necesidades respecto al
almacenamiento de datos. Ada piensa que hay ciertas partes de la aplicacin que no necesitan una
base de datos para guardar los datos, y sera suficiente con emplear ficheros. Por ejemplo, para
guardar datos de configuracin de la aplicacin.
Tras repasar, se rene con Mara y Juan para planificar adecuadamente el tema de los ficheros que
van a usar en la aplicacin, ya que es un asunto muy importante, que no deben dejar aparcado por
ms tiempo.
Precisamente Antonio, que cada vez est ms entusiasmado con la idea de estudiar algn ciclo, de
momento, est matriculado y cursando el mdulo de Programacin, y est repasando para el examen
que tiene la semana que viene, uno de los temas que le "cae" es precisamente el de almacenamiento
de informacin en ficheros.

Almacenandodatos

DAW

1.Introduccin.
Cuandodesarrollasprogramas,enlamayoradeelloslosusuariospuedenpedirlealaaplicacinque
realicecosasypuedasuministrarledatosconlosquesequierehaceralgo.Unavezintroducidoslos
datos y las rdenes, se espera que el programa manipule de alguna forma esos datos, para
proporcionarunarespuestaalosolicitado.

Adems, normalmente interesa que el programa guarde los datos que se le han introducido, de
formaquesielprogramatermina,losdatosnosepierdanypuedanserrecuperadosenunasesin
posterior. La forma ms normal de hacer esto es mediante la utilizacin de ficheros, que se
guardarnenundispositivodememorianovoltil(normalmenteundisco).

Portanto,sabemosqueelalmacenamientoenvariablesovectores(arrays)estemporal,losdatosse
pierden en las variables cuando estn fuera de su mbito o cuando el programa termina. Las
computadorasutilizanficherosparaguardarlosdatos,inclusodespusdequeelprogramatermine
suejecucin.Sesueledenominaralosdatosqueseguardanenficherosdatospersistentes,porque
existen,persistenmsalldelaejecucindelaaplicacin.Losordenadoresalmacenanlosficheros
enunidadesdealmacenamientosecundariocomodiscosduros,discospticos,etc.Enestaunidad
veremoscmohacerconJavaestasoperacionesdecrear,actualizaryprocesarficheros.

Atodasestasoperaciones,queconstituyenunflujodeinformacindelprogramaconelexterior,se
lesconocecomoEntrada/Salida(E/S).

Distinguimos dos tipos de E/S: la E/S estndar que se realiza con el terminal del usuario y la E/S a
travsdeficheros,enlaquesetrabajaconficherosdedisco.

TodaslasoperacionesdeE/SenJavavienenproporcionadasporelpaqueteestndardelAPIdeJava
denominado java.io que incorpora interfaces, clases y excepciones para acceder a todo tipo de
ficheros.

El contenido de un archivo puede interpretarse como campos y registros (grupos de campos),


dndoleunsignificadoalconjuntodebitsqueenrealidadposee.

Parasaberms
A continuacin puedes ampliar tusconocimientos sobre Entrada y Salida en general, enel
mundodelainformtica.Versqueesunbastotemaloqueabarca.
EntradaySalida.

http://exa.unne.edu.ar/depar/areas/informatica/SistemasOperativos/SO5.htm

1.1.Excepciones.
Cuando se trabaja con archivos, es normal que pueda haber errores, por ejemplo: podramos
intentar leer un archivo que no existe, o podramos intentar escribir en un archivo para el que no
tenemospermisosdeescritura.Paramanejartodosestoserroresdebemosutilizarexcepciones.Las
dosexcepcionesmscomunesalmanejararchivosson:
9 FileNotFoundException:Sinosepuedeencontrarelarchivo.
9 IOException:Sinosetienenpermisosdelecturaoescrituraosielarchivoestdaado.
Unesquemabsicodeusodelacapturaytratamientodeexcepcionesenunprograma,podraser
este,importandoelpaquetejava.io.IOException:
importjava.io.IOException;
// ...
public static void main(String[] args) {

DesarrollodeAplicacionesWeb

Tema6

try {
// Se ejecuta algo que puede producir una excepcin
} catch (FileNotFoundException e) {
// manejo de una excepcin por no encontrar un archivo
} catch (IOException e) {
// manejo de una excepcin de entrada/salida
} catch (Exception e) {
// manejo de una excepcin cualquiera
} finally {
// cdigo a ejecutar haya o no excepcin
}
}

Seala la opcin correcta:


Java no ofrece soporte para excepciones.
Un campo y un archivo es lo mismo.
Si se intenta abrir un archivo que no existe, entonces saltar una excepcin.
Ninguna es correcta.

EnelsiguienteenlacehayunmanualmuyinteresantedeJava.Puedesconsultardesdeel
ndice,msinformacinsobrelasexcepcionesenJava.
ExcepcionesenJava.http://www.webtaller.com/manual-java/indice_manual_java.php

Almacenandodatos

DAW

2.Conceptodeflujo.
Caso prctico
Antonio est estudiando un poco antes de irse a dormir. Se ha tomado un vaso de leche con cacao y
est repasando el concepto de flujo. Entenderlo al principio, cuando lo estudi por primera vez, le
cost un poco, pero ya lo entiende a la perfeccin y piensa que si le sale alguna pregunta en el
examen de la semana que viene, sobre esto, seguro que la va a acertar.

LaclaseStreamrepresentaunflujoocorrientededatos,
es decir, un conjunto secuencial de bytes, como puede
ser un archivo, un dispositivo de entrada/salida (en
adelante E/S), memoria, un conector TCP/IP (Protocolo
deControldeTransmisin/ProtocolodeInternet),etc.
CualquierprogramarealizadoenJavaquenecesitellevar
a cabo una operacin de entrada salida lo har a travs
deunstream.

Un flujo es una abstraccin de aquello que produzca o


consumainformacin.Esunaentidadlgica.

Las clases y mtodos de E/S que necesitamos emplear son las mismas independientemente del
dispositivoconelqueestemosactuando,luego,elncleodeJava,sabrsitienequetratarconel
teclado, el monitor, un sistema de archivos o un socket de red liberando al programador de tener
quesaberconquinestinteractuando.
LavinculacindeunflujoaldispositivofsicolahaceelsistemadeentradaysalidadeJava.

En resumen, ser el flujo el que tenga que comunicarse con el sistema operativo concreto y
"entendrselas"conl.Deestamanera,notenemosquecambiarabsolutamentenadaennuestra
aplicacin,quevaaserindependientetantodelosdispositivosfsicosdealmacenamientocomodel
sistemaoperativosobreelqueseejecuta.Estoesprimordialenunlenguajemultiplataformaytan
altamenteportablecomoJava.

Seala la opcin correcta:


La clase Stream puede representar, al instanciarse, a un archivo.
Si programamos en Java, hay que tener en cuenta el sistema operativo cuando tratemos
con flujos, pues vara su tratamiento debido a la diferencia de plataformas.
La clase keyboard es la clase a utilizar al leer flujos de teclado.
La vinculacin de un flujo al dispositivo fsico la hace el hardware de la mquina.
Parasaberms
EnlasiguientepresentacinpuedesaprendermssobresocketsenJava.
Sockets
Quesunsocket?
9 Definicin: Un socket es un punto final de un enlace de comunicacin de dos vas entre dos
programasqueseejecutanatravsdelared.
9 Elclienteyelservidordebenponersedeacuerdosobreelprotocoloqueutilizarn.

Tiposdesocket
Haydostiposdesocket:
9 Orientadoaconexin:

DesarrollodeAplicacionesWeb

Tema6

Estableceuncaminovirtualentreservidorycliente,fiable,sinprdidasdeinformacinni
duplicados,lainformacinllegaenelmismoordenqueseenva.
Elclienteabreunasesinenelservidoryesteguardaunestadodelcliente.
ElclienteutilizalaclaseSocket
ElservidorutilizalaclaseServerSocket
9 Noorientadoaconexin:
Envodedatagramasdetamaofijo.Noesfiable,puedehaberprdidasdeinformaciny
duplicados,ylainformacinpuedellegarendistintoordendelqueseenva.
Noseguardaningnestadodelclienteenelservidor,porello,esmstoleranteafallosdel
sistema.
TantoelclientecomoelservidorutilizanlaclaseDatagramSocket.
Todasestasclases(Socket,ServerSocketyDatagramSocket)seencuentranenelpaquetejava.net

ClaseSocket
9 Constructores:
publicSocket()
publicSocket(InetAddressaddress,intport)
publicSocket(Stringhost,intport)
publicSocket(InetAddressaddress,intport,InetAddresslocalAddr,intlocalPort)
publicSocket(Stringhost,intport,InetAddresslocalAddr,intlocalPort)
address/localAddr:direccinIPdelamquinaremota/local.
port/localPort:puertodelamquinaremota/local.
host:nombredelamquinaremota
Enelcasodelprimerconstructorcreaunsocketsinconexin.

ServiciosdelaclaseSocket
9 publicInetAddressgetInetAddress():
DevuelveladireccinIPdelamquinaenlaqueestamosconectados.
9 publicintgetPort():
Devuelveelpuertodelamquinaremota.
9 publicvoidclose()
Cierraelcanaldecomunicacin.
9 publicInputStreamgetInputStream():
Devuelveelcanaldelecturadelsocket.
9 publicOutputStreamgetOutputStream():
Devuelveelcanaldeescrituradelsocket.
Ademas JAVA proporciona dos llamadas para saber la @IP y puerto local (getLocalAddress() y
getLocalPort())

ClaseServerSocket
9 Constructores:
publicServerSocket(intport)
publicServerSocket(intport,intbacklog)
publicServerSocket(intport,intbacklog,InetAddressbindAddr)
port:puertodelamquinaservidora.
backlog:tamaodelacoladeespera,enelprimeroes50.
bindAddr:direccinIPlocalqueseharpblicamedianteelbind.
9 ElconstructorServerSocketseencargadehacerelbindyellisten.

ServiciosdelaclaseServerSocket
9 publicSocketaccept():

Almacenandodatos

DAW

Devuelve el socket resultado de aceptar una peticin, para llevar a cabo la comunicacin
conelcliente.
9 publicvoidclose()
Cierraelcanaldecomunicacin.
9 publicInetAddressgetInetAddress():
DevuelveladireccinIPdelamquinalocal.
9 publicintgetLocalPort():
Devuelveelpuertodelamquinalocal.

Comunicacinentreclienteservidor
9 Para la transmisin de datos entre cliente y servidor se utilizarn las clases DataInputStream
(recibirdatos)yDataOutputStream(enviardatos)
9 Estasclasesdisponendemtodosparaleeryescribirdatosenelsocket:
read/writeBoolean
read/writeChar
read/writeDouble,read/writeFloat,read/writeInt,read/writeLong,read/writeShort
read/writeUTF(leer/escribircadenasdecaracteres)
9 Paraenviarlosdatosseutilizaelmtodoflush()delaclaseDataOutputStream.

ClaseDatagramSocket
9 Constructores:
publicDatagramSocket()
publicDatagramSocket(intport)
publicDatagramSocket(intport,InetAddressladdr)
port:puertodelamquina.
laddr:direccinIPlocalqueseharpblicamedianteelbind.
9 ElconstructorDatagramSocketseencargadehacerelbind.
9 Elprimerconstructorcogeunpuertolibre.

ServiciosdelaclaseDatagramSocket
publicvoidconnect(InetAddressaddress,intport):
Conectaelsocketalamquinaremotaconla@IPaddressypuertoport.
publicvoidclose()
Cierraelcanaldecomunicacin.
publicvoiddisconnect():
Desconectaelsocket.
publicInetAddressgetInetAddress():
Devuelvela@IPdelamquinaremota.
publicintgetPort():
Devuelveelpuertodelamquinaremota.
Tambinhaydosllamadasparasaberla@IPypuertolocal(getLocalAddress()ygetLocalPort()).
publicvoidsend(DatagramPacketp):
Envaundatagramaalamquinaremota,porelsocketasociado.
publicvoidreceive(DatagramPacketp):
Recibeundatagramadeotramquina,porelsocketasociado.

ClaseDatagramPacket
9 Constructores:
publicDatagramPacket(byte[]buff,intlength)
Construye un DatagramPacket para recibir paquetes en el buffer buff, de longitud
length

DesarrollodeAplicacionesWeb

Tema6

publicDatagramPacket(byte[]buff,intlength,InetAddressaddress,intport)
Construye un DatagramPacket para envar paquetes con datos del buffer buff, de
longitudlength,ala@IPaddressyelpuertoport.
9 Servicios:
Para la actualizacin y consulta de los diferentes campos de un DatagramPacket
disponemos de los siguientes mtodos: set/getAddress, set/getData, set/getLength,
set/getPort

Threads
Quesunthread?
9 Definicin:Unthreadesunflujosecuencialdecontroldentrodeunprograma.
9 Estdefinidoporuncontadordeprograma(PC)yunpunteroalapila(SP)
9 Unthreadnopuedeejecutarseporsmismo,hadehacerlodentrodeunprograma.
9 Todoslosthreadsdeunprocesocompartenlosrecursos(Ej:canalesE/S,memoria,...)

Quganamos?
9 Conseguimosconcurrenciaentreprocesosytambindentrodeunmismoproceso.
9 Tambinpodemosconseguirparalelismosidisponemosdeunaarquitecturamultiprocesador.
9 Elcambiodecontextoentrethreadsnoestancostosoalsistemacomoelcambiodecontexto
entreprocesos.

AtributosdeunthreadenJAVA
9 Unthreadtiene:
Nombre
Prioridad
Hadeseguirlasiguienterelacin:
MIN_PRIORITY<=Prioridad<=MAX_PRIORITY
LaprioridadpordefectoesNORM_PRIORITY
Valores:
MIN_PRIORITY=1
NORM_PRIORITY=5
MAX_PRIORITY=10

ClaseThread
9 Constructores:
publicThread()
Creaunthreadestndar.
publicThread(Runnabletarget)
CreaunthreadenbaseaunaclasequeimplementalainterfazRunnable.
publicThread(Runnabletarget,Stringname)
Equivalentealanteriorconstructordndoleelnombrenamealthread.
publicThread(Stringname)
Creaunthreadestndarconelnombrename.
publicThread(ThreadGroupgroup,Runnabletarget)
Crea un thread en base a una clase que implementa la interfaz Runnable dentro del
ThreadGroup.
publicThread(ThreadGroupgroup,Runnabletarget,Stringname)
Equivalentealanteriorconstructordndoleelnombrenamealthread.
publicThread(ThreadGroupgroup,Stringname)
CreaunthreadestndarconelnombrenamedentrodelThreadGroup

Almacenand
dodatos

DAW

9 Cuando
osecreaunthreadnoseeponeenmarcha,selohemosdeindicarexplcittamente.
9 UnThrreadGroupesunconjunttodethreadss,loscualestienenaccessoainformacinentreellos.

Serviciosde
elaclaseThrread
9 publicSStringgetNam
me():
Deevuelveelno
ombrequeid
dentificaaltthread.
9 publicStringsetName(Stringn
name):
Caambiaelnom
mbredelthreead.
9 publicintgetPriorityy()
Deevuelvelaprrioridaddeltthread.
9 publicvoidsetPriorrity(intnewP
Priority)
oridaddelthread
Caambialaprio
9 publicTThreadGroup
pgetThreadG
Group():
Deevuelveelgrrupodedond
deprocedeeelthread.
9 voidrun()
Esselmtodoq
queejecutarrunthreadcuandoeste
esepongaen
nmarcha.
9 voidstaart()
Inicialaejecuccindelthreead.
9 voidjoin()
Essperaaqueu
unthreadterminesuejeecucin.
Po
odemosespeecificareltieempodeespeeramximo..
9 voidsleeep(longmiliis)
Bloqueaelthrreadmilismilisegundos.
Haayotroparmetroquep
permiteafinaarmseltiem
mpodebloqueoennano
osegundos.
9 voidstop/destroy())
Deestruyeelthreadsinelim
minarestructturas,estoestareadelm
mtodojoin.
9 staticThreadcurren
ntThread()
Deevuelveelth
hreadqueseestejecutaandoactualm
mente.
9 booleaanisAlive()
Mirasiunthre
M
eadnohaterminadosueejecucin
9 staticvoidyield()
mbiodeconttextoentrefflujos.
Prrovocaelcam

EstadosdeunThread

Sincronizaccin
Aqu se preesenta el pro
oblema de que
q varios th
hreads inten
nten accederr a los mismos datos y que
q el
resultadofinalseaincorrrecto.
9 Por ejeemplo: Acceeso a una vaariable global x con vallor inicial 0,, y dos threeads que inttentan
increm
mentarsuvalorenunaun
nidad.
9 Silosthreadsnoesstnsincronizadosunreesultadoposiibleseraquelavariablextengaelvvalor1
(incorrrecto)

10

DesarrollodeAplicacionesWeb

Tema6

9 Solucin: Para resolver el problema anterior se utiliza la etiqueta synchronized junto con el
objetoquesequieresincronizar.
Enelcasoanteriorsesolucionaradelasiguienteforma:
synchronized(this){x++;}
thiseslaclasequecontienelavariableglobal
Conestosegarantizaelaccesoenexclusinmutua.
9 Siqueremosaccederaunmtodoenexclusinmutuatenemoslassiguientesopciones:
Igualqueelejemploanterior:
synchronized(this){this.incrementar()}
Declarandoelmtodocomosincronizado:
synchronizedvoidincrementar()
Tambinsepuedensincronizarvariosthreadsmediantelosmtodos:wait(),notify()y
notifyAll()

Ejemplo:Unchat
Servidor.java
import java.io.*;
import java.net.*;
importjava.util.*;
public class Servidor extends Thread{
public static Vector usuarios = new Vector();
public static void main (String args[]){
ServerSocket sfd = null;
try{
sfd = new ServerSocket(7000);
}catch (IOException ioe){
System.out.println("Comunicacin rechazada."+ioe);
System.exit(1);
}while (true){
try{
Socket nsfd = sfd.accept();
System.out.println("Conexion aceptada de: "+nsfd.getInetAddress());
Flujoflujo = new Flujo(nsfd);
Thread t = new Thread(flujo);
t.start();
}catch(IOException ioe){
System.out.println("Error: "+ioe);
}
}
}
}

Flujo.java
import java.net.*;
import java.io.*;
importjava.util.*;
public class Flujo extends Thread{
Socket nsfd;
DataInputStreamFlujoLectura;
DataOutputStreamFlujoEscritura;
publicFlujo (Socket sfd){
nsfd = sfd;
try{
Flujo Lectura = new DataInputStream(new BufferedInputStream(sfd.getInputStream()));
Flujo
Escritura
=
new
DataOutputStream(new
BufferedOutputStream(sfd.getOutputStream()));
}catch(IOExceptionioe){
System.out.println("IOException(Flujo): "+ioe);
}
}
publicvoidrun(){
broadcast(nsfd.getInetAddress()+> se ha conectado");
Servidor.usuarios.add ((Object) this);
while(true){
try{
String linea = FlujoLectura.readUTF();

11

Almacenandodatos

if (!linea.equals("")){
linea = nsfd.getInetAddress() +> + linea;
broadcast(linea);
}
}
catch(IOException ioe){
Servidor.usuarios.removeElement(this);
broadcast(nsfd.getInetAddress()+> se ha desconectado");
break;
}
}
}
public void broadcast(String mensaje){
synchronized (Servidor.usuarios){
Enumeration e = Servidor.usuarios.elements();
while (e.hasMoreElements()){
Flujo f = (Flujo) e.nextElement();
try{
synchronized(f.FlujoEscritura){
f.FlujoEscritura.writeUTF(mensaje);
f.FlujoEscritura.flush();
}
}
catch(IOException ioe){
System.out.println("Error: "+ioe);
}
}
}
}
}

Cliente.java
import java.io.*;
import java.net.*;
importjava.awt.*;
importjava.awt.event.*;
public class Cliente extends Frame implements ActionListener
{
static Socket sfd = null;
staticDataInputStream EntradaSocket;
staticDataOutputStream SalidaSocket;
staticTextField salida;
staticTextArea entrada;
String texto;
publicCliente()
{
setTitle("Chat");
setSize(350,200);
salida = new TextField(30);
salida.addActionListener(this);
entrada = new TextArea();
entrada.setEditable(false);
add("South",salida);
add("Center", entrada);
setVisible(true);
}
public static void main(String[] args){
Cliente cliente = new Cliente();
try
{
sfd = new Socket("192.168.0.1",7000);
EntradaSocket = new DataInputStream(new BufferedInputStream(sfd.getInputStream()));
SalidaSocket = new DataOutputStream(new BufferedOutputStream(sfd.getOutputStream()));
}
catch (UnknownHostExceptionuhe)
{
System.out.println("No se puede acceder al servidor.");
System.exit(1);
}
catch (IOException ioe)
{
System.out.println("Comunicacin rechazada.");

12

DAW

DesarrollodeAplicacionesWeb

Tema6

System.exit(1);
}
while (true)
{
try
{
String linea = EntradaSocket.readUTF();
entrada.append(linea+"\n");
}
catch(IOException ioe)
{
System.exit(1);
}
}
}
public void actionPerformed (ActionEvent e)
{
texto = salida.getText();
salida.setText("");
try
{
SalidaSocket.writeUTF(texto);
SalidaSocket.flush();
}
catch (IOException ioe)
{
System.out.println("Error: "+ioe);
}
}
publicbooleanhandleEvent(Event e)
{
if ((e.target == this) && (e.id == Event.WINDOW_DESTROY)){
if (sfd != null){
try{
sfd.close();
}catch (IOException ioe)
{
System.out.println("Error: "+ioe);
}
this.dispose();
}
}
return true;
}
}

13

Almacenandodatos

DAW

3.Clasesrelativasaflujos.
Caso prctico
Otro aspecto importante que Ada trata con Mara y Juan, acerca de los ficheros para la aplicacin de
la clnica, es el tipo de ficheros a usar. Es decir, deben estudiar si es conveniente utilizar ficheros
para almacenar datos en ficheros de texto, o si deben utilizar ficheros binarios. Mara comenta Quizs debemos usar los dos tipos de ficheros, depender de qu se vaya a guardar, -Juan le
contesta -tienes razn Mara, pero debemos pensar entonces cmo va el programa a leer y a escribir
la informacin, tendremos que utilizar las clases Java adecuadas segn los ficheros que decidamos
usar.

Existendostiposdeflujos,flujosdebytes(byte
streams)
y
flujos
de
caracteres
(characterstreams).
9

Los flujos de caracteres (16 bits) se usan


para manipular datos legibles por
humanos (por ejemplo un fichero de
texto). Vienen determinados por dos
clases abstractas: Reader y Writer.
Dichasclasesmanejanflujosdecaracteres
Unicode. De ellas derivan subclases
concretas que implementan los mtodos
definidosdestacadoslosmtodos read()
y write() que, en este caso, leen y
escriben
caracteres
de
datos
respectivamente.
9 Los flujos de bytes (8 bits) se usan para
manipulardatosbinarios,legiblessolopor
la maquina (por ejemplo un fichero de
programa). Su uso est orientado a la
lectura y escritura de datos binarios. El
tratamiento del flujo de bytes viene
determinadopordosclasesabstractasque
son InputStream y OutputStream.
Estas dos clases son las que definen los
mtodos que sus subclases tendrn implementados y, de entre todos, destacan read() y
write()queleenyescribenbytesdedatosrespectivamente.
Las clases del paquete java.io se pueden ver en la ilustracin. Destacamos las clases relativas a
flujos:

BufferedInputStream:permiteleerdatosatravsdeunflujoconunbufferintermedio.
BufferedOutputStream:implementalosmtodosparaescribirenunflujoatravsdeun

buffer.

FileInputStream:permiteleerbytesdeunfichero.
FileOutputStream:permiteescribirbytesenunficheroodescriptor.
StreamTokenizer:estaclaserecibeunflujodeentrada,loanaliza(parse)ydivideen

StringReader:esunflujodecaracterescuyafuenteesunacadenadecaracteresostring.
StringWriter:esunflujodecaracterescuyasalidaesunbufferdecadenadecaracteres,

diversospedazos(tokens),permitiendoleerunoencadamomento.

quepuedeutilizarseparaconstruirunstring.

14

DesarrollodeAplicacionesWeb

Tema6

Destacarquehayclasesquese"montan"sobreotrosflujosparamodificarlaformadetrabajarcon
ellos. Por ejemplo, con BufferedInputStream podemos aadir un buffer a un flujo
FileInputStream, de manera que se mejore la eficiencia de los accesos a los dispositivos en los
quesealmacenaelficheroconelqueconectaelflujo.

3.1.Ejemplocomentadodeunaclaseconflujos.
Vamosaverunejemploconunadelasclasescomentadas,enconcreto,conStreamTokenizer.
La clase StreamTokenizer obtiene un flujo de entrada y lo divide en "tokens". El flujo
tokenizerpuedereconoceridentificadores,nmerosyotrascadenas.
El ejemplo que puedes descargarte en el siguiente recurso, muestra cmo utilizar la clase
StreamTokenizer para contar nmeros y palabras de un fichero de texto. Se abre el flujo con
ayudadelaclase FileReader,ypuedesvercmose"monta"elflujo StreamTokenizersobreel
FileReader, es decir, que se construye el objeto StreamTokenizer con el flujo FileReader como
argumento,yentoncesseempiezaaiterarsobrel.
packagetokenizer;
importjava.io.FileNotFoundException;
importjava.io.FileReader;
importjava.io.IOException;
importjava.io.StreamTokenizer;

public class token {


public void contarPalabrasyNumeros(String nombre_fichero) {
StreamTokenizersTokenizer = null;
intcontapal = 0, numNumeros = 0;
try {
sTokenizer = new StreamTokenizer(new FileReader(nombre_fichero));
while (sTokenizer.nextToken() != StreamTokenizer.TT_EOF) {
if (sTokenizer.ttype == StreamTokenizer.TT_WORD)
contapal++;
else if (sTokenizer.ttype == StreamTokenizer.TT_NUMBER)
numNumeros++;
}
System.out.println("Nmero de palabras en el fichero: " + contapal);
System.out.println("Nmero de nmeros en el fichero: " + numNumeros);
} catch (FileNotFoundException ex) {
System.out.println(ex.getMessage()) ;
} catch (IOException ex) {
System.out.println(ex.getMessage()) ;
}
}
/**
* @paramargs the command line arguments
*/
public static void main(String[] args) {
new Main().countWordsAndNumbers("c:\\datos.txt");
}
}

ElmtodonextTokendevuelveunintqueindicaeltipodetokenledo.Hayunaseriedeconstantes
definidasparadeterminareltipodetoken:
9
9
9
9

TT_WORDindicaqueeltokenesunapalabra.
TT_NUMBERindicaqueeltokenesunnmero.
TT_EOLindicaquesehaledoelfindelnea.
TT_EOFindicaquesehallegadoalfindelflujodeentrada.

15

Almacenandodatos

DAW

Enelcdigodelaclase,apreciamosqueseiterarhastallegaralfindelfichero.Paracadatoken,se
mirasutipo,ysegneltiposeincrementaelcontadordepalabrasodenmeros.

Indica si la siguiente afirmacin es verdadera o falsa.


Segn el sistema operativo que utilicemos, habr que utilizar un flujo u otro.
Verdadero.

Falso.

4.Flujos.
Caso prctico
Ana y Antonio salen de clase. Antonio ha quedado con una amiga y Ana va camino de casa
pensando en lo que le explicaron en clase hace unos das. Como se qued con dudas, tambin le
consult a Mara. En concreto, le asaltaban dudas sobre cmo leer y escribir datos por teclado en un
programa, y tambin varias dudas sobre lectura y escritura de informacin en ficheros. Mara le
solvent las dudas hablndole sobre el tema, pero an as, tena que probarlo tranquilamente en
casa, hacindose unos pequeos ejemplos, para comprobar toda la nueva informacin aprendida.
-Antes de irte, -dice Antonio a Ana, -sintate a hablar con nosotros un rato.
-Bueno, pero me voy a ir enseguida, -contesta Ana-.

Hemosvistoquesunflujoyqueexisteunrboldeclasesamplioparasumanejo.Ahoravamosa
verenprimerlugarlosflujospredefinidos,tambinconocidoscomodeentradaysalida,ydespus
veremoslosflujosbasadosenbytesylosflujosbasadosencarcter.
"Loescuchyloolvid,loviyloentend,lohiceyloaprend".Confucio.

Parasaberms
Antes,hemosmencionadoUnicode.PuedesconsultarelorigenymscosassobreUnicode,
enelenlacedelaWikipedia:
http://www.juntadeandalucia.es/educacion/adistancia/cursos/mod/scorm/player.php?id=7
4601&currentorg=eXeContenidos4df9bd3a1eeeacaecb3a&mode=normal&scoid=145047

4.1.Flujospredefinidos.Entradaysalidaestndar.
Tradicionalmente,losusuariosdelsistemaoperativoUnix,LinuxytambinMSDOS,hanutilizadoun
tipo de entrada/salida conocida comnmente por entrada/salida estndar. El fichero de entrada
estndar(stdin)estpicamenteelteclado.Elficherodesalidaestndar(stdout)estpicamentela
pantalla(olaventanadelterminal).Elficherodesalidadeerrorestndar(stderr)tambinsedirige
normalmentealapantalla,peroseimplementacomootroficherodeformaquesepuedadistinguir
entrelasalidanormaly(siesnecesario)losmensajesdeerror.
Java tiene acceso a la entrada/salida estndar a travs de la clase System. En concreto, los tres
ficherosqueseimplementanson:
9

Stdin.EsunobjetodetipoInputStream,yestdefinidoenlaclaseSystemcomoflujode

entradaestndar.Pordefectoeselteclado,peropuederedirigirseparacadahostocada
usuario,deformaquesecorrespondaconcualquierotrodispositivodeentrada.
9 Stdout. System.outimplementastdoutcomounainstanciadelaclasePrintStream.Se
puedenutilizarlosmtodosprint()yprintln()concualquiertipobsicoJavacomo
argumento.
9 Stderr.EsunobjetodetipoPrintStream.EsunflujodesalidadefinidoenlaclaseSystemy
representalasalidadeerrorestndar.Pordefecto,eselmonitor,aunqueesposible
redireccionarloaotrodispositivodesalida.
Paralaentrada,seusaelmtodoreadparaleerdelaentradaestndar:
9 intSystem.in.read();
Leeelsiguiente byte (char)delaentradaestndar.

16

DesarrollodeAplicacionesWeb
9

Tema6

intSystem.in.read(byte[] b);
Leerunconjuntodebytesdelaentradaestndaryloalmacenaenelvectorb.

Para la salida, se usa el mtodo print para escribir en la salida estndar:


9

System.out.print(String);
Muestraeltextoenlaconsola.
System.out.println(String);
Muestraeltextoenlaconsolayseguidamenteefectaunsaltodelnea.

Normalmente,paraleervaloresnumricos,loquesehaceestomarelvalordelaentradaestndar
en forma de cadena y entonces usar mtodos que permiten transformar el texto a nmeros (int,
float,double,etc.)segnserequiera.
Funcionesdeconversin.
Mtodo
Funcionamiento
Convierteunacadenaenunnmeroenterodeun
byte Byte.parseByte(String)
byte
short Short.parseShort(String)
Convierteunacadenaenunnmeroenterocorto
intInteger.parseInt(String)
Convierteunacadenaenunnmeroentero
longLong.parseLong(String)
Convierteunacadenaenunnmeroenterolargo
floatFloat.parseInt(String)
Convierteunacadenaenunnmerorealsimple
doubleDouble.parseInt(String)
Convierteunacadenaenunnmerorealdoble
booleanBoolean.parseBoolean(String) Convierteunacadenaenunvalorlgico

4.2.Flujospredefinidos.Entradaysalidaestndar.Ejemplo.
Veamosunejemploenelqueseleeportecladohastapulsarlatecladeretorno,enesemomentoel
programaacabarimprimiendoporlasalidaestndarlacadenaleda.
ParairconstruyendolacadenaconloscaracteresledospodramosusarlaclaseStringBufferola
StringBuilder. La clase StringBuffer permite almacenar cadenas que cambiarn en la
ejecucin del programa. StringBuilder es similar, pero no es sncrona. De este modo, para la
mayoradelasaplicaciones,dondeseejecutaunsolohilo,suponeunamejoraderendimientosobre
StringBuffer.
Elprocesodelecturahadeestarenunbloquetry..catch.
Import java.io.IOException;
public class leeEestandar {
public static void main(String[] args) {
// Cadena donde iremos almacenando los caracteres que se escriban
StringBuilder str = new StringBuilder();
char c;
// Por si ocurre una excepcin ponemos el bloque try-cath
try{
// Mientras la entrada de terclado no sea Intro
while ((c=(char)System.in.read())!='\n'){
// Aadir el character ledo a la cadena str
str.append(c);
}
}catch(IOException ex){
System.out.println(ex.getMessage()); }
// Escribir la cadena que se ha ido tecleando
System.out.println("Cadena introducida: " + str);
}
}

Seala la opcin correcta:


Read es una clase de System que permite leer caracteres.
StringBuffer permite leer y StringBuilder escribir en la salida estndar.

La clase keyboard tambin permite leer flujos de teclado.

17

Almacenandodatos

DAW

Stderr por defecto dirige al monitor pero se puede direccionar a otro dispositivo.
Debesconocer
Debemos procesar las excepciones que la propia mquina virtual va a lanzar. Existen dos
mecanismosbsicosparagestionarloserroresquesepuedenproducirenunaaplicacin:el
primeroconsisteenutilizarlaestructura try-catch,quepermiteintentarcapturarunerror
quesepuedaproducir.Seponeel try,elcdigoencuestinysefinalizaconel catch.En
esaseccindel catchesdondepondremoslasoperacionesarealizarcuandosedetecteun
error.Sepuedenponervariosbloquescatch:unagenricayotrasmsdetalladas.
El otro mecanismo consiste en declarar que nuestro mtodo puede lanzar una excepcin,
peronogestionarlaenesemtodo,sinotratarla,porejemplo,enelmtodo main()enel
queseestllamandoaesemtodo.

4.3.Flujosbasadosenbytes.
Estetipodeflujoseselidneoparaelmanejodeentradasysalidasdebytes,ysuusoportantoest
orientadoalalecturayescrituradedatosbinarios.
Paraeltratamientodelosflujosdebytes,Javatienedosclasesabstractasqueson InputStreamy
OutputStream.Cadaunadeestasclasesabstractastienevariassubclasesconcretas,quecontrolan
lasdiferenciasentrelosdistintosdispositivosdeE/Squesepuedenutilizar.
classFileInputStreamextandsInputStream {
FileInputStream (String fichero) throws FileNotFoundException;
FileInputStream (File fichero) throws FileNotFoundException;
... ... ...
}
classFileOutputStream extends OutputStream {
FileOutputStream (String fichero) throws FileNotFoundException;
FileOutputStream (File fichero) throws FileNotFoundException;
... ... ...
}
OutputStream y el InputStream y todas sus subclases, reciben en el constructor el objeto que

representaelflujodedatosparaeldispositivodeentradaosalida.
Porejemplo,podemoscopiarelcontenidodeunficheroenotro:
voidcopia (String origen, String destino) throws IOException {
try{
// Obtener los nombres de los ficheros de origen y destino
// y abrir la conexin a los ficheros.
InputStreamfentrada = new FileInputStream(origen);
OutputStreamfsalida = new FileOutputStream(destino);
// Crear una variable para leer el flujo de bytes del origen
byte[] buffer= new byte[256];
while (true) {
// Leer el flujo de bytes
int n = fentrada.read(buffer);
// Si no queda nada por leer, salir delwhile
if (n < 0)
break;
// Escribir el flujo de bytes ledos al fichero destino
fsalida.write(buffer, 0, n);
}
// Cerrar los ficheros
fentrada.close();
fsalida.close();
}catch(IOException ex){
System.out.println(ex.getMessage()); }

Recomendacin
En los enlaces siguientes puedes ver la documentacin oficial de Oracle sobre
FileInputStreamysobreFileOutputStream.

18

DesarrollodeAplicacionesWeb
FileInputStream.
FileOutputStream.

Tema6

http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileInputStream.html
http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileOutputStream.html

4.4.Flujosbasadosencaracteres.

Las clases orientadas al flujo de bytes nos proporcionan la suficiente


funcionalidad para realizar cualquier tipo de operacin de entrada o
salida,peronopuedentrabajardirectamenteconcaracteresUnicode,
los cuales estn representados por dos bytes. Por eso, se consider
necesarialacreacindelasclasesorientadasalflujodecaracterespara
ofrecernoselsoportenecesarioparaeltratamientodecaracteres.
Para los flujos de caracteres, Java dispone de dos clases abstractas:
ReaderyWriter.
Reader, Writer, y todas sus subclases, reciben en el constructor el
objetoquerepresentaelflujodedatosparaeldispositivodeentradao
salida.
Hay que recordar que cada vez que se llama a un constructor se abre el flujo de datos y es
necesariocerrarlocuandonolonecesitemos.
Existen muchos tipos de flujos dependiendo de la utilidad que le vayamos a dar a los datos que
extraemosdelosdispositivos.
Unflujopuedeserenvueltoporotroflujoparatratarelflujodedatosdeformacmoda.As,un
bufferWriternospermitemanipularelflujodedatoscomounbuffer,perosiloenvolvemosenun
PrintWriter lo podemos escribir con muchas ms funcionalidades adicionales para diferentes
tiposdedatos.
Enesteejemplodecdigo,sevecmopodemosescribirlasalidaestndaraunfichero.Cuandose
tecleelapalabra"salir",sedejardeleeryentoncessesaldrdelbucledelectura.
Podemos ver cmo se usa InputStreamReader que es un puente de flujos de bytes a flujos de
caracteres:leebytesylosdecodificaacaracteres.BufferedReaderleetextodeunflujodeentrada
decaracteres,permitiendoefectuarunalecturaeficientedecaracteres,vectoresylneas.
Comovemosenelcdigo,usamos FileWriterparaflujosdecaracteres,puesparadatosbinarios
seutilizaFileOutputStream.
try{
PrintWriter out = null;
out = new PrintWriter(new FileWriter("c:\\salida.txt", true));
BufferedReaderbr = new BufferedReader(
newInputStreamReader(System.in));
String s;
while (!(s = br.readLine()).equals("salir")){
out.println(s);
}
out.close();
}
catch(IOException ex){
System.out.println(ex.getMessage()); }

Indica si es verdadera o falsa la siguiente afirmacin:


Para flujos de caracteres es mejor usar las clases Reader y Writer en vez de InputStream y
OutputStream.
Verdadero.

Falso.

19

Almacenandodatos

DAW

4.5.Rutasdelosficheros.

Enlosejemplosquevemoseneltemaestamosusandolarutade
losficherostalycomoseusanenMSDOS,oWindows,esdecir,
porejemplo:
c:\\datos\Programacion\fichero.txt

Cuando operamos con rutas de ficheros, el carcter separador


entre directorios o carpetas suele cambiar dependiendo del
sistemaoperativoenelqueseestejecutandoelprograma.
Para evitar problemas en la ejecucin de los programas cuando
seejecutenenunouotrosistemaoperativo,yportantopersiguiendoquenuestrasaplicacionessean
lomsportablesposibles,serecomiendausarenJava:File.separator.
Podramoshacerunafuncinquealpasarleunarutanosdevolvieralaadecuadasegnelseparador
delsistemaactual,delsiguientemodo:
String substFileSeparator(String ruta){
String separador = "\\";
try{
// Si estamos en Windows
if ( File.separator.equals(separador) )
separador = "/" ;
// Reemplaza todas las cadenas que coinciden con la expresin
// regular dada oldSep por la cadena File.separator
returnruta.replaceAll(separador, File.separator);
}catch(Exception e){
// Por si ocurre una java.util.regex.PatternSyntaxException
returnruta.replaceAll(separador + separador, File.separator);
}
}

Indica si es verdadera o falsa la siguiente afirmacin.


Cuando trabajamos con fichero en Java, no es necesario capturar las excepciones, el sistema
se ocupa automticamente de ellas. Verdadero o Falso?
Verdadero.

20

Falso.

DesarrollodeAplicacionesWeb

Tema6

5.Trabajandoconficheros.
Caso prctico
Juan le comenta a Mara -Tenemos que programar una copia de seguridad diaria de los datos del
ficheros de texto plano que utiliza el programa para guardar la informacin. -Mientras Mara escucha
a Juan, recuerda que para copias de seguridad, siempre ha comprobado que la mejor opcin es
utilizar ficheros secuenciales.

CreesqueesunabuenaopcinlaquepiensaMaraoutilizarasotraensulugar?
Enesteapartadovasavermuchascosassobrelosficheros:cmoleeryescribirenellos,aunqueya
hemos visto algo sobre eso, hablaremos de las formas de acceso a los ficheros: secuencial o de
maneraaleatoria.
Siemprehemosdetenerencuentaquelamaneradeprocederconficherosdebeser:
Abrirobiencrearsinoexisteelfichero.
Hacerlasoperacionesquenecesitemos.
Cerrarelfichero,paranoperderlainformacinquesehayamodificadooaadido.
Tambin es muy importante el control de las excepciones, para evitar que se produzcan fallos en
tiempodeejecucin.Siintentamosabrirsinmsunfichero,sincomprobarsiexisteono,ynoexiste,
saltarunaexcepcin.

Parasaberms
En el siguiente enlace a la wikipedia podrs ver la descripcin de varias extensiones que
puedenpresentarlosarchivos.
Extensindeunarchivo.
http://es.wikipedia.org/wiki/Extensi%C3%B3n_de_archivo

5.1.Escrituraylecturadeinformacinenficheros.

Acabamosdemencionarlospasosfundamentalesparaprocederconficheros:abrir,operar,cerrar.
Adems de esas consideraciones, debemos tener en cuenta tambin las clases Java a emplear, es
decir,recuerdaquehemoscomentadoquesivamosatratarconficherosdetexto,esmseficiente
emplear las clases de ReaderWriter, frente a las clases de InputStreamy OutputStream que
estnindicadasparaflujosdebytes.
Otracosaaconsiderar,cuandosevaahacerusodeficheros,eslaformadeaccesoalficheroquese
vaautilizar,sivaaserdemanerasecuencialobienaleatoria.Enunficherosecuencial,paraacceder
a un dato debemos recorrer todo el fichero desde el principio hasta llegar a su posicin. Sin
embargo,enunficherodeaccesoaleatorio(Eslaposibilidaddeaccederaunelementoarbitrariodeunasecuenciadedatos
en el mismo tiempo) podemos posicionarnos directamente en una posicin del fichero, y ah leer o
escribir.
AunqueyahasvistounejemploqueusaBufferedReader,insistimosaqusobrelafilosofadeestas
clases,queusanlaideadeunbuffer.
Laideaesquecuandounaaplicacinnecesitaleerdatosdeunfichero,tienequeestaresperandoa
queeldiscoenelqueestelficheroleproporcionelainformacin.
Undispositivocualquieradememoriamasiva(Consisteenuntipodealmacenamientopermanente,novoltil,adiferencia
delamemoriaprincipaldelordenadorquesesvoltil,peroposeemayorcapacidaddealmacenamientoquelamemoriaprincipal,aunque
esmslentaquesta),pormuyrpidoquesea,esmuchomslentoquelaCPUdelordenador.

Asque,esfundamentalreducirelnmerodeaccesosalficheroafindemejorarlaeficienciadela
aplicacin,yparaelloseasociaalficherounamemoriaintermedia,elbuffer,demodoquecuandose
necesitaleerunbytedelarchivo,enrealidadsetraenhastaelbufferasociadoalflujo,yaqueesuna
memoriamuchomsrpidaquecualquierotrodispositivodememoriamasiva.
Cualquier operacin de Entrada/Salida a ficheros puede generar una IOException, es decir, un
error de Entrada/Salida. Puede ser por ejemplo, que el fichero no exista, o que el dispositivo no
funcionecorrectamente,oquenuestraaplicacinnotengapermisosdelecturaoescriturasobreel

21

Almacenandodatos

DAW

ficheroencuestin.Poreso,lassentenciasqueinvolucranoperacionessobreficheros,debenirenun
bloquetry.

Seala si es verdadera o es falsa la siguiente afirmacin:


La idea de usar buffers con los ficheros es incrementar los accesos fsicos a disco.
Verdadero.

Falso.

5.2.Ficherosbinariosyficherosdetexto(I).
Ya comentamos anteriormente que los ficheros se utilizan para guardar la informacin en un
soporte: disco duro, disquetes, memorias usb, dvd, etc., y posteriormente poder recuperarla.
Tambindistinguimosdostiposdeficheros:losdetextoylosbinarios.
Enlosficherosdetextolainformacinseguardacomocaracteres.Esoscaracteresestncodificados
enUnicode,oenASCIIuotrascodificacionesdetexto.
En la siguiente porcin de cdigo puedes ver cmo para un fichero existente, que en este caso es
texto.txt,averiguamoslacodificacinqueposee,usandoelmtodogetEncoding()
FileInputStream fichero;
try {
// Elegimos fichero para leer flujos de bytes "crudos"
fichero = new FileInputStream("c:\\texto.txt");
// InputStreamReader sirve de puente de flujos de byte a caracteres
InputStreamReaderunReader = new InputStreamReader(fichero);
// Vemos la codificacin actual
System.out.println(unReader.getEncoding());
} catch (FileNotFoundException ex) {
Logger.getLogger(textos.class.getName()).log(Level.SEVERE, null, ex);
}

Paraarchivosdetexto,sepuedeabrirelficheroparaleerusandolaclase FileReader.Estaclase
nosproporcionamtodosparaleercaracteres.Cuandonosinteresenoleercarcteracarcter,sino
leer lneas completas, podemos usar la clase BufferedReader a partir de FileReader. Lo
podemoshacerdelasiguienteforma:
File arch = new File ("C:\\fich.txt");
FileReaderfr = new FileReader (arch);
BufferedReaderbr = new BufferedReader(fr);
...
String linea = br.readLine();

Paraescribirenarchivosdetextolopodramoshacer,teniendoencuenta:
FileWriterfich = null;
PrintWriter pw = null;
fich = new FileWriter("c:/fich2.txt");
pw = new PrintWriter(fichero);
pw.println("Linea de texto");
...

Si el fichero al que queremos escribir existe y lo que queremos es aadir informacin, entonces
pasaremoselsegundoparmetrocomotrue:
FileWriter("c:/fich2.txt",true);

22

DesarrollodeAplicacionesWeb

Tema6

Parasaberms
EnelsiguienteenlaceawikipediapuedesverelcdigoASCII.

Binario

Dec

Hex

00100000

32

20

00100001
00100010
00100011
00100100
00100101
00100110
00100111
00101000
00101001
00101010
00101011
00101100
00101101
00101110
00101111
00110000
00110001
00110010
00110011
00110100
00110101
00110110
00110111
00111000
00111001
00111010
00111011
00111100
00111101
00111110
00111111

33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

21
22
23
24
25
26
27
28
29
2A
2B
2C
2D
2E
2F
30
31
32
33
34
35
36
37
38
39
3A
3B
3C
3D
3E
3F

Repre
senta
espacio
()
!
"
#
$
%
&
'
(
)
*
+
,

.
/
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?

Binario

Dec

Hex

0100 0000
0100 0001
0100 0010
0100 0011
0100 0100
0100 0101
0100 0110
0100 0111
0100 1000
0100 1001
0100 1010
0100 1011
0100 1100
0100 1101
0100 1110
0100 1111
0101 0000
0101 0001
0101 0010
0101 0011
0101 0100
0101 0101
0101 0110
0101 0111
0101 1000
0101 1001
0101 1010
0101 1011
0101 1100
0101 1101
0101 1110
0101 1111

64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95

40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F
50
51
52
53
54
55
56
57
58
59
5A
5B
5C
5D
5E
5F

Repre
senta
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_

Binario

Dec

Hex

0110 0000
0110 0001
0110 0010
0110 0011
0110 0100
0110 0101
0110 0110
0110 0111
0110 1000
0110 1001
0110 1010
0110 1011
0110 1100
0110 1101
0110 1110
0110 1111
0111 0000
0111 0001
0111 0010
0111 0011
0111 0100
0111 0101
0111 0110
0111 0111
0111 1000
0111 1001
0111 1010
0111 1011
0111 1100
0111 1101
0111 1110

96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126

60
61
62
63
64
65
66
67
68
69
6A
6B
6C
6D
6E
6F
70
71
72
73
74
75
76
77
78
79
7A
7B
7C
7D
7E

Repres
enta
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~

5.2.1.Ficherosbinariosyficherosdetexto(II).
Los ficheros binarios almacenan la informacin en bytes, codificada en binario, pudiendo ser de
cualquiertipo:fotografas,nmeros,letras,archivosejecutables,etc.
Los archivosbinarios guardan una representacin de los datos en el fichero. O sea que, cuando se
guardatextonoseguardaeltextoens,sinoqueseguardasurepresentacinencdigoUTF8(Esun
formatodecodificacindecaracteresUnicodeusandosmbolosdelongitudvariable).
Paraleerdatosdeunficherobinario,JavaproporcionalaclaseFileInputStream.Dichaclasetrabaja
conbytesqueseleendesdeelflujoasociadoaunfichero.Aqupuedesverunejemplocomentado.
packagefileinputconbuffer;
importjava.io.BufferedInputStream;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.IOException;
public class leerConBuffer {
public static void main(String[] args) {
int tama ;
try{
// Creamos un nuevo objeto File, que es la ruta hasta el fichero desde
File f = new File("C:\\apuntes\\test.bin");
// Construimosunflujo de tipo FileInputStream (un flujo de entrada desde

23

Almacenandodatos

DAW

// fichero) sobre el objeto File. Estamos conectando nuestra aplicacin


// a un extremo del flujo, por donde van a salir los datos, y "pidiendo"
// al Sistema Operativo que conecte el otro extremo al fichero que indica
// la ruta establecida por el objeto File f que habamos creado antes. De
FileInputStreamflujoEntrada = new FileInputStream(f);
BufferedInputStreamfEntradaConBuffer = new BufferedInputStream(flujoEntrada);
// Escribimos el tamaodel fichero en bytes.
tama = fEntradaConBuffer.available();
System.out.println("Bytes disponibles: " + tama);
// Indicamos que vamos a intentar leer 50 bytes del fichero.
System.out.println("Leyendo 50 bytes....");
// Creamos unarray de 50 bytes para llenarlo con los 50 bytes
// que leamos del flujo (realmente del fichero)*/
bytebytearray[] = new byte[50];
// El mtodo read() de la clase FileInputStream recibe como parmetro un
// array de byte, y lo llena leyendo bytes desde el flujo.
// Devuelve un nmero entero, que es el nmero de bytes que realmente se
// han ledo desde el flujo. Si el fichero tiene menos de 50 bytes, no
// podr leer los 50 bytes, y escribir un mensaje indicndolo.
if (fEntradaConBuffer.read(bytearray) != 50)
System.out.println("No se pudieron leer 50 bytes");
// Usamos un constructor adecuado de la clase String, que crea un nuevo
// String a partir de los bytes ledos desde el flujo, que se almacenaron
// en el arraybytearray, y escribimos eseString.
System.out.println(new String(bytearray, 0, 50));
// Finalmentecerramos el flujo.Es importante cerrar los flujos
// para liberar ese recurso. Al cerrar el flujo, se comprueba que no
// haya quedado ningn dato en el flujo sin que se haya ledo por la aplicacin. */
fEntradaConBuffer.close();
// Capturamos la excepcin de
// producirse en este caso es
// es el mensaje que enviamos
}catch (IOException e){
System.err.println("No se encuentra
}
}

Entrada/Salida. El error que puede


que el fichero no est accesible, y
en tal caso.
el fichero");

Paraescribirdatosaunficherobinario,laclasenospermiteusarunficheroparaescrituradebytes
en l, es la claseFileOutputStream. La filosofa es la misma que para la lectura de datos, pero
ahora el flujo es en direccin contraria, desde la aplicacin que hace de fuente de datos hasta el
fichero,quelosconsume.
Enlasiguientepresentacinpuedesverunesquemadecmoutilizarbufferparaoptimizarlalectura
detecladodesdeconsola,pormediodelasenvolturas,podemosusarmtodoscomo readline(),
delaclaseBufferedReader,queenvuelveaunobjetodelaclaseInputStreamReader.
EnvolturasoWrappers
Leerdesdeconsola
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in);

9 Buf esunflujodecaracteresqueseenlazaalaconsolaatravsdelaclaseSystem.in.Esta
seenvuelveparapasardebyteachar
9 InputStreamReader (InputStream inp):clasequeconviertedebyteacarcter.
9 BufferedReader (Reader input):clasequerecibeunflujodecaracteresdeentrada.

Bytes

24

readLine()

BufferedReader
InputStreamReader
System.in
(ImputStream)

read()
read(byte[])

intread()
read(char[])

DesarrollodeAplicacionesWeb

Tema6

Resumentextualalternativo

Seala si es verdadera o falsa la siguiente afirmacin:


Para leer datos desde un fichero codificados en binario empleamos la clase
FileOutputStream.
Verdadero.

Falso.

5.3.Modosdeacceso.Registros.

En Java no se impone una estructura en un fichero, por lo que


conceptos como el de registro que si existen en otros lenguajes, en
principionoexistenenlosarchivosquesecreanconJava.Portanto,los
programadoresdebenestructurarlosficherosdemodoquecumplanconlosrequerimientosdesus
aplicaciones.
As,elprogramadordefinirsuregistroconelnmerodebytesqueleinteresen,movindoseluego
porelficheroteniendoencuentaesetamaoquehadefinido.
Se dice que un fichero es de acceso directo o de organizacin directa cuando para acceder a un
registro n cualquiera, no se tiene que pasar por los n1 registros anteriores. En caso contrario,
estamoshablandodeficherossecuenciales.
ConJavasepuedetrabajarconficherossecuencialesyconficherosdeaccesoaleatorio.
Enlosficherossecuenciales,lainformacinsealmacenademanerasecuencial,demaneraquepara
recuperarlasedebehacerenelmismoordenenquelainformacinsehaintroducidoenelarchivo.
Siporejemploqueremosleerelregistrodelficheroqueocupalaposicintres(enlailustracinsera
elnmero5),tendremosqueabrirelficheroyleerlosprimerostresregistros,hastaquefinalmente
leamoselregistronmerotres.
Porelcontrario,sisetrataradeunficherodeaccesoaleatorio,podramosaccederdirectamenteala
posicintresdelfichero,oalaquenosinteresara.

Seala la opcin correcta:


Java slo admite el uso de ficheros aleatorios.
Con los ficheros de acceso aleatorio se puede acceder a un registro determinado
directamente.
Los ficheros secuenciales se deben leer de tres en tres registros.
Todas son falsas.

5.4.Accesosecuencial.
En el siguiente ejemplo vemos cmo se escriben datos en un fichero secuencial: el nombre y
apellidosdeunapersonautilizandoelmtodo writeUTF()queproporciona DataOutputStream,
seguidodesuedadquelaescribimosconelmtodowriteInt()delamismaclase.Acontinuacin
escribimoslomismoparaunasegundapersonaydenuevoparaunatercera.Despuscerramosel
fichero.Yahoraloabrimosdenuevoparairleyendodemanerasecuenciallosdatosalmacenados
enelfichero,yescribindolosaconsola.
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package escylecsecuen;
import java.io.DataInputStream;
import java.io.DataOutputStream;

25

Almacenandodatos
import
import
import
import

DAW

java.io.FileInputStream;
java.io.FileNotFoundException;
java.io.FileOutputStream;
java.io.IOException;

/**
*
* @author JJBH
*/
public class escylee {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// Declarar un objeto de tipo archivo
DataOutputStream archivo = null ;
DataInputStream fich = null ;
String nombre = null ;
int edad = 0 ;
try {
// Creando o abriendo para aadir el archivo
archivo = new DataOutputStream( new FileOutputStream("c:\\secuencial.dat",true) );
// Escribir el nombre y los apellidos
archivo.writeUTF( "Antonio Lpez Prez
" );
archivo.writeInt(33) ;
archivo.writeUTF( "Pedro Piqueras Pearanda" );
archivo.writeInt(45) ;
archivo.writeUTF( "Jos Antonio Ruiz Prez " ) ;
archivo.writeInt(51) ;
// Cerrar fichero
archivo.close();
// Abrir para leer
fich = new DataInputStream( new FileInputStream("c:\\secuencial.dat") );
nombre = fich.readUTF() ;
System.out.println(nombre) ;
edad = fich.readInt() ;
System.out.println(edad) ;
nombre = fich.readUTF() ;
System.out.println(nombre) ;
edad = fich.readInt() ;
System.out.println(edad) ;
nombre = fich.readUTF() ;
System.out.println(nombre) ;
edad = fich.readInt() ;
System.out.println(edad) ;
fich.close();

} catch(FileNotFoundException fnfe) { /* Archivo no encontrado */ }


catch (IOException ioe) { /* Error al escribir */ }
catch (Exception e) { /* Error de otro tipo*/
System.out.println(e.getMessage());}
}
}

Fjatealver elcdigo,quehemostenidolaprecaucindeirescribiendolas cadenasdecaracteres


conelmismotamao,demaneraquesepamosluegoeltamaodelregistroquetenemosqueleer.
Por tanto para buscar informacin en un fichero secuencial, tendremos que abrir el fichero e ir
leyendoregistroshastaencontrarelregistroquebuscamos.

Y si queremos eliminar un registro en un fichero secuencial, qu hacemos? Esta operacin es un


problema, puesto que no podemos quitar el registro y reordenar el resto. Una opcin, aunque
costosa,seracrearunnuevofichero.Recorremoselficherooriginalyvamoscopiandoregistrosenel
nuevo hasta llegar al registro que queremos borrar. Ese no lo copiamos al nuevo, y seguimos
copiandohastaelfinal,elrestoderegistrosalnuevofichero.Deestemodo,obtendramosunnuevo
ficheroqueseraelmismoquetenamosperosinelregistroquequeramosborrar.Portanto,sise

26

DesarrollodeAplicacionesWeb

Tema6

prev que se va a borrar en el fichero, no es recomendable usar un fichero de este tipo, o sea,
secuencial.

Seala si es verdadera o es falsa la siguiente afirmacin:


Para encontrar una informacin almacenada en la mitad de un fichero secuencial, podemos
acceder directamente a esa posicin sin pasar por los datos anteriores a esa informacin.
Verdadero.

Falso.

5.5.Accesoaleatorio.
Avecesnonecesitamosleerunficherodeprincipioafin,sinoaccederalficherocomosifuerauna
base de datos, donde se accede a un registro concreto del fichero. Java proporciona la clase
RandomAccessFileparaestetipodeentrada/salida.
La clase RandomAccessFile permite utilizar un fichero de acceso aleatorio en el que el
programadordefineelformatodelosregistros.

RandomAccessFile objFile = new RandomAccessFile( ruta, modo );

Donderutaesladireccinfsicaenelsistemadearchivosymodopuedeser:
9
9

"r"paraslolectura.
"rw"paralecturayescritura.

La clase RandomAccessFile implementa los interfaces DataInput y DataOutput. Para abrir un


archivoenmodolecturaharamos:
RandomAccessFile in = new RandomAccessFile(input.dat, r);

Paraabrirloenmodolecturayescritura:
RandomAccessFile inOut = new RandomAccessFile(input.dat, rw);

Estaclasepermiteleeryescribirsobreelfichero,nosenecesitandosclasesdiferentes.

Hay que especificar el modo de acceso al construir un objeto de esta clase: slo lectura o
lectura/escritura.

Disponedemtodosespecficosdedesplazamientocomo seeky skipBytesparapodermoverse


deunregistroaotrodelfichero,oposicionarsedirectamenteenunaposicinconcretadelfichero.
Noestbasadaenelconceptodeflujosostreams.

En la siguiente presentacin vemos cmo crear un fichero, cmo podemos acceder, y actualizar
informacinenl.

Ficherosdeaccesoaleatorio
Crearfichero:
Debidoalaexistenciadedosconstructores,tenemosdosposibilidadesdeabrirunficherodeacceso
aleatorio:
9 Medianteelnombredelfichero:
miFichero = new RandomAccessFile(String nombre, String modo);

Medianteunobjetofile:

miFichero = new RandomAccessFile(File fichero, String modo);

27

Almacenandodatos

DAW

Elparmetromododeterminasisetieneaccesodeslolectura(r)obiendelectura/escritura(rw).
Porejemplo,sepuedeabrirunficherodeslolectura:
RandomAccessFile miRAFile;
miRAFile = new RandomAccessFile(/usr/bin/pepe.txt,rw);

Accederalainformacin:
9 ConunobjetoRandomAccessFilesetieneaccesoatodaslasoperacionesread()ywrite()delas
clasesDataInputStreamyDataOutputStream
9 Sedisponedemuchosmtodosparaubicarsedentrodeunfichero:
long getFilePointer()

Devuelvelaposicinactualdelpunterdelfichero

void seek(long pos)

Sita el puntero del fichero en una posicin determinada. La posicin se da como un


desplazamientoenbytesdesdeelcomienzodelfichero.Laposicin0marcaelcomienzode
esefichero

long length()

Devuelvelalongituddelfichero.Laposicinlength()marcaelfinaldeesefichero.

int skipBytes(int desplazamiento)

Desplaza el puntero desde la posicin actual, el nmero de bytes indicado por


desplazamiento

Actualizarlainformacin:
Conlosficherosdeaccesoaleatoriosepuedeaadirinformacinaunficheroaleatorioexistente.
Aqunosiramosalfinaldelfichero:
miFR = new RandomAccessFile(c:\\aleatorios\prueba.dat,rw);
miFR.seek(miFR.length());

Cualquierwrite()quehagamosapartirdeestepuntodelcdigoaadirinformacinalfichero.

Indica si es verdadera o es falsa la siguiente afirmacin:


Para decirle el modo de lectura y escritura a un objeto RandomAccessFile debemos pasar
como parmetro "rw".
Verdadero.

28

Falso.

DesarrollodeApllicacionesW
Web

Tema6
6

6.A
Aplicacio
onesdela
almacena
amientodeinform
macine
enfichero
os.
Caso
o prctico
Anto
onio ha qued
dado con Ana
a para estud
diar sobre el tema de fich
heros. De cam
mino a la bib
blioteca, Ana
a
le pre
egunta a Anttonio -Crees que los ficcheros se utillizan realmen
nte, o ya esttn desfasad
dos y slo se
e
utiliza
an las basess de datos? -Antonio
trass pensarlo un
n momento le
e dice a Ana
a -Yo creo qu
ue s, piensa
a
en el mp3 que ussas muchas veces,
v
la m
sica va grab
bada en ese tipo
t
de ficherros.

Has pensado la diversidad de ficheros que existe, segn la infformacin


quesseguarda?

otos que haces con tu cmara


c
digital, o con el mvil, se gu
uardan en
Las fo
ficheros. As, existe una gran cantidad de ficheros de imagen, segn el
mto
odoqueusen
nparaguard
darlainform
macin.Pore
ejemplo,ten
nemoslos
ficherosdeexten
nsin:.jpg,.tiiff,gif,.bmp,,etc.

sicaqueoyyesentump
p3oenelrep
productorde
emp3detu coche,est almacenadaaenficheross
Lam
queaalmacenanlaainformacinenformato
omp3.

Los sistemas
s
op
perativos, co
omo Linux, Windows, etc., estn constituido
os por un montn dee
instru
uccionesein
nformacinq
queseguardaenficheross.

Elpro
opiocdigo fuentedelo
oslenguajes deprogram
macin,como
oJava,C,etcc.,seguardaaenficheross
detextoplanolamayoradeveces.

Tamb
binseguard
daenfichero
oslaspelculaasenformatto.avi,.mp4,etc.

Y porr supuesto, se
s usan muccho actualmente los fich
heros XML, que
q al fin y al cabo son ficheros dee
texto
oplano,pero
oquesiguenunaestructu
uradetermin
nada.XMLseeempleamu
uchoparaelintercambio
o
deinfformacinestructuradaentrediferentesplataformas.

Parasaberms
Enellsiguienteeenlacealaw
wikipediapuedessabermssobreeelformato
oMp3.
http://es.wikipedia.org/wiki/M
MP3
Indicca si es verrdadera o faalsa la sigu
uiente afirm
macin:
Un fichero
fi
.bmpp guarda infformacin de
d msica co
odificada. Verdadero

o o falso?
Verddadero.

Falso.

29

Almacenandodatos

DAW

7.Utilizacindelossistemasdeficheros.
Caso prctico
Ana est estudiando en la biblioteca, junto a Antonio. Est repasando lo que le explicaron en clase
sobre las operaciones relativas a ficheros en Java. En concreto, est mirando lo relativo a crear
carpetas o directorios, listar directorios, borrarlos, operar en definitiva con ellos. Va a repasar ahora
en la biblioteca, para tener claros los conceptos y cuando llegue de vuelta a casa, probar a compilar
algunos ejemplos que a ella misma se le ocurran.

Hasvistoenlosapartadosanteriorescmooperarenficheros:abrirlos,cerrarlos,escribirenellos,
etc.

Lo que no hemos visto es lo relativo a crear y borrar directorios, poder filtrar archivos, es decir,
buscarsloaquellosquetengandeterminadacaracterstica,porejemplo,quesuextensinsea:.txt.

Ahoraveremoscmohacerestascosas,ytambincomoborrarficheros,ycrearlos,aunquecrearlos
yalohemosvistoenalgunosejemplosanteriores.

Parasaberms
Accediendoaesteenlace,tendrsunavisindetalladasobrelaorganizacindeficheros.
OrganizacindeFicherosyMtodosdeEnlacehttp://www.um.es/docencia/barzana/IAGP/Iagp7.html

7.1.ClaseFile.
LaclaseFileproporcionaunarepresentacinabstractadeficherosydirectorios.
Esta clase, permite examinar y manipular archivos y directorios, independientemente de la
plataformaenlaqueseesttrabajando:Linux,Windows,etc.

LasinstanciasdelaclaseFilerepresentannombresdearchivo,nolosarchivosensmismos.

El archivo correspondiente a un nombre dado podra ser que no existiera, por ello, habr que
controlarlasposiblesexcepciones.

AltrabajarconFile,lasrutaspuedenser:
9
9

Relativasaldirectorioactual.
Absolutassilarutaquelepasamoscomoparmetroempiezapor
Labarra"/"enUnix,Linux.
Letradeunidad(C:,D:,etc.)enWindows.
UNC(universalnamingconvention)enwindows,comoporejemplo:

File miFile=new File("\\\\mimaquina\\download\\prueba.txt");

AtravsdelobjetoFile,unprogramapuedeexaminarlosatributosdelarchivo,cambiarsunombre,
borrarlo o cambiar sus permisos. Dado un objeto file, podemos hacer las siguientes operaciones
conl:
9

Renombrarelarchivo,conelmtodorenameTo() (Consisteenunaseriedesentenciasparallevaracabouna
accin. Un mtodo est asociado a una clase. Puede tener parmetros de entrada y puede devolver un valor de retorno). El
objeto File dejar de referirse al archivo renombrado, ya que el String con el nombre del
archivoenelobjetoFilenocambia.

30

DesarrollodeAplicacionesWeb
9
9

9
9

Tema6

Borrarelarchivo,conelmtodo delete().Tambin,con deleteOnExit()seborracuando


finalizalaejecucindelamquinavirtualJava.
Crearunnuevoficheroconunnombrenico.Elmtodoesttico createTempFile()creaun
fichero temporal y devuelve un objeto File que apunta a l. Es til para crear archivos
temporales,queluegoseborran,asegurndonostenerunnombredearchivonorepetido.
Establecer la fecha y la hora de modificacin del archivo con setLastModified(). Por
File("prueba.txt").setLastModified(new
ejemplo, se podra hacer: new
Date().getTime()); para establecerle la fecha actual al fichero que se le pasa como
parmetro,enestecasoprueba.txt.
Crear un directorio con el mtodo mkdir(). Tambin existe mkdirs(), que crea los
directoriossuperioressinoexisten.
Listarelcontenidodeun directorio.Losmtodos list()y listFiles()listanelcontenido
de un directorio list() devuelve un vector de String con los nombres de los archivos,
listFiles()devuelveunvectordeobjetosFile.
Listar los nombres de archivo de la raz del sistema de archivos, mediante el mtodo esttico
listRoots().

Un objeto de la clase File representa un fichero en s mismo. Verdadero o falso?


Verdadero.

Falso.

7.2.InterfaceFilenameFilter.
Enocasionesnosinteresaverlalistadelosarchivosqueencajanconundeterminadocriterio.

As,nospuedeinteresarunfiltroparaverlosficherosmodificadosdespusdeunafecha,olosque
tienenuntamaomayordelqueindiquemos,etc.

Elinterface FilenameFiltersepuedeusarparacrearfiltrosqueestablezcancriteriosdefiltrado
relativos al nombre de los ficheros. Una clase que lo implemente debe definir e implementar el
mtodo:
boolean accept(File dir, String nombre)

Estemtododevolververdadero(true),enelcasodequeelficherocuyonombreseindicaenel
parmetronombreaparezcaenlalistadelosficherosdeldirectorioindicadoporelparmetrodir.

En el siguiente ejemplo vemos cmo se listan los ficheros de la carpeta c:\datos que tengan la
extensin .odt. Usamos try y catch para capturar las posibles excepciones, como que no exista
dichacarpeta.
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package filtrarficheros;
import java.io.File;
import java.io.FilenameFilter;
public class Filtro implements FilenameFilter {
String extension;
Filtro(String extension){
this.extension=extension;
}
public boolean accept(File dir, String name){
return name.endsWith(extension);
}

31

Almacenandodatos

DAW

public static void main(String[] args) {


try {
File fichero=new File("c:\\datos\\.");
String[] listadeArchivos = fichero.list();
listadeArchivos = fichero.list(new Filtrar(".odt"));
int numarchivos = listadeArchivos.length ;
if (numarchivos < 1)
System.out.println("No hay archivos que listar");
else
{
for(int conta = 0; conta < listadeArchivos.length; conta++)
System.out.println(listadeArchivos[conta]);
}
}
catch (Exception ex) {
System.out.println("Error al buscar en la ruta indicada");
}
}
}

Una clase que implemente FileNameFilter puede o no implementar el mtodo accept.


Verdadero.

Falso.

7.3.Creacinyeliminacindeficherosydirectorios.
Podemoscrearunficherodelsiguientemodo:
9

Creamoselobjetoqueencapsulaelfichero,porejemplo,suponiendoquevamosacrearun
ficherollamadomiFichero.txt,enlacarpetaC:\\prueba,haramos:

File fichero = new File("c:\\prueba\\miFichero.txt");


9

ApartirdelobjetoFile creamoselficherofsicamente,conlasiguienteinstruccin,que
devuelveunbooleanconvalortruesisecrecorrectamente,ofalsesinosepudocrear:

fichero.createNewFile()

Para borrar un fichero, podemos usar la clase File, comprobando previamente si existe, del
siguientemodo:
9

Fijamoselnombredelacarpetaydelficherocon:

File fichero = new File("C:\\prueba", "agenda.txt");


9

Comprobamossiexisteelficheroconexists()ysiesasloborramoscon:

fichero.delete();

Paracreardirectorios,podramoshacer:
package crearcarpetas;
import java.io.File;
/**
*
* @author JJBH
*/
public class CrearDirec {
public static void main(String[] args) {
try {
// Declaracin de variables

32

DesarrollodeAplicacionesWeb

Tema6

String directorio = "C:\\micarpeta";


String varios = "carpeta1/carpeta2/carpeta3";
// Crear un directorio
boolean exito = (new File(directorio)).mkdir();
if (exito)
System.out.println("Directorio: " + directorio + " creado");
// Crear varios directorios
exito = (new File(varios)).mkdirs();
if (exito)
System.out.println("Directorios: " + varios + " creados");
}catch (Exception e){
System.err.println("Error: " + e.getMessage());
}
}
}

Para borrar un directorio con Java tenemos que borrar cada uno de los ficheros y directorios que
stecontenga.Alpoderalmacenarotrosdirectorios,sepodrarecorrerrecursivamenteeldirectorio
parairborrandotodoslosficheros.

Sepuedelistarelcontenidodeldirectoriocon:
File[] ficheros = directorio.listFiles();

y entonces poder ir borrando. Si el elemento es un directorio, lo sabemos mediante el mtodo


isDirectory,

33

Almacenandodatos

DAW

8.Almacenamientodeobjetosenficheros.Persistencia.Serializacin.
Caso prctico
Para la aplicacin de la clnica veterinaria Mara le propone a Juan emplear un fichero para guardar
los datos de los clientes de la clnica. -Como vamos a guardar datos de la clase Cliente, tendremos
que serializar los datos.

Queslaserializacin?Esunprocesoporelqueunobjetoseconvierteenunasecuenciadebytes
conlaquemstardesepodrreconstruirelvalordesusvariables.Estopermiteguardarunobjeto
enunarchivo.

Paraserializarunobjeto:
9

ste debe implementar el interface java.io.Serializable. Este interface no tiene


mtodos, slo se usa para informar a la JVM (Java Virtual Machine) que un objeto va a ser
serializado.
9 TodoslosobjetosincluidosenltienenqueimplementarelinterfazSerializable.
Todos los tipos primitivos en Java son serializables por defecto. (Al igual que los arrays y otros
muchostiposestndar).

Paraleeryescribirobjetosserializablesaunstreamseutilizanlasclasesjava:ObjectInputStream
yObjectOutputStream.

Enelsiguienteejemplosepuedevercmoleerunobjetoserializadoqueseguardantes.Eneste
caso,setratadeunStringserializado:
FileInputStream fich = new FileInputStream(str.out);
ObjectInputStream os = new ObjectInputStream(fich);
Object o = os.readObject();

As vemos que readObject lee un objeto desde el flujo de entrada fich. Cuando se leen objetos
desdeunflujo,sedebetenerencuentaqutipodeobjetosseesperanenelflujo,ysehandeleeren
elmismoordenenqueseguardaron.

Para serializar un fichero basta con implementar el interface Serializable.


Verdadero.
Falso.
Parasaberms
Enelsiguienteenlaceapuedesverunpocomssobreserializacin.
SerializacinenJava.http://nereida.deioc.ull.es/~cleon/psd/0405/prct/p5/pspdf/p5.ps
MssobreserializacinenJava.http://www2.uah.es/jcaceres/cursos/java/archivos/capsulas/capsula_serializable.pdf

8.1.Serializacin:utilidad.
LaserializacinenJavasedesarrollparautilizarseconRMI.RMInecesitabaunmododeconvertir
los parmetros necesarios a enviar a un objeto en una mquina remota, y tambin para devolver
valoresdesdeella,enformadeflujosdebytes.Paradatosprimitivosesfcil,peroparaobjetosms
complejosnotanto,yesemecanismoesprecisamenteloqueproporcionalaserializacin.

Elmtodo writeObjectseutilizaparaguardarunobjetoatravsdeunflujodesalida.Elobjeto
pasadoawriteObjectdebeimplementarelinterfazSerializable.

34

DesarrollodeAplicacionesWeb

Tema6

FileOutputStream fisal = new FileOutputStream(cadenas.out);


ObjectOutputStream oos = new ObjectOutputStream(fisal);
Oos.writeObject();

LaserializacindeobjetosseempleatambinenlaarquitecturadecomponentessoftwareJavaBean.
Lasclasesbeansecarganenherramientasdeconstruccindesoftwarevisual,comoNetBeans.Con
la paleta de diseo se puede personalizar el bean asignando fuentes, tamaos, texto y otras
propiedades.

Unavezquesehapersonalizadoelbean,paraguardarlo,seemplealaserializacin:sealmacenael
objetoconelvalordesuscamposenunficheroconextensin.ser,quesueleemplazarsedentrode
unfichero.jar.

Parasaberms
Enesteenlaceapuedesverunvdeoenelquesecreaunaaplicacinsobreserializacin.No
esthechaconNetBeans,sinoconEclipse,peroesonopresentaningninconveniente.
http://www.youtube.com/watch?v=4eU6WMOVMh4&feature=player_embedded

35

TEMA7

INDICE
1.Introduccin........................................................................................................................................4
2.LibrerasdeJavaparadesarrollarGUIs...............................................................................................5
2.1AWT...............................................................................................................................................................6
PrincipalescomponentesAWT..........................................................................................................................................6
2.2Swing.............................................................................................................................................................7
ComponentesdeSwing.....................................................................................................................................................7
3. Creacin de interfaces grficos de usuario utilizando asistentes y herramientas del entorno
integrado...............................................................................................................................................14
3.1Diseandoconasistentes............................................................................................................................14
4.Eventos..............................................................................................................................................19
4.1Introduccin................................................................................................................................................19
Quesunevento?.........................................................................................................................................................19
Queslaprogramacinguiadaporeventos?...............................................................................................................19
4.2Modelodegestindeeventos....................................................................................................................19
Ejemplodelmodelodegestindeeventos....................................................................................................................21
4.3Tiposdeeventos.........................................................................................................................................24
4.4Eventosdeteclado......................................................................................................................................24
Cdigodeloyentedeteclado..........................................................................................................................................25
4.5Eventosderatn.........................................................................................................................................26
4.6Creacindecontroladoresdeeventos.......................................................................................................29
5.Generacindeprogramasenentornogrfico..................................................................................30
5.1Contenedores..............................................................................................................................................30
5.2Cerrarlaaplicacin......................................................................................................................................31
5.3Organizadoresdecontenedores:layoutmanagers....................................................................................31
5.4Contenedorligero:JPanel...........................................................................................................................33
5.5Etiquetasycamposdetexto.......................................................................................................................33
PropiedadesasociadasaJTextField,ylosmtodosquepermitenmodificarlas.............................................................34
5.6Botones.......................................................................................................................................................35
5.7Casillasdeverificacinybotonesderadio.................................................................................................36
5.8Listas............................................................................................................................................................36
5.8.1Listas(II).................................................................................................................................................................39
EjemploCopiarunalistaaotra....................................................................................................................................39
5.9Listasdesplegables......................................................................................................................................40
EjemploPruebaJComboBox...........................................................................................................................41
5.10Mens.......................................................................................................................................................42
EjemploPruebaMenu..................................................................................................................................................42
5.10.1Separadores..........................................................................................................................................................45
5.10.2Aceleradoresdetecladoymnemnicos...............................................................................................................46

Comunicndonosconelusuario.Interfaces

DAW

DesarrollodeAplicacionesWeb

Comunicndonos
Interfaces

Tema7

con

el

usuario.

CASO.
Ana est cursando el mdulo de Programacin. En el aula, suele sentarse junto a un compaero:
Jos Javier. En clase llevan unos das explicndoles cmo construir aplicaciones Java, utilizando
interfaces grficas de usuario (GUI). Pero, qu es una interfaz de usuario? A grandes rasgos, les
han comentado que una interfaz de usuario es el medio con que el usuario puede comunicarse con
una computadora. Las interfaces grficas de usuario incluyen elementos tales como: mens,
ventanas, paneles, etc, en general, elementos grficos que facilitan la comunicacin entre el ser
humano y la computadora.
Hasta ahora, las aplicaciones de ejemplo que haban realizado, estaban en modo consola, o modo
carcter, y estn contentos porque estn viendo las posibilidades que se les abren ahora. Estn
comprobando que podrn dar a sus aplicaciones un aspecto mucho ms agradable para el usuario.
Ana le comenta a Jos Javier:
-As podremos dar un aspecto profesional a nuestros programas.

Comunicndonosconelusuario.Interfaces

DAW

1.Introduccin.
Hoyendalasinterfacesdelosprogramassoncadavezmssofisticadasyatractivasparaelusuario.
Sonintuitivasycadavezmsfcilesdeusar:pantallastctiles,etc.
Sin embargo, no siempre ha sido as. No hace muchos aos, antes de que surgieran y se
popularizaran las interfaces grficas de usuario para que el usuario interactuara con el sistema
operativo con sistemas como Windows, etc, se trabajaba en modo consola, o modo carcter, es
decir,seledabanlasordenesalordenadorconcomandosporteclado,dehecho,porentoncesno
existaelratn.
Asque,coneltiempo,conlaideadesimplificarelusodelosordenadoresparaextenderelusoaun
cada vez mayor espectro de gente, de usuarios de todo tipo, y no slo para los expertos, se ha
convertidoenunaprcticahabitualutilizarinterfacesgrficasdeusuario(IGUGUIeningls),para
queelusuariointeracteyestablezcauncontactomsfcileintuitivoconelordenador
En ocasiones, vers otras definiciones de interfaz, como la que define una interfaz como un
dispositivo que permite comunicar dos sistemas que no hablan el mismo lenguaje. Tambin se
emplea el trmino interfaz para definir el juego de conexiones y dispositivos que hacen posible la
comunicacinentredossistemas.
Aquenelmdulo,cuandohablamosdeinterfaznosreferimosalacaravisibledelosprogramastaly
comosepresentaalosusuariosparaqueinteractenconlamquina.Lainterfazgrficaimplicala
presencia de un monitor de ordenador, en el que veremos la interfaz constituida por una serie de
menseiconosquerepresentanlasopcionesqueelusuariopuedetomardentrodelsistema
Las interfaces grficas de usuario proporcionan al usuario ventanas, cuadros de dilogo, barras de
herramientas, botones, listas desplegables y muchos otros elementos. Las aplicaciones son
conducidasporeventosysedesarrollanhaciendousodelasclasesqueparaellonosofreceelAPIde
Java.

En1981aparecieronlosprimerosordenadorespersonales,losllamadosPCs,perohasta1993nose
generalizaron las interfaces grficas de usuario. El escritorio del sistema operativo Windows de
Microsoft y su sistema de ventanas sobre la pantalla se ha estandarizado y universalizado, pero
fueronlosordenadoresMacintoshdelacompaaApplelospionerosenintroducirlasinterfaces
grficasdeusuario.

Enelsiguienteenlacepuedesverlaevolucinenlasinterfacesgrficasdediversosoftware,
entreellos,eldelasGUIdeMACOS,odeWindowsenlassucesivasversiones
http://www.guidebookgallery.org/screenshots

Seala la opcin correcta acerca de las interfaces grficas de usuario:


Son sinnimos de ficheros de texto.
Las ventanas de una aplicacin no seran un ejemplo de elemento de interfaz grfica de

usuario.
Surgen con la idea de facilitar la interactuacin del usuario con la mquina.
Ninguna es correcta.

DesarrollodeApllicacionesW
Web

Tema7
7

2.LibrerasdeJavap
paradesa
arrollarG
GUIs.
CASO
O.
Jos
Javier est
un poco ab
brumado por la cantidad de
d compone
entes que tien
ne Java para
a desarrollarr
interffaces grfico
os. Piensa que hay tanto
os, que son tantas clase
es, que nuncca podr aprendrselos..
Ana le
l dice:
-Jos Javier, no
o te preocup
pes, seguro que
q
haciend
do programa
as, enseguida
a ubicars los
l que mss
utilice
es, y el resto
o, siempre tie
enes la docum
mentacin de
e Java para cuando dude
es, consultarrla.

Hemo
os visto quee la interfaz grfica de usuario es la parte dell programa que permite
e al usuario
o
interaaccionarcon
nl.Pero,c
molapodeemoscrearenJava?
El AP
PI (Application Program
mming Interfface) de Javva proporcio
ona una librera de claases para ell
desarrrollo de intterfaces grfficas de usuario (en realidad son do
os: AWT y SSwing). Esass libreras see
englo
obanbajolossnombresde AWT y Swing ,queasuvvezformanp
partedelasJJavaFoundaationClassess
oJFC
C.
Entree las clases de
d las JFC haay un grupo de elementtos importan
nte que ayud
da a la consstruccin de
e
interffacesgrficaasdeusuario
o(GUI)enJaava.
Loselementosqu
uecomponen
nlasJFCson:
9 Componente
C
es
Swingg:
encontramos
componentess tales como botones, cuadros
tanasoelem
d
detexto,ven
mentosdemen.
9 Soporte
S
de diferentes aspecctos y
comportamie
entos (Look and Feel): Permite
laa eleccin de diferentes aparien
ncias de
e
entorno.
Porr ejemplo, el
e mismo programa
p
puede
adqu
uirir un asspecto Mettal Java
(m
multiplataforma, iguaal en cualquier
c
e
entorno),
Motif (el asp
pecto estndar para
e
entornosUni
ix)oWindow
ws(paraenttornosWindows).Deesttaforma,el aspectode laaplicacin
n
p
puede
ser ind
dependientee de la plataaforma, lo cu
ualest muyy bien para u
un lenguaje que lleva laa
seadeidenttidaddemulltiplataformaa,ysepuede
eelegirelquesedeseeeencadamom
mento.
9 In
nterfaz de programaci
p
n Java 2D: permite inccorporar grficos en do
os dimension
nes, texto e
e
im
mgenesdealtacalidad..
9 Soportedea
S
arrastraryso
oltar(DragaandDrop)en
ntreaplicacio
onesJavayaaplicaciones nativas(est
diiseadaparaejeccutarseenelentornoinformtico
o(lenguajedem
quinaysistemaoperativo)alqueesehacereferenccia.Eltrminosee
em
mplea en contra
aposicin a una aplicacin, porr ejemplo, escrita en Java que no es nativa, n
no est diseada
a para una sola
a
pllataforma). Es decir, se im
mplementa un
u portapap
peles. Llamamos aplicaciones nativaas a las quee

eestndesarro
olladasenun
nentornoy unaplataforrmaconcretos(porejem
mploWindow
wsoUnix),yy
slofuncionaarnenesap
plataforma.
9 Soportedeim
S
mpresin.
9 Soportesonid
S
do:Captura,,reproducci
nyprocesaamientoded
datosdeaudioyMIDI
9 Soporteded
S
ispositivosd
deentradad
distintosdelteclado,parrajapons,chino,etc.
9 Soportedefu
S
uncionesdeAccesibilidaad,paracreaarinterfacesparadiscap
pacitados:Pe
ermiteeluso
o
d tecnologaas como los lectores dee pantallas o
de
o las pantallas Braille ad
daptadas a las personass
d
discapacitada
as.
Coneestaslibreraas,Javaprop
porcionauncconjuntode herramientaasparalaconstruccind
deinterfacess
grficcasquetieneenunaaparienciayseccomportand
deformasem
mejanteenttodaslasplataformasen
n
lasqu
ueseejecuteen.

Seaala la opcin incorrectta. JFC con


nsta de los siguientes elementos:
e
Componenttes Swing.
Soporte de diversos lo
ook and feeel.
Soporte de impresin.

Interfaz dee programaacin Java 3D.

Comunicndonosconelusuario.Interfaces

DAW

2.1AWT.
Cuando apareci Java, los componentes grficos disponibles para el desarrollo de GUI se
encontrabanenlalibreradenominadaAbstractWindowToolkit(AWT).
Las clases AWT se desarrollaron usando cdigo nativo (o sea, cdigo asociado a una plataforma
concreta). Eso dificultaba la portabilidad de las aplicaciones. Al usar cdigo nativo, para poder
conservarlaportabilidaderanecesariorestringirlafuncionalidadalosmnimoscomunesatodaslas
plataformas donde se pretenda usar AWT. Como consecuencia, AWT es una librera con una
funcionalidadmuypobre.
Laestructurabsicadelalibreragiraentornoacomponentesycontenedores.
Los contenedores contienen componentes y son componentes a su vez, de forma que los eventos
puedentratarsetantoencontenedorescomoencomponentes.
AWTesadecuadaparainterfacesgrficassencillas,peronoparaproyectosmscomplejos.
Ms tarde, cuando apareci Java 2 surgi una librera ms robusta, verstil y flexible: Swing. AWT
ansigueestandodisponible,dehechoseusaporloscomponentesdeSwing.
PrincipalescomponentesAWT
NOMBREDELACLASEAWT UTILIDADDELCOMPONENTE
Applet
Ventanaparaunaappletqueseincluyeenunapginaweb.
Button
Creaunbotndeaccin.
Creaunreadetrabajoenlaquesepuededibujar.
Canvas
EselnicocomponenteAWTquenotieneunequivalenteSwing.
Checkbox
Creaunacasilladeverificacin.
Label
Creaunaetiqueta.
Menu
Creaunmen.
ComboBox
Creaunalistadesplegable.
List
Creauncuadrodelista.
Frame
Creaunmarcoparalasventanasdeaplicacin.
Dialog
Creauncuadrodedilogo.
Creaunreadetrabajoquepuedecontenerotroscontroleso
Panel
componentes.
PopupMenu
Creaunmenemergente.
RadioButton
Creaunbotnderadio.
ScrollBar
Creaunabarradedesplazamiento.
ScrollPane
Creauncuadrodedesplazamiento.
TextArea
Creaunreadetextodedosdimensiones.
TextField
Creauncuadrodetextodeunadimensin.
Window
Creaunaventana.

PginaoficialdeSunOraclesobreAWT(eningls)
http://download.oracle.com/javase/6/docs/technotes/guides/awt/

AWTsiguesiendoimprescindible,yaquetodosloscomponentesSwingseconstruyenhaciendouso
de clases de AWT. De hecho, como puedes comprobar en el API, todos los componentes Swing,
como por ejemplo JButton (es la clase Swing que usamos para crear cualquier botn de accin en
unaventana),derivandelaclase JComponent ,queasuvezderivadelaclaseAWT Container .
LasclasesasociadasacadaunodeloscomponentesAWTseencuentranenelpaquetejava.awt.
Las clases relacionadas con el manejo de eventos en AWT (Es el modo que tiene una clase de proporcionar
notificacionesalosclientesdelaclasecuandoocurrealgodignoderesearenunobjeto.Elusomshabitualparaloseventosseproduce

DesarrollodeAplicacionesWeb

Tema7

enlasinterfacesgrficas;normalmente,lasclasesquerepresentancontrolesdelainterfazdisponendeeventosquesenotificancuandoel
usuariointeractaconelcontrol(porejemplo,hacerclicenunbotn))estnenelpaquetejava.awt.event.

AWTfuelaprimeraformadeconstruirlasventanasenJava,pero:
9 limitabalaportabilidad,
9 restringalafuncionalidady
9 requerademasiadosrecursos.

AWT est indicado para proyectos muy grandes y de gran complejidad.


Si
No

Decamos ms arriba, que las JFC proporcionan soporte para impresin. En el siguiente
enlacetienesmsinformacinsobreimpresinenJava.
http://artemisa.unicauca.edu.co/~dparedes/java/jdcbook/render.html

2.2Swing.
Cuando se vio que era necesario mejorar las caractersticas que ofreca AWT, distintas empresas
empezaron a sacar sus controles propios para mejorar algunas de las caractersticas de AWT. As,
NetscapesacunalibreradeclasesllamadaInternetFoundationClassesparausarconJava,yeso
oblig a Sun (todava no adquirida por Oracle) a
reaccionar para adaptar el lenguaje a las nuevas
necesidades.
Se desarroll en colaboracin con Netscape todo el
conjunto de componentes Swing que se aadieron a la
JFC.
SwingesunalibreradeJavaparalageneracindelGUI
en aplicaciones. Swing se apoya sobre AWT y aade
JComponents. La arquitectura de los componentes de
Swing facilita la personalizacin de apariencia y
comportamiento, si lo comparamos con los
componentesAWT.

AcontinuacintienesunatablaconlalistadeloscontrolesSwingmshabituales.Debes
tener en cuenta que las imgenes estn obtenidas eligiendo el aspecto (LookAndFeel)
multiplataformapropiodeJava.
ComponentesdeSwing
JApplet
VentanaparaunaAppletqueseincluyeenunapginaweb

Botndeaccin.Pararealizar
JButton
algunaaccinoproceso.

Comunicndonosconelusuario.Interfaces

JColorChooser

Casilladeverificacin.Seusa
normalmenteparaindicaropcionesque
sonindependientes,pudindose
seleccionaralgunas,todasoninguna

Paneldecontrolesquepermiteal
usuarioseleccionaruncolor

JComboBox

Listadesplegable

JCheckBox

JComponent
JDesktopPane

JDialog

JEditorPane

JFileChooser

DAW

ClasebaseparaloscomponentesSwing
Contenedorusadoparacrearunescritorio,esdeciruninterfazpara
mltiplesdocumentosenlamismaaplicacin

Clasebaseparacrearuncuadrode
dilogo.Loscuadrosdedilogoson
ventanasquesolicitanoproporcionan
informacinalusuario

Componentedetextoparaeditarvariostiposdecontenido

Permitealusuarioelegirun
archivoparalalecturao
escritura,mostrandouna
ventanaquenospermite
navegarporlosdistintosdiscosy
carpetasdenuestroordenador

DesarrollodeAplicacionesWeb

JFrame

JInternalFrame

JLabel

JLayeredPane

JList

JMenu

JMenuBar

JMenuItem

Tema7

VersinextendidadeFramede
AWT.Creaunmarcoparalas
ventanasdeaplicacin,dando
soportealospanelesbasey
otrospaneles.Suelenserlas
ventanasprincipalesdela
aplicacin

Unaventanadepesoligero,quese
incluyedentrodeunmarcoJFrame,de
formaquenopuedesacarsedelinterior
deeseJFrame.Escomounnuevo
documentoenlaaplicacinprincipal

Unaetiquetaquepuede
conteneruntextocorto,ouna
imagen,oambascosas
AadecapasauncontenedorSwing,deformaquesepuedansolapar
unoscomponentesconotros

Uncuadrodelistaparaseleccionarunoo
varioselementosdeunalista

Unmendelista
desplegable,queincluye
JMenuItemsyquese
visualizadentrodela
barrademen
(JMenuBar)
Unabarrademen,que
aparecegeneralmente
situadadebajodelabarra
dettulodelaventana

Cadaunadelasopcionesde
unmenconcreto

Comunicndonosconelusuario.Interfaces
JOptionPane

JPanel

JPasswordField

JPopUpMenu

JPopMenu.Separator

JProgressBar

JRadioButton

JRadioButtonMenuItem

JRootPane
JScrollBar

10

DAW

Proporcionaimplementacionesde
cuadrosdedilogoemergentes,mso
menosestndaryprefabricados,
queelusuariopuedeincluircon
muchafacilidadensuaplicacin
Unreadetrabajoquepuedecontenerotroscontrolesocomponentes.
EsuncontenedorSwingdepesoligero
Uncuadrodetextodondenose
muestranloscaracteresque
realmenteseintroducen,sinoalgn
otro(puntosoasteriscos).Seusapara
introducircontraseasdeformaque
otraspersonasnopuedanverelvalor
introducido

Unmenemergente.Laimagendelejemploest
sacadadeunaaplicacindedibujo

Separadorparaunmenemergente
especfico.Permitehacergruposcon
opcionesdentrodelmen.

Unabarradeprogreso,que
visualizagrficamenteun
valorenteroenunintervalo

Creaunbotnderadio.Seusa
normalmenteparaseleccionaruna
opcindeentrevariasexcluyentes
entres

Botndeopcinparaunelemento
deunmen
Componentefundamentalenlajerarquadelcontenedor.Eselpanel
raz.
Unabarradedesplazamiento

DesarrollodeAplicacionesWeb

JScrollPane

Tema7

Panelcontenedorquegestionalas
barrasdedesplazamiento
verticalesyhorizontalesylas
cabecerasdefilasycolumnas.

JSeparator

Separadordemen

JSlider

JSplitPane

JSpinner

JTabbedPane

Barradeslizante.Componenteque
permiteseleccionarunvalorenun
intervalodeslizandounbotn

Paneldivididoendossubpaneles
cuyotamaorelativopuede
modificarsepinchandoy/o
arrastrandolaseparacinentre
ambos

Uncuadrodeentradadeunalneaque
permiteseleccionarunnmero(oelvalor
deunobjeto)deunasecuenciaordenada.
Normalmenteproporcionaunparde
botonesdeflecha,parapasaralsiguienteo
anteriornmero,(oalsiguienteoanterior
valordelasecuencia).

Panelquecontienemltiples
subpaneles,quepuedenser
seleccionadoshaciendoclic
sobrelapestaadecadauno

11

Comunicndonosconelusuario.Interfaces

JTable

Unatablabidimensionalpara
presentardatos

JTextArea

Creaunreadetextodedosdimensiones
paratextoplano

JTextField

Creauncuadrodetextodeuna
dimensin

JTextPane
JToggleButton

JToolBar
JToolBar.Separator

JToolTip

JTree

JViewPort
JWindow

12

DAW

Componentedetextoquesepuedemarcarconatributos

Botndedosestados(on/offo
pulsado/sinpulsar)
Barradeherramientas,para
visualizarcontrolesusados
normalmente.
Separadorespecficode
barrasdeherramientas
Unaespeciedeetiquetaemergente,que
apareceparavisualizarlautilidaddeun
componentecuandoelcursordelratn
pasaporencimadeldetenindose
brevemente,sinnecesidaddepulsarnada.

Visualizaunconjuntodedatosjerrquicosenformade
rbol

Vistapormediodelacualsevelainformacinsubyacente.Cuandose
hacescrollrealmenteloquesemuevenoeslainformacin,sinoel
JViewportatravsdelcualselamira
Ventanaquepuedevisualizarseencualquiersitiodelescritorio

DesarrollodeAplicacionesWeb

Tema7

PorcadacomponenteAWT(exceptoCanvas)existeuncomponenteSwingequivalente,cuyonombre
empieza por J, que permite ms funcionalidad siendo menos pesado. As, por ejemplo, para el
componente AWT Button existe el equivalente Swing JButton, que permite como funcionalidad
adicionalladecrearbotonescondistintasformas(rectangulares,circulares,etc),incluirimgenesen
elbotn,tenerdistintasrepresentacionesparaunmismobotnsegnestseleccionado,obajoel
cursor,etc.
LaraznporlaquenoexisteJCanvasesquelospanelesdelaclaseJPanelyasoportantodoloqueel
componente Canvas de AWT soportaba. No se consider necesario aadir un componente Swing
JCanvasporseparado.

AlgunascaractersticasmsdeSwing,podemosmencionar:
9 Esindependientedelaarquitectura(metodologanonativapropiadeJava)
9 Proporciona todo lo necesario para la creacin de entornos grficos, tales como diseo de
mens,botones,cuadrosdetexto,manipulacindeeventos,etc.
9 LoscomponentesSwingnonecesitanunaventanapropiadelsistemaoperativocadauno,sino
que son visualizados dentro de la ventana que los contiene mediante mtodos grficos, por lo
querequierenbastantesmenosrecursos.
9 LasclasesSwingestncompletamenteescritasenJava,conloquelaportabilidadestotal,ala
vez que no hay obligacin de restringir la funcionalidad a los mnimos comunes de todas las
plataformas
9 Por ello las clase Swing aportan una considerable gama de funciones que haciendo uso de la
funcionalidadbsicapropiadeAWTaumentanlasposibilidadesdediseodeinterfacesgrficas.
9 Debido a sus caractersticas, los componentes AWT se llaman componentes de peso pesado
por la gran cantidad de recursos del sistema que usan, y los componentes Swing se llaman
componentes de peso ligero por no necesitar su propia ventana del sistema operativo y por
tantoconsumirmuchosmenosrecursos.
9 Aunque todos los componentes Swing derivan de componentes AWT y de hecho se pueden
mezclar en una misma aplicacin componentes de ambos tipos, se desaconseja hacerlo. Es
preferibledesarrollaraplicacionesenteramenteSwing,querequierenmenosrecursosysonms
portables.

13

Comunicndonosconelusuario.Interfaces

DAW

3. Creacin de interfaces grficos de usuario utilizando asistentes y


herramientasdelentornointegrado.
CASO.
Ana le ha tomado el gusto a hacer programas con la librera Swing de Java y utilizando el IDE
NetBeans. Le parece tan fcil que no lo puede creer. Pensaba que sera difcil el uso de los controles
de las libreras, pero ha descubierto que es poco menos que cogerlos de la paleta y arrastrarlos hasta
el formulario donde quiere situarlos.
- Pero si esto lo podra hacer hasta mi sobrino pequeo, piensa para s.

Crearaplicacionesqueincluyaninterfacesgrficosdeusuario,conNetBeans,esmuysencillodebido
alasfacilidadesquenosproporcionansusasistentesyherramientas.
ElIDEdeprogramacinnosproporcionaundiseadorparacrearaplicacionesdeunamanerafcil,
sin tener que preocuparnos demasiado del cdigo. Simplemente nos debemos centrar en el
funcionamientodelasmismas.
Un programador experimentado, probablemente no utilizar los asistentes, sino que escribir, casi
siempre,todoelcdigodelaaplicacin.Deestemodo,podrindicarporcdigolaubicacindelos
diferentes controles, de su interfaz grfica, en el contenedor (panel, marco, etc) en el que se
ubiquen.
Peroenelcasodeprogramadoresnovatos,osimplementesiqueremosahorrartiempoyesfuerzo,
tenemos la opcin de aprovecharnos de las capacidades que nos brinda un entorno de desarrollo
visualparadiseareimplementarformulariosgrficos.
AlgunasdelascaractersticasdeNetBeans,queayudanalageneracinrpidadeaplicaciones,yen
particulardeinterfacesson:
9 Modo de diseo libre (Free Design): permite mover
libremente los componentes de interfaz de usuario sobre el
panelomarco,sinatenerseaunodeloslayoutspordefecto.
9 Independencia de plataforma: diseando de la manera ms
fcil, es decir, arrastrando y soltando componentes desde la
paleta al rea de diseo visual, el NetBeans sugiere
alineacin, posicin, y dimensin de los componentes, de
manera que se ajusten para cualquier plataforma, y en
tiempodeejecucinelresultadoseaelptimo,sinimportar
elsistemaoperativodondeseejecutelaaplicacin.
9 Soporte de internacionalizacin. Se pueden internacionalizar
lasaplicacionesSwing,aportandolastraduccionesdecadenasdecaracteres,imgenes,etc,sin
necesidad de tener que reconstruir el proyecto, sin tener que compilarlo segn el pas al que
vaya dirigido. Se puede utilizar esta caractersticas empleando ficheros de recursos
(ResourceBundlefiles). Enellos,deberamosaportartodoslostextosvisibles,comoeltextode
etiquetas, campos de texto, botones, etc. NetBeans proporciona una asistente de
internacionalizacindesdeelmendeherramientas(Tools).

AUTOEVALUACIN.
NetBeans ayuda al programador de modo que pueda concentrarse en implementar la lgica de
negocio que se tenga que ejecutar por un evento dado.
Si
No

3.1Diseandoconasistentes.
Lospasosparacrearyejecutaraplicaciones,sepuedenresumiren:
9 Crearunproyecto.
9 Construirlainterfazconelusuario.

14

DesarrollodeAplicacionesWeb

Tema7

9 Aadirfuncionalidad,enbasealalgicadenegocio(Es la parte de la aplicacin que contiene el cdigo de las


tareasrelacionadasconlosprocesosdeunnegocio,talescomoventas,controldeinventario,contabilidad,etc.Normalmenterealizan
procesostalescomoentradasdedatos,consultasalosdatos,generacindeinformesymsespecficamentetodoelprocesamiento
queserealizadetrsdelaaplicacinvisibleparaelusuario)queserequiera.
9 Ejecutarelprograma.
Veamosunejemploconestospasos:
9 Primero,creaelproyectodelamaneratansimplecomopuedesveren:

15

Comunicndonosconelusuario.Interfaces

DAW

9 Acontinuacin,crealainterfazdeusuariotalycomovesen:

NecesitamoscrearuncontenedorJava
enelcualdispondremoslosotros
componentesdeinterfazgrficode
usuarionecesarios.

SeleccionamosBordeconttuloy
escribimosSumadeNmerosenel
campottulo.

16

DesarrollodeAplicacionesWeb

Tema7

Cdigoquesegeneradeformaautomtica,ydondeincluiremoslopuestoennegrita.
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}

ProcederemosigualparaelbotnLimpiardondepondremos:
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
jTextField1.setText("");
jTextField2.setText("");
jTextField3.setText("");
}

Deigualformaparaelbotnaadirteclearemos:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// Primero definimos las variables float
float num1, num2, result;
// Convertimos el texto a float
num1 = Float.parseFloat(jTextField1.getText());
num2 = Float.parseFloat(jTextField2.getText());
// Realizamos la suma
result = num1 + num2;
// Pasamos el valor del resultado al jTextField3
// A la misma vez, pasamos el valor de float a string
jTextField3.setText(String.valueOf(result));
}

ElIDE,ennuestrocasoNetBeans,puedeayudarnosaencontrarlalistadeeventosdisponiblesque
nuestroscomponentesGUIpuedenmanejar.
Cuandoestamosdiseandoelinterfaz,seleccionandocualquiercomponente,sepuedeaccederala
pestaaeventos.
En la pestaa Events podemos ver y editar manejadores de eventos asociados al componente GUI
activoactualmente.

17

Comunicndonosconelusuario.Interfaces

DAW

Cadavezquesepresionaunbotn,segeneraun ActionEvent ysepasaalmtodo actionPerformed


del listener ,elcual,ejecutaelcdigoquenosotrosdispusimosenelmanejadordeeventoparaeste
evento.
Para ser capaz de responder, cada componente GUI interactivo necesita registrar a un oyente de
eventosynecesitaimplementarunmanejadordeeventos.
Comovemos,elIDENetBeansseencargadeenganchareloyentedeeventopornosotros,demanera
quepodamosconcentrarnosenimplementarlalgicadenegocioquesetengaqueejecutarporel
evento.

En el siguiente enlace puedes ver, paso a paso, la creacin de un proyecto, que utiliza
interfazgrficadeusuario,conNetBeans,
http://www.udb.edu.sv/Academia/Laboratorios/informatica/Java/guia6Java.pdf

En este otro enlace tambin tienes un documento muy interesante, tambin paso a paso,
sobreconstruccindeinterfacesgrficosconNetBeans.
ftp://soporte.uson.mx/PUBLICO/02_ING.SISTEMAS.DE.INFORMACION/7_Interfaces_grficos_
de_usuario_con_Netbeans_ESPANHOL.pdf

Enelsiguientevdeopuedeverelprimerodeunaseriedecincovdeosenlosqueserealiza
unacalculadoraconlaayudadelosasistentesdeNetBeans.
http://www.youtube.com/watch?v=A9ZX5rWcDOE&feature=related

18

DesarrollodeAplicacionesWeb

Tema7

4.Eventos.
4.1Introduccin.
CASO.
Ana sabe que entender cmo funciona la programacin por eventos es algo relativamente fcil, el
problema est en utilizar correctamente los eventos ms adecuados en cada momento. Ana tiene
muy claro que el evento se asocia a un botn cuando se pulsa, pero Jos Javier la pone en duda,
cuando la llama por telfono para preguntarle unas dudas y le dice, que l cree, que el evento se
produce cuando el botn se suelta. Adems, le recuerda que en clase dijeron que al ser enfocado con
el ratn, o al accionar una combinacin de teclas asociadas, tambin se pueden producir eventos.
Tras hablarlo piensan que realmente no es tan complicado, porque se repiten muchos eventos y si
nos paramos a pensarlo, todos ellos son predecibles y bastante lgicos.

Quesunevento?
Es todo hecho que ocurre mientras se ejecuta la aplicacin. Normalmente, llamamos evento a
cualquierinteraccinquerealizaelusuarioconlaaplicacin,comopuedeser:
9 pulsarunbotnconelratn,
9 hacerdobleclic,
9 pulsaryarrastrar,
9 pulsarunacombinacindeteclasenelteclado,
9 pasarelratnporencimadeuncomponente,
9 salirelpunteroderatndeuncomponente,
9 abrirunaventana,etc.
Queslaprogramacinguiadaporeventos?
Imagina la ventana de cualquier aplicacin, por ejemplo la de un procesador de textos. En esa
ventana aparecen multitud de elementos grficos interactivos, de forma que no es posible que el
programadorhayaprevistotodaslasposiblesentradasquesepuedenproducirporpartedelusuario
encadamomento.
Con el control de flujo de programa de la programacin imperativa, el programador tendra que
estarcontinuamenteleyendolasentradas(deteclado,oratn,etc)ycomprobarparacadaentradao
interaccinproducidaporelusuario,decualsetratadeentretodaslasposibles,usandoestructuras
de flujo condicional ( if then else , switch ) para ejecutar el cdigo conveniente en cada caso. Si
piensasqueparacadaopcindelmen,paracadabotnoetiqueta,paracadalistadesplegable,y
portantoparacadacomponentedelaventana,incluyendolapropiaventana,habraquecomprobar
todos y cada uno de los eventos posibles, nos damos cuenta de que las posibilidades son casi
infinitas,ydesdeluegoimpredecibles.Portanto,deesemodoesimposiblesolucionarelproblema.
Paraabordarelproblemadetratarcorrectamentelasinteraccionesdelusuarioconlainterfazgrfica
delaaplicacinhayquecambiardeestrategia,ylaprogramacinguiadaporeventosesunabuena
solucin,veamoscmofuncionaelmodelodegestindeeventos.

4.2Modelodegestindeeventos.
Qusistemaoperativoutilizas?Poseeunentornogrfico?Hoyen
da,lamayoradesistemasoperativosutilizaninterfacesgrficasde
usuario. Este tipo de sistemas operativos estn continuamente
monitorizandoelentornoparacapturarytratarloseventosquese
producen.
Elsistemaoperativoinformadeestoseventosalosprogramasque
seestnejecutandoyentoncescadaprogramadecide,segnloque
sehayaprogramado,quhaceparadarrespuestaaesoseventos.
Cada vez que el usuario realiza una determinada accin sobre una aplicacin que estamos
programandoenJava,unclicsobreelratn,presionarunatecla,etc,seproduceuneventoqueel
sistemaoperativotransmiteaJava.

19

Comunicndonosconelusuario.Interfaces

DAW

Java crea un objeto de una determinada clase de evento, y este evento se transmite a un
determinadomtodoparaquelogestione.
ElmodelodeeventosdeJavaestbasadoendelegacin,esdecir,laresponsabilidaddegestionar
uneventoqueocurreenunobjetofuentelatieneotroobjetooyente.
Las fuentes de eventos ( event sources ) son objetos que detectan eventos y notifican a los
receptoresquesehanproducidodichoseventos.Ejemplosdefuentes:
9 Botnsobreelquesepulsaopinchaconelratn.
9 Campodetextoquepierdeelfoco.
9 Campodetextosobreelquesepresionaunatecla.
9 Ventanaquesecierra.
9 Etc.
EnelapartadoanteriordecreacindeinterfacesconayudadelosasistentesdelIDE,vimoslofcil
que es realizar este tipo de programacin, ya que el IDE hace muchas cosas, genera cdigo
automticamentepornosotros.
Perotambinpodramoshacerlonosotrostodo,sinotuviramosunIDEcomoNetBeans,oporque
simplementenosapetecierahacerlotododesdecdigo,sinusarasistentesnidiseadoresgrficos.
Enestecaso,lospasosaseguirsepuedenresumiren:
1. Crearlaclaseoyentequeimplementelainterfaz.
Ej. ActionListener :pulsarunbotn.
2. Implementarenlaclaseoyentelosmtodosdelainterfaz.
Ej. void actionPerformed(ActionEvent) .
3. Crear un objeto de la clase oyente y registrarlo como oyente en uno o ms componentes
grficosqueproporcioneninteraccinconelusuario.
Observaunejemplomuysencilloparaverestostrespasos:
Creandoelprograma:
public class Ventanilla extends JFrame {
JLabel etiqueta; // Declarar variables
JButton botonUno, botonDos;
JPanel panel;
public Ventanilla(){
// Creamos los componentes: una etiqueta,
// dos botones y un JPanel.
etiqueta = new JLabel(La etiqueta: );
botonUno = new JButton(Uno);
botonDos = new JButton(Dos);
panel = new JPanel();
// Aadimos los componentes al panel
panel.add(etiqueta);
panel.add(botonUno);
panel.add(botonDos);
// Aadir el panel al Frame
getContentPane().add(panel);
// Crear objeto de la clase oyente para cuando se pulse el botn
OyenteAccion oyenteBoton = new OyenteAccion();
// Registrar el objeto como oyente en los dos botones
botonUno.addActionListener(oyenteBoton);
botonDos.addActionListener(oyenteBoton);
}
}
// Implementacin en la clase oyente
class OyenteAccion implements ActionListener{
// Cuando se pinche en el botn
public void actionPerformed(ActionEvent evento){
// Obtener el botn que dispar el evento
JButton botn = (JButton) evento.getSource();
// Escribir en la etiqueta, el botn que se puls
etiqueta.setText(Botn pulsado: + botn.getText());
}
// Programa principal
public static void main(String args[]){
// Crear la ventana
Ventanilla Ventana = new Ventanilla();
// Establecer el ttulo, el tamao y hacerla visible
ventana.setTitle(Ttulo de la ventana);

20

DesarrollodeAplicacionesWeb

Tema7

ventana.setSize(350,80);
ventana.setVisible(true);
}
}

Alejecutarlo:

SegnpulsemoselbotnUnooDos,seescribirel
nombredelbotnpulsado.

Ejemplodelmodelodegestindeeventos

Creamoselproyecto:

Damosnombrealproyecto

CreamosunnuevoJFrame

21

Comunicndonosconelusuario.Interfaces

Damosnombrealmarco

Arrastramos un botn desde la paleta al


JFrame

Aadimos la funcionalidad: que escriba por


consolabotnpulsado.
Para ello, hacemos doble click sobre el botn
que hemos aadido. Automticamente
NetBeansgeneraelcdigoqueseve,paraque
escribamos el cdigo de lo que debe pasar
cuandosepulseenelbotn.

Aadimos la lnea de cdigo para que se


escribaporconsola

ConstruimoselproyectopulsandoF11

22

DAW

DesarrollodeAplicacionesWeb

Tema7

Laaplicacinenejecucin:
Hay asociado un oyente de eventos (Listener) apropiado para el
tipodeeventoquequeremoscomprobar.
Enelejemplo,hayunActionListener.

VemosqueNetBeansgenerelcdigosealado.
Sevequeaadeunoyentealbotn

Eloyenteessimplementeunprogramaquepermaneceactivo,enejecucinensegundoplano,de
formaparalelaalaaplicacin.
Se encarga exclusivamente de comprobar si se ha producido algn evento del tipo que l sabe
escucharsobreelcomponentealquesehaaadido
Enelcasodelbotndeaccin,elActionListenerseencargadecomprobarsisehaproducidoalgn
eventodeltipoActionEvent(eventodeaccin,comopulsarconelratnoseleccionarconelatajo
deteclado,porejemplo)sobreelbotn.
Enelmomentoqueeloyenteoyeointerceptauneventodeese
tipo,locaptura,ypasaelcontroldelflujodenuestraaplicacinal
Controladordelcomponentealqueestasociado.
El controlador no es ms que el cdigo que el programador ha
escrito para que se ejecute cuando se produce exactamente ese
evento sobre ese componente. Este cdigo recibe del listener
ademsdelcontrol,unparmetroqueesunobjetoEventodeltipo
deleventoescuchadoporeloyente.
En el caso del botn de accin, se transfiere el control al mtodo
actionPerformed() definido por el programador, pasndole como
parmetro el objeto evento del tipo ActionEvent que se ha
producido. El mtodo actionPerformed() contiene todas las
sentenciasquedebenejecutarse.

23

Comunicndonosconelusuario.Interfaces

DAW

Con la programacin guiada por eventos, el programador se concentra en estar


continuamente leyendo las entradas de teclado, de ratn, etc, para comprobar cada
entrada o interaccin producida por el usuario
Si
No

4.3Tiposdeeventos.
En la mayor parte de la literatura escrita sobre Java,
encontrarsdostiposbsicosdeeventos:
9 Fsicos o de bajo nivel: que corresponden a un evento
hardwareclaramenteidentificable.Porejemplo,sepuls
unatecla( KeyStrokeEvent ).Destacarlossiguientes:
En componentes: ComponentEvent . Indica que un
componentesehamovido,cambiadodetamaoode
visibilidad
En contenedores: ContainerEvent . Indica que el contenido de un contenedor ha cambiado
porqueseaadioeliminuncomponente.
Enventanas: WindowEvent .Indicaqueunaventanahacambiadosuestado.
FocusEvent ,indicaqueuncomponentehaobtenidooperdidolaentradadelfoco.
9 Semnticos o de mayor nivel de abstraccin: se componen de un conjunto de eventos fsicos,
quesesucedenenundeterminadoordenytienenunsignificadomsabstracto.Porejemplo:el
usuarioeligeunelementodeunalistadesplegable( ItemEvent ).
ActionEvent , ItemEvent , TextEvent , AdjustmentEvent
LoseventosenJavaseorganizanenunajerarquadeclases:
9 Laclasejava.util.EventObjecteslaclasebasedetodosloseventosenJava.
9 La clase java.awt.AWTEvent es la clase base de todos los eventos que se utilizan en la
construccindeGUIs.
9 CadatipodeeventoloqueseaEventtieneasociadaunainterfazloqueseaListenerquenospermite
definirmanejadoresdeeventos.
9 Con la idea de simplificar la implementacin de algunos manejadores de eventos, el paquete
java.awt.eventincluyeclasesloqueseaAdapterqueimplementanlasinterfacesloqueseaListener.

El evento que se dispara cuando le llega el foco a un botn es un evento de tipo fsico.
Si
No

4.4Eventosdeteclado.
Loseventosdetecladosegenerancomorespuestaaqueelusuariopulsaoliberaunateclamientras
uncomponentetieneelfocodeentrada.
KeyListener(oyentedeteclas)
Mtodo
Causadelainvocacin
keyPressed(KeyEvente)
Sehapulsadounatecla
keyReleased(KeyEvente) Sehaliberadounatecla
keyTyped(KeyEvente)
Sehapulsado(yavecessoltado)unatecla

KeyEvent(eventodeteclas)
Mtodosmsusuales
Explicacin
chargetKeyChar()
Devuelveelcarcterasociadoconlateclapulsada

24

DesarrollodeAplicacionesWeb
intgetKeyCode()
StringgetKeyText()
ObjectgetSource()

Tema7

Devuelveelvalorenteroquerepresentalateclapulsada
Devuelveuntextoquerepresentaelcdigodelatecla
MtodopertenecientealaclaseEventObject.Indicaelobjetoque
produjoelevento

LaclaseKeyEvent,definemuchasconstantesas:
9 KeyEventVK_A especificalateclaA.
9 KeyEventVK_ESCAPE especificalateclaESCAPE
En la siguiente presentacin tienes el cdigo del proyecto que te puedes descargar tambin a
continuacin. En l se puede ver un ejemplo del uso eventos. En concreto vemos cmo se estn
capturando los eventos que se producen al pulsar una tecla y liberarla. El programa escribe en un
readetextolasteclasqueseoprimen.
Cdigodeloyentedeteclado
import javax.swing.* ;
import java.awt.event.* ;
/**
*
* @author JJBH
*/
// Definimos la clase que hereda de JFrame
public class EscuchaTeclas extends JFrame {
// Variables para escribir
private String linea1 = "", linea2 = "", linea3 = "";
private JTextArea areaTexto;
// Constructor de la clase
public EscuchaTeclas () {
// Crear objeto JTextArea
areaTexto = new JTextArea( 10, 15 );
areaTexto.setText( "Pulsa cualquier tecla del teclado..." );
areaTexto.setEnabled( false );
// Aadir al JFrame el objeto areaTexto
this.getContentPane().add( areaTexto );
// Crear el objeto oyente de teclas
OyenteTeclas oyenteTec = new OyenteTeclas() ;
// Registrar el oyente en el JFrame
this.addKeyListener(oyenteTec);
}
// Implementar la clase oyente que implemente el interface KeyListener
class OyenteTeclas implements KeyListener{
// Gestionar evento de pulsacin de cualquier tecla
public void keyPressed( KeyEvent evento )
{
linea1 = "Se oprimi tecla: " + evento.getKeyText( evento.getKeyCode() );
establecerTexto( evento );
}
// Gestionar evento de liberacin de cualquier tecla
public void keyReleased( KeyEvent evento )
{
linea1 = "Se solt tecla: " + evento.getKeyText( evento.getKeyCode() );
establecerTexto( evento );
}
// manejar evento de pulsacin de una tecla de accin
public void keyTyped( KeyEvent evento )
{
linea1 = "Se escribi tecla: " + evento.getKeyChar();
establecerTexto( evento );
}
}

25

Comunicndonosconelusuario.Interfaces

DAW

// Establecer texto en el componente areaTexto


private void establecerTexto( KeyEvent evento )
{
// getKeyModifiersText devuelve una cadena que indica
// el modificador de la tecla, por ejemplo Shift
String temp = evento.getKeyModifiersText( evento.getModifiers() );
linea2 = "Esta tecla " + ( evento.isActionKey() ? "" : "no " ) +
"es una tecla de accin";
linea3 = "Teclas modificadoras oprimidas: " + ( temp.equals( "" ) ? "ninguna" : temp
);
// Establecer texto en el componente areaTexto
areaTexto.setText( linea1 + "\n" + linea2 + "\n" + linea3 + "\n" );
}
public static void main( String args[] )
{
// Crear objeto y establecer propidades
EscuchaTeclas ventana = new EscuchaTeclas();
ventana.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
ventana.setTitle("Ttulo de la ventana");
ventana.setSize( 360, 120 );
ventana.setVisible(true);
}
}

4.5Eventosderatn.
Similarmente a los eventos de teclado, los eventos del ratn se generan como respuesta a que el
usuariopulsaoliberaunbotndelratn,olomuevesobreuncomponente.
MouseListener(oyentederatn)
Sehapulsadounbotndelratnenun
mousePressed(MouseEvente)
componente
Sehaliberadounbotndelratnenun
mouseReleased(MouseEvente)
componente
Sehapulsadoyliberadounbotndelratnsobre
mouseClickerd(MouseEvente)
uncomponente.
Sehaentrado(conelpunterodelratn)enun
mouseEntered(KeyEvente)
componente.
Sehasalido(conelpunterodelratn)deun
mouseExited(KeyEvente)
componente.

MouseMotionListener(oyentederatn)
mouseDragged(MouseEvente)
Sepresionaunbotnysearrastraelratn
Semueveelpunterodelratnsobreun
mouseMoved(MouseEvente)
componente

MouseWheelListener(oyentederatn)
MouseWheelMoved(MouseWheelEvente)
Semuevelaruedadelratn

En el siguiente proyecto podemos ver una demostracin de un formulario con dos botones.
Implementamos un oyente MouseListener y registramos los dos botones para detectar tres de los
cincoeventosdelinterface.

import java.awt.event.* ;
public class miMarcoRaton extends javax.swing.JFrame {

/** Constructor: crea nuevo marco miMarcoRaton */

26

DesarrollodeAplicacionesWeb

Tema7

public miMarcoRaton() {
initComponents();
// Crear el objeto oyente de ratn
OyenteRaton oyenteRat = new OyenteRaton() ;
// Registrar el oyente en el botn de Aceptar
jButton1.addMouseListener(oyenteRat);
// Registrar el oyente en el botn de Cancelar
jButton2.addMouseListener(oyenteRat);
}
// Implementar la clase oyente que implemente el interface MouseListener
// Se deja en blanco el cuerpo de mouseEntered y de mouseExited, ya que
// no nos interesan en este ejemplo. Cuando se desea escuchar algn
// tipo de evento, de deben implementar todos los mtodos del interface
// para que la clase no tenga que ser definida como abstracta
class OyenteRaton implements MouseListener{
// Gestionar evento de pulsacin de cualquier tecla
public void mousePressed(MouseEvent e) {
escribir("Botn de ratn pulsado", e) ;
}
public void mouseReleased(MouseEvent e) {
escribir("Botn de ratn liberado", e);
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
escribir("Click en el botn del ratn", e);
}
void escribir(String eventDescription, MouseEvent e) {
// Escribir en el rea de texto la descripcin que
// se recibe como parmetro
jTextArea1.append(eventDescription + ".\n");
// Comprobamos cul de los dos botones es y lo escribimos
if (e.getComponent().getName().equals(jButton1.getName()) )
jTextArea1.append("Es el botn Aceptar.\n");
else
jTextArea1.append("Es el botn Cancelar.\n");
}
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
jScrollPane1 = new javax.swing.JScrollPane();
jTextArea1 = new javax.swing.JTextArea();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jButton1.setText("Aceptar");
jButton1.setName("Aceptar"); // NOI18N
jButton2.setText("Cancelar");
jButton2.setName("Cancelar"); // NOI18N
jTextArea1.setColumns(20);
jTextArea1.setRows(5);
jScrollPane1.setViewportView(jTextArea1);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

27

Comunicndonosconelusuario.Interfaces

DAW

.addGroup(layout.createSequentialGroup()
.addGap(80, 80, 80)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addGroup(layout.createSequentialGroup()
.addComponent(jScrollPane1,
javax.swing.GroupLayout.PREFERRED_SIZE,
402, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
.addGroup(layout.createSequentialGroup()
.addComponent(jButton1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jButton2)
.addGap(18, 18, 18))))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(126, 126, 126)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addGroup(layout.createSequentialGroup()
.addComponent(jButton1)
.addGap(26, 26, 26))
.addGroup(layout.createSequentialGroup()
.addComponent(jButton2)
.addGap(18, 18, 18)))
.addComponent(jScrollPane1,
javax.swing.GroupLayout.PREFERRED_SIZE,
javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(33, Short.MAX_VALUE))
);

177,

pack();
}// </editor-fold>//GEN-END:initComponents
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new miMarcoRaton().setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextArea jTextArea1;
// End of variables declaration//GEN-END:variables
}

Comoseveenelcdigo,sedejaenblancoelcuerpodemouseEnteredydemouseExited,yaqueno
nos interesan en este ejemplo. Cuando se desea escuchar algn tipo de evento, de deben
implementar todos los mtodos del interface para que la clase no tenga que ser definida como
abstracta.
Paraevitartenerquehaceresto,podemosutilizaradaptadores(esunaclasequeimplementeunoyenteolistener,
peronorealizaningntipodeoperacin.Sedesarrollaronparaevitartenerqueimplementartodoslosmtodosdeuninterface,yaquesi
noseimplementanlaclaseseraabstracta).

Tienesunejemplodeusodelosadaptadoresenelsiguienteenlace:
http://eddi.ith.mx/Curso/Tutoriales/Ozito/post1dot0/ui/eventinnerclasses.html

En el enlace que ves a continuacin, hay tambin un ejemplo interesante de la


programacindeeventosdelratn.
http://www.sc.ehu.es/sbweb/fisica/cursoJava/applets/events/raton.htm

28

DesarrollodeAplicacionesWeb

Tema7

Cuando el usuario deja de pulsar una tecla se invoca a keyReleased(KeyEvent e).


Si
No

4.6Creacindecontroladoresdeeventos.
ApartirdelJDK1.4seintrodujoenJavalaclase EventHandler parasoportaroyentesdeeventomuy
sencillos.
Lautilidaddeestoscontroladoresomanejadoresdeeventoes:
9 Crearoyentesdeeventosintenerqueincluirlosenunaclasepropia.
9 Estoaumenteelrendimiento,yaquenoaadeotraclase.
Comoinconveniente,destacaladificultaddeconstruccin:loserroresnosedetectanentiempode
compilacin,sinoentiempodeejecucin.
Porestarazn,esmejorcrearcontroladoresdeeventoconlaayudadeunasistenteydocumentarlos
todoloposible.
El uso ms sencillo de EventHandler consiste en instalar un oyente que llama a un mtodo, en el
objeto objetivo sin argumentos. En el siguiente ejemplo creamos un ActionListener que invoca al
mtododibujarenunainstanciadejavax.swing.JFrame.
miBoton.addActionListener(
(ActionListener)EventHandler.create(ActionListener.class, frame,"dibujar"));

Cuando se pulse miBoton, se ejecutar la sentencia frame.dibujar(). Se obtendra el mismo efecto,


conmayorseguridadentiempodecompilacin,definiendounanuevaimplementacinalinterface
ActionListener yaadiendounainstanciadeelloalbotn:
// Cdigo equivalente empleando una clase interna en lugar de EventHandler.
miBoton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
frame.dibujar();
}
});

Probablementeelusomstpicode EventHandler esextraerelvalordeunapropiedaddelafuente


delobjetoeventoyestablecerestevalorcomoelvalordeunapropiedaddelobjetodestino.Enel
siguienteejemplosecreaun ActionListener queestablecelapropiedadlabeldelobjetodestinoal
valordelapropiedadtextdelafuente(elvalordelapropiedadsource)delevento.
EventHandler.create(ActionListener.class, miBoton, "label", "source.text")

Estocorresponderaalaimplementacindelasiguienteclaseinterna:
// Cdigo equivalente utilizando una clase interna en vez de EventHandler.
new ActionListener {
public void actionPerformed(ActionEvent e) {
miBoton.setLabel(((JTextField)e.getSource()).getText());
}
}

El uso de EventHandler tiene como inconveniente, que los errores no se detectan en


tiempo de ejecucin.
Si
No

29

Comunicndonosconelusuario.Interfaces

DAW

5.Generacindeprogramasenentornogrfico.
CASO.
Jos Javier va de camino a la clase prctica en la que l, y el resto de la clase, van a probar a hacer
sus primeros pasos en programacin visual con entornos grficos, el profesor les explica que al
principio parece que todo es muy fcil sobre el papel, pero en realidad crear un proyecto con
componentes grficos no siempre es fcil. Pero el profesor lo tiene claro, hay que empezar por los
contenedores que, como su propio nombre indica, se emplean para contener o ubicar al resto de
componentes.

En este mismo tema, ms arriba, has visto la lista de los principales componentes Swing que se
incluyenenlamayoradelasaplicaciones,juntoconunabrevedescripcindesuuso,yunaimagen
quenosdeunaideadeculessuaspecto.
TambinhemosvistounejemplodecmocrearconlaayudadeNetBeansunossencillosprogramas.
Ahora,vamosaverconmayordetalle,loscomponentesmstpicosutilizadosenlosprogramasen
Javaycmoincluirlosdentrodeunaaplicacin.

Algosloesimposiblehastaquealguienlodudeytermineprobandolocontrario.
AlbertEinstein

5.1Contenedores.
Porlosejemplosvistoshastaahora,yatehabrsdadocuentadelanecesidaddequecadaaplicacin
contenga de alguna forma esos componentes. Qu componentes se usan para contener a los
dems?
EnSwingesafuncinladesempeanungrupodecomponentesllamadoscontenedoresSwing.
Existendostiposdeelementoscontenedores:
9 Contenedoresdealtonivelopesopesado.
9 Marcos: JFrame y JDialog paraaplicaciones
9 JApplet ,paraapplets(esuncomponentedeunaaplicacinqueseejecutaenelcontextodeotroprograma,porejemplo
unnavegadorweb.Elappletdebeejecutarseenuncontenedor,queloproporcionaunprogramaanfitrin,medianteunplugin,o
enaplicacionescomotelfonosmvilesquesoportanelmodelodeprogramacinporapplets).
9 Contenedoresdebajonivelopesoligero.Sonlospaneles: JRootPane y JPanel .
Cualquieraplicacin,coninterfazgrficodeusuariotpica,comienzaconlaaperturadeunaventana
principal, que suele contener la barra de ttulo, los botones de minimizar, maximizar/restaurar y
cerrar,yunosbordesquedelimitansutamao.
Esa ventana constituye un marco dentro del cual se van colocando el resto de componentes que
necesita el programador: men, barras de herramientas, barra de estado, botones, casillas de
verificacin,cuadrosdetexto,etc.
Esaventanaprincipalomarcoseraelcontenedordealtoniveldelaaplicacin.
TodaaplicacindeinterfazgrficadeusuarioJavatiene,almenos,uncontenedordealtonivel.
LoscontenedoresdealtonivelextiendendirectamenteaunaclasesimilardeAWT,esdecir, JFrame
extiende de Frame . Es decir, realmente necesitan crear una ventana del sistema operativo
independienteparacadaunodeellos.
Losdemscomponentesdelaaplicacinnotienensupropiaventanadelsistemaoperativo,sinoque
sedibujanensuobjetocontenedor.
Enlosejemplosanterioresdeltema,hemosvistoquepodemosaadirun JFrame desdeeldiseador
de NetBeans, o bien escribindolo directamente por cdigo. De igual forma para los componentes
queaadamossobrel.

Te recomendamos que mires la siguiente web para ver informacin sobre JFrame y
JDialog.
http://chuwiki.chuidiang.org/index.php?title=JFrame_y_JDialog

30

DesarrollodeAplicacionesWeb

Tema7

Cualquier componente de grfico de una aplicacin Java necesita tener su propia


ventana del sistema operativo.
Si
No

5.2Cerrarlaaplicacin.
Cuando quieres terminar la ejecucin de un programa, qu sueles hacer? Pues normalmente
pinchareneliconodecierredelaventanadelaaplicacin.
EnSwing,unacosaescerrarunaventana,yotraesqueesaventanadejedeexistircompletamente,o
cerrarlaaplicacincompletamente.
9 Se puede hacer que una ventana no est visible, y sin embargo que sta siga existiendo y
ocupandomemoriaparatodossuscomponentes,usandoelmtodo setVisible(false) .Eneste
caso bastara ejecutar para el JFrame el mtodo setVisible(true) para volver a ver la ventana
contodossuselementos.
9 Si queremos cerrar la aplicacin, es decir, que no slo se destruya la ventana en la que se
mostraba,sinoquesedestruyanyliberentodoslosrecursos(memoriayCPU)queesaaplicacin
tenareservados,tenemosqueinvocaralmtodo System.exit(0)
9 Tambin se puede invocar para la ventana JFrame al mtodo dispose() , heredado de la clase
Window,quenorequiereningnargumento,yqueborratodoslosrecursosdepantallausados
porestaventanayporsuscomponentes,ascomocualquierotraventanaquesehayaabierto
como hija de esta (dependiente de esta). Cualquier memoria que ocupara esta ventana y sus
componentes se libera y se devuelve al sistema operativo, y tanto la ventana como sus
componentes se marcan como no representables. Y sin embargo, el objeto ventana sigue
existiendo, y podra ser reconstruido invocando al mtodo pack() o la mtodo show() , aunque
deberanconstruirdenuevotodalaventana.
Las ventanas JFrame de Swing permiten establecer una operacin de cierre por defecto con el
mtodo setDefaultCloseOperation() ,definidoenlaclase JFrame .
Cmoseleindicaalmtodoelmododecerrarlaventana?
Losvaloresqueselepuedenpasarcomoparmetrosaestemtodosonunaseriedeconstantesde
clase:
9 DO_NOTHING_ON_CLOSE :Nohacenada,necesitaqueelprogramamanejelaoperacinenelmtodo
windowClosing() deunobjeto WindowListener registradoparalaventana.
9 HIDE_ON_CLOSE : Oculta de ser mostrado en la pantalla pero no destruye el marco o ventana
despusdeinvocarcualquierobjeto WindowListener registrado.
9 DISPOSE_ON_CLOSE : Oculta y termina (destruye) automticamente el marco o ventana despus
deinvocarcualquierobjeto WindowListener registrado.
9 EXIT_ON_CLOSE : Sale de la aplicacin usando el mtodo System.exit(0) . Al estar definida en
JFrame ,sepuedeusarconaplicaciones,peronoconapplets.

System.exit(0) oculta la ventana pero no libera los recursos de CPU y memoria que la
aplicacin tiene reservados.
Si
No

5.3Organizadoresdecontenedores:layoutmanagers.
Loslayoutmanagerssonfundamentalesenlacreacindeinterfacesdeusuario,yaquedeterminan
lasposicionesdeloscontrolesenuncontenedor.

31

Comunicndonosconelusuario.Interfaces

DAW

Enlenguajesdeprogramacinparaunanicaplataforma,elproblemaseramenorporqueelaspecto
serafcilmentecontrolable.Sinembargo,dadoqueJavaestorientadoalaportabilidaddelcdigo,
ste es uno de los aspectos ms complejos de la creacin de interfaces, ya que las medidas y
posicionesdependendelamquinaenconcreto.
Enalgunosentornosloscomponentessecolocanconcoordenadasabsolutas.EnJavasedesaconseja
esaprcticaporqueenlamayoradecasosesimposibleprevereltamaodeuncomponente.
Por tanto, en su lugar, se usan organizadores o tambin llamados administradores de diseo o
layout managers o gestores de distribucin que permiten colocar y maquetar de forma
independientedelascoordenadas.
Debemos hacer un buen diseo de la interfaz grfica, y as tenemos que elegir el mejor gestor de
distribucinparacadaunodeloscontenedoresopanelesdenuestraventana.
Estopodemosconseguirloconelmtodo setLayout() ,alqueselepasacomoargumentounobjeto
deltipode Layout quesequiereestablecer.
En NetBeans, una vez insertado un JFrame , si nos situamos sobre l y pulsamos botn derecho, se
puedever,comomuestralaimagen,queapareceunmen,elcualnospermiteelegirel layout que
queramos.

Enlasiguientewebpuedesvergrficamentelosdistintoslayouts
http://download.oracle.com/javase/tutorial/uiswing/layout/visual.html
http://casidiablo.net/codigojavaflowlayoutborderlayoutgridlayout/

AcontinuacinsemuestraelusodeFlowLayoutparaposicionarvariosbotones.
Alignment:LEFT
HorizontalGap:5
VerticalCap:5

Conlosvalorespordefecto.Todoslos
componentesdelaventanasealinean
alaizquierdaunosseguidosdeotros,
siemprequeencuentrenespaciopara
sersituados.

Alignment:CENTER Alineacincentradadelos
HorizontalGap:25 componentesaumentandoelespacio
VerticalGap:25
horizontalyverticalentrelosmismos

Alignment:LEFT
HorizontalGap:5
VerticalGap:5

Conlasmismaspropiedadesdel
anterioryelmismoLayout,pero
aumentandoelanchodelaventana
paraquequepanmscontroles.Todos
loscomponentesdelaventanase
alineanalaizquierdaytodosenla
mismafila

Alignment:RIGHT
HorizontalGap:25
VerticalGap:25

Alineacinaladerechadelos
componentesconunaumentodel
espaciohorizontalyverticalentrelos
mismos

Alignment:LEFT
HorizontalGap:25
VerticalGap:25

Partiendodelaventanaconelancho
inicial,seaumentaelespacio
horizontalyverticalentrelos
controles(botonesenestecaso),
quedandodistribuidosdeestemodo

32

DesarrollodeAplicacionesWeb

Tema7

Cuando programamos en Java es aconsejable establecer coordenadas absolutas, siempre


que sea posible, en nuestros componentes.
Si
No

5.4Contenedorligero:JPanel.
Es la clase utilizada como contenedor genrico para agrupar
componentes.
Normalmente cuando una ventana de una aplicacin con interfaz
grficacualquierapresentavarioscomponentes,parahacerlams
atractivayordenadaalusuariosesuelehacerlosiguiente:
9 Crearunmarco,un JFrame .
9 Para organizar mejor el espacio en la ventana, aadiremos
varios paneles, de tipo JPanel . (Uno para introducir los datos
deentrada,otroparamostrarlosresultadosyuntercerocomo
zonadenotificacindeerrores.)
9 Cadaunodeesospanelesestardelimitadoporunbordequeincluirunttulo.Paraelloseusan
lasclasesdisponiblesen BorderFactory ( BevelBorder , CompoundBorder , EmptyBorder , EtchedBorder ,
9 LineBorder , LoweredBevelBorder , MatteBorder y TitledBorder )quenosdaunsurtidomsomenos
ampliodetiposdebordesaelegir.
9 Encadaunodeesospanelesseincluyenlasetiquetasycuadrosdetextoquesenecesitanpara
mostrarlainformacinadecuadamente.
Con NetBeans es tan fcil como arrastrar tantos controles JPanel de la paleta hasta el JFrame . Por
cdigo,tambinesmuysencillo,porejemplopodramoscrearunpanelrojo,darlesuscaractersticas
yaadirloal JFrame delsiguientemodo:

JPanel panelRojo = new JPanel();


panelRojo.setBackground(Color.RED);
panelRojo.setSize(300,300);
// Se crea una ventana
JFrame ventana=new JFrame("Prueba en rojo");
ventana.setLocation(100,100);
ventana.setVisible(true);
// Se coloca el JPanel en el content pane
Container contentPane=ventana.getContentPane();
contentPane.add(panelRojo);

CuandoenSundesarrollaronJava,losdiseadoresdeSwing,poralgunacircunstancia,determinaron
que para algunas funciones, como aadir un JComponent , los programadores no pudiramos usar
JFrame.add, sino que en lugar de ello, primeramente, tuviramos que obtener el objeto Container
asociadocon JFrame.getContentPane() ,yaadirlo.
Sun se dio cuenta del error y ahora permite utilizar JFrame.add, desde Java 1.5 en adelante. Sin
embargo,podemostenerelproblemadequeuncdigodesarrolladoyejecutadocorrectamenteen
1.5falleenmquinasquetenganinstalado1.4oanteriores.

Enlasiguientewebpuedesveralgomssobrepaneles.
http://members.fortunecity.es/mastermdei/usuarios.tripode.es/panel.html

5.5Etiquetasycamposdetexto.
LoscuadrosdetextoSwingvienenimplementadosenJavaporlaclase JTextField .
Parainsertaruncampodetexto,elprocedimientoestanfcilcomo:seleccionarel
botncorrespondientea JTextField enlapaletadecomponentes,eneldiseador,

33

Comunicndonosconelusuario.Interfaces

DAW

ypincharsobreelreadediseoencimadelpanelenelquequeremossituaresecampodetexto.El
tamaoyellugarenelquesesite,dependerdel Layout elegidoparaesepanel.
El componente Swing etiqueta JLabel , se utiliza para crear etiquetas de modo que podamos
insertarlasenunmarcoounpanelparavisualizaruntextoesttico,quenopuedeeditarelusuario.
Losconstructoresson:
9 JLabel() .Creaunobjeto JLabel sinnombreysinningunaimagenasociada.
9 JLabel(Icon imagen) .Creaunobjetosinnombreconunaimagenasociada.
9 JLabel(Icon imagen, int alineacionHorizontal) .Creaunaetiquetaconlaimagenespecificaday
lacentraenhorizontal.
9 JLabel(String texto) .Creaunaetiquetaconeltextoespecificado.
9 JLabel(String texto, Icon icono, int alineacionHorizontal) .Creaunaetiquetaconeltextoy
laimagenespecificadayalineadahorizontalmente.
9 JLabel(String texto, int alineacionHorizontal) .Creaunaetiquetaconeltextoespecificadoy
alineadohorizontalmente.
PropiedadesasociadasaJTextField,ylosmtodosquepermitenmodificarlas
Propiedad
Mtodosasociados
Descripcin
setBackground()
Estableceelcolordelfondodelcuadrode
Background
getBackground()
texto.
Permiteseleccionarlascaractersticasdel
Border
setBorder()
bordequetieneelcuadrodetextopara
delimitarlo
Establecesisevaapodermodificareltextodel
campodetextoporelusuariodelaaplicacin.
Editable
setEditable()
Aunqueseestablezcasuvalorafalse,el
programasquepodrmodificaresetexto.
setFont().
Establecelaspropiedadesdelafuente(tipode
Font
getFont()
letra,estiloytamaodeltexto)
Foreground
setForeground()
Estableceelcolordeltexto.
Establecelajustificacindeltextodentrodel
HorizontalAlignment setHorizontalAlignment() cuadrodetexto(Justificadoalaizquierda,
centradooaladerecha).
Estableceeltextoquecontieneelcuadrode
texto.Tambinesposiblemezclartextode
distintoscoloresyfuentes,usandoetiquetas
setText()
HTMLcomopartedeltexto.Paramsdetalles
Text
getText()
sobreelusodeHTMLeneltextodelos
componentes,debesmirarlaseccinUsing
HTMLinSwingComponentsdeltutorialde
Java,disponibleenladocumentacindelJDK.
Aadeuncomentariodeayudaflotante,de
setToolTipText()
ToolTipText
formaquesedespliegaaldetenerelcursor
getToolTipText()
encimadelcomponente.
Establecesielcomponentevaaestaractivoo
no.Uncomponentequenoestactivono
puederesponderalasentradasdelusuario.
Enabled
setEnabled()
Algunoscomponentes,comoJTextField,
modificansurepresentacinvisualparadejar
claroquenoestnactivos,mostrandouncolor
grisatenuado.
MaximunSize
setMaximumSize()
Estableceeltamaomximoparael

34

DesarrollodeAplicacionesWeb

MinimunSize

getMaximumSize()
setMinimumSize()
getMinimumSize()

PreferredSize

setPreferredSize()
getPreferredSize()

Opaque

setOpaque()

Tema7
componente.
Estableceeltamaomnimoparael
componente.
Estableceeltamaopreferidoparael
componente.Elvalorpreferidosetendren
cuentaalahoraderedimensionarlaventana,
segnelLayoutquesehayausado,para
procurarqueelaspectoseasiempreelmejor
posible,peronohaygarantasdequese
respetesiempre.
Establecesielcomponentevaaseropaco,osi
porelcontrariovaapermitirqueseveanotros
componentesquepuedanestardebajodel,
comosifuerauncristaltransparente.

EnelsiguienteenlacepuedesvercmousarDecimalFormatparapresentarunnmeroen
unJTextFieldorecogereltextodelJTextFieldyreconstruirelnmero.
http://chuwiki.chuidiang.org/index.php?title=DecimalFormat

Un componente JLabel permite al usuario de la aplicacin en ejecucin cambiar el texto


que muestra dicho componente.
Si
No

5.6Botones.
Ya has podido comprobar que prcticamente todas las
aplicaciones incluyen botones que al ser pulsados
efectan alguna accin: hacer un clculo, dar de alta un
libro,aceptarmodificaciones,etc.
Estos botones se denominan botones de accin,
precisamente porque realizan una accin cuando se
pulsan.EnSwing,laclasequelosimplementaenJavaesla
JButton .
Losprincipalesmtodosson:
9 void setText(String) :Asignaeltextoalbotn.
9 String getText() :Recogeeltexto.
Hayuntipoespecialdebotones,quesecomportancomointerruptoresdedosposicionesoestados
(pulsadoson, no pulsadosoff). Esos botones especiales se denominan botones on/off o
JToggleButton .

Acontinuacinpuedesverunpardeenlaces:unaenelquesediseaunainterfazgrficade
usuario sencilla, con los controles que hemos visto hasta ahora, y el segundo enlace, en
ingls,unejemploparaaadirunbotnenJavaporcdigo.
http://geocities.ws/wlopezm/articulos/gui_java.pdf

http://www.apl.jhu.edu/~hall/java/SwingTutorial/SwingTutorialJButton.html

35

Comunicndonosconelusuario.Interfaces

DAW

5.7Casillasdeverificacinybotonesderadio.
LascasillasdeverificacinenSwingestnimplementadasparaJavaporla
clase JCheckBox , y los botones de radio o de opcin por la clase
JRadioButton .Losgruposdebotones,porlaclase ButtonGroup .
Lafuncionalidaddeamboscomponentesesenrealidadlamisma.
9 Ambos tienen dos estados: Seleccionados o no seleccionados.
(marcadosonomarcados)
9 Ambossemarcanodesmarcanusandoelmtodo setSelected(boolean estado) ,queestablece
elvalorparasupropiedad selected .(Elestadotomaelvalor true paraseleccionadoy false para
noseleccionado)
9 Aamboslepodemospreguntarsiestnseleccionadosono,medianteelmtodo isSelected() ,
quedevuelve true sielcomponenteestseleccionadoy false sinoloest.
9 Para ambos podemos asociar un icono distinto para el estado de seleccionado y el de no
seleccionado.
JCheckBox puedenusarseenmensmediantelaclase JCheckBoxMenuItem .
JButtonGroup permite agrupar una serie de casillas de verificacin ( JRadioButton ), de entre las que
slo puede seleccionarse una. Marcar una de las casillas implica que el resto sean desmarcadas
automticamente. La forma de hacerlo consiste en aadir un JButtonGroup y luego, agregarle los
botones.
Cuando en un contenedor aparezcan agrupados varios botones de radio (o de opcin),
entenderemosquenosonopcionesindependientes,sinoqueslounodeellospodrestaractivoen
cadamomento,ynecesariamenteunodebeestaractivo.Portantoenesecontextoentendemosque
sonopcionesexcluyentesentres.

EnelsiguienteenlacepuedesverunvdeotutorialparacrearunejemplobsicodeJavacon
interfazgrfica.
http://www.youtube.com/watch?v=J0u_yf5CZNE&feature=related

Los componentes radiobotones y las casillas de verificacin tienen ambos dos estados:
seleccionado y no seleccionado.
Si
No

5.8Listas.
En casi todos los programas, nos encontramos con que se pide al usuario
que introduzca un dato, y adems un dato de entre una lista de valores
posibles,noundatocualquiera.
Laclase JList constituyeuncomponentelistasobreelquesepuedevery
seleccionar uno o varios elementos a la vez. En caso de haber ms
elementos de los que se pueden visualizar, es posible utilizar un
componente JScrollPanel paraqueaparezcanbarrasdedesplazamiento.

Paraaadirun JList enNetBeansprocederemoscomopodemosobservarenlasiguientepgina:

36

DesarrollodeAplicacionesWeb

Tema7

Arrastrarelcontrol List delapaletahastael


paneldondequeramossituarlo.
Pordefectovemosquelleva5elementos:
item1hastaitem5.

Unavezinsertadohacemosbotnderecho
sobreelcomponenteyseleccionamoslas
propiedades.

Pinchamosenelbotoncilloquehayala
derechadelapropiedadmodel.

Podemosintroducirloselementosque
queremosqueaparezcanenlalista

37

Comunicndonosconelusuario.Interfaces

DAW

Alaceptarvemosqueenlalistaaparecenlos
datosqueacabamosdeintroducir

Enloscomponentes JList ,unmodelo ListModel representaloscontenidosdelalista.Estosignifica


quelosdatosdelalistaseguardanenunaestructuradedatosindependiente,denominadamodelo
de la lista. Es fcil mostrar en una lista los elementos de un vector o array de objetos, usando un
constructorde JList quecreeunainstanciade ListModel automticamenteapartirdeesevector.
Vemosacontinuacinunejemplopararcrearunalista JList quemuestralascadenascontenidasen
elvectorinfo[]:
String[] info = {"Pato", "Loro", "Perro", "Cuervo"};
JList listaDatos = new JList(info);
/* El valor de la propiedad model de JList es un objeto que proporciona una visin
de slo lectura del vector info[]. El mtodo getModel() permite recoger ese modelo
en forma de Vector de objetos, y utilizar con los mtodos de la clase Vector, como
getElementAt(i), que proporciona el elemento de la posicin i del Vector. */
for (int i = 0; i < listaDatos.getModel().getSize(); i++) {
System.out.println(listaDatos.getModel().getElementAt(i));
}

AcontinuacinpuedesvercmocrearunJList,pasoapaso,enelenlacesiguiente.
http://jcmouse.blogspot.com/2010/02/anadireliminarelementosdejlisten.html

Enelenlacequetienesacontinuacinpuedesverunapresentacin,queaunqueconaudio
eningls,eslosuficientementeexplicativaparaentenderla.
http://bits.netbeans.org/media/quickstartguialign.swf
Resumen:SevisualizaelentornoNetBeansconunformulariodiseadoconvarioscontroles:
dospaneles,unoarribayotroabajo.Enelpaneldearribahaycuatrocamposdetextocon
susrespectivasetiquetasyelpaneldeabajoaparecevaco.Sehaceunclickenlaetiqueta
quehaymshaciaarribaalaizquierdayentoncessehaceclickenelbotndealinearala
derecha,queapareceenlabarradeherramientasquehaysobreelformulario.Serepitelo
mismoparalasotrasetiquetas.Traseso,seveahoracmocambiarotroaspecto,estavez
deloscamposdetexto.Seseleccionaeldeabajoalaizquierda,ysehaceclickconelbotn
derecho del ratn; en el men contextual se selecciona Autoresizing Horizontal. De este
modo,entiempodeejecucin,esecontrolsepodrcambiardetamaohorizontalmente.
Se aade ahora una etiqueta ms, arrastrndola desde la paleta de componentes de la
derechadelapantalla.
Ahoraseaadeuncontrolcomboboxaladerechadelaetiquetaaadida.
Seaadeahoraunaetiquetaenelpanelinferior,ydespusuncampodetextoasuderecha,
queseredimensionaarrastrndolodesdesubordederecho.Tambinseaadefinalmente
unalista.

38

DesarrollodeAplicacionesWeb

Tema7

5.8.1Listas(II).
Cuando trabajamos con un componente JList , podemos seleccionar un nico elemento, o varios
elementosalavez,queasuvezpuedenestarcontiguosonocontiguos.Laposibilidaddehacerlode
unauotramaneralaestablecemosconlapropiedad selectionMode .
Los valores posibles para la propiedad selectionMode para cada una de esas opciones son las
siguientesconstantesdeclasedelinterface ListSelectionModel :
9 MULTIPLE_INTERVAL_SELECTION : Es el valor por defecto. Permite seleccionar mltiples intervalos,
manteniendopulsadalateclaCTRLmientrasseseleccionanconelratnunoauno,olateclade
maysculas,mientrassepulsaelprimerelementoyelltimodeunintervalo.
9 SINGLE_INTERVAL_SELECTION : Permite seleccionar un nico intervalo, manteniendo pulsada la
teclamaysculasmientrasseseleccionaelprimeryltimoelementodelintervalo.
9 SINGLE_SELECTION :Permiteseleccionarcadavezunnicoelementodelalista.
Podemos establecer el valor de la propiedad selectedIndex con el mtodo setSelectedIndex() es
decir, el ndice del elemento seleccionado, para seleccionar el elemento del ndice que se le pasa
comoargumento.
Comohemoscomentado,losdatossealmacenanenunmodeloquealfinyalcaboesunvector,por
loquetienesentidohablardendiceseleccionado.
Tambin se dispone de un mtodo getSelectedIndex() con el que podemos averiguar el ndice del
elementoseleccionado.
El mtodo getSelectecValue() devuelve el objeto seleccionado, de tipo Object , sobre el que
tendremos que aplicar un casting explcito para obtener el elemento que realmente contiene la
lista(porejemploun String ).
Observa que la potencia de usar como modelo un vector de Object , es que en el JList podemos
mostrarrealmentecualquiercosa,comoporejemplo,unaimagen.
Elmtodo setSelectedValue() permiteestablecerculeselelementoquevaaestarseleccionado.
Sisepermitehacerseleccionesmltiples,contamosconlosmtodos:
9 setSelectedIndices() , alque se le pasa como argumento un vector de enteros que representa
losndicesaseleccionar.
9 getSelectedIndices() , que devuelve un vector de enteros que representa los ndices de los
elementosotemsqueenesemomentoestnseleccionadosenel JList .
9 getSelectedValues() ,quedevuelveunvectorde Object conloselementosseleccionadosenese
momentoenel JList .

EjemploCopiarunalistaaotra

// Cmo copiar elementos de una lista a otra.


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class PruebaSeleccionMultiple extends JFrame
{
private JList listaColores, listaCopia;
private JButton botonCopiar;
private final String nombresColores[] = { "Negro", "Azul", "Cyan",
"Gris oscuro", "Gris", "Verde", "Gris claro", "Magenta", "Naranja",
"Rosa", "Rojo", "Blanco", "Amarillo" };
// configurar GUI
public PruebaSeleccionMultiple()
{
super( "Listas de seleccin mltiple" );
// obtener panel de contenido y establecer su esquema
Container contenedor = getContentPane();
contenedor.setLayout( new FlowLayout() );
// establecer objeto JList listaColores
listaColores = new JList( nombresColores );

39

Comunicndonosconelusuario.Interfaces

DAW

listaColores.setVisibleRowCount( 5 );
listaColores.setSelectionMode(
ListSelectionModel.MULTIPLE_INTERVAL_SELECTION );
contenedor.add( new JScrollPane( listaColores ) );
// crear botn copiar y registrar su componente de escucha
botonCopiar = new JButton( "Copiar >>>" );
botonCopiar.addActionListener(
new ActionListener() {

// clase interna annima

// manejar evento de botn


public void actionPerformed( ActionEvent evento )
{
// colocar valores seleccionados en listaCopia
listaCopia.setListData( listaColores.getSelectedValues() );
}
} // fin de clase interna annima
); // fin de la llamada a addActionListener
contenedor.add( botonCopiar );
// establecer objeto JList listaCopia
listaCopia = new JList( );
listaCopia.setVisibleRowCount( 5 );
listaCopia.setFixedCellWidth( 100 );
listaCopia.setFixedCellHeight( 15 );
listaCopia.setSelectionMode(
ListSelectionModel.SINGLE_INTERVAL_SELECTION );
contenedor.add( new JScrollPane( listaCopia ) );
setSize( 325, 130 );
setVisible( true );
} // fin del constructor PruebaSeleccionMultiple
public static void main( String args[] )
{
JFrame.setDefaultLookAndFeelDecorated(true);
PruebaSeleccionMultiple aplicacion = new PruebaSeleccionMultiple();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
} // fin de la clase PruebaSeleccionMultiple

Los componentes JList permiten la seleccin de elementos de una lista, siempre que
estn uno a continuacin del otro de manera secuencial.
Si
No

5.9Listasdesplegables.
Una lista desplegable se representa en Java con el componente Swing
JComboBox . Consiste en una lista en la que slo se puede elegir una
opcin.
SepuedencrearJComboBoxestantoeditablescomonoeditables.
Unalistadesplegableesunamezclaentreuncampodetextoeditabley
una lista. Si la propiedad editable de la lista desplegable la fijamos a verdadero, o sea a true, el
usuariopodrseleccionarunodelosvaloresdelalistaquesedespliegaalpulsarelbotndelaflecha
haciaabajoydispondrdelaposibilidaddetecleardirectamenteunvalorenelcampodetexto.
Establecemoslapropiedadeditabledel JComboBox elmtodo setEditable() ysecompruebaconel
mtodo isEditable() . La clase JComboBox ofrece una serie de mtodos que tienen nombres y
funcionalidadessimilaresalosdelaclase JList .

40

DesarrollodeAplicacionesWeb

Tema7

PuedesverenelsiguientevideotutorialcmosecreaunaaplicacinconNetBeans,enlaque
sevanaadiendoloscontrolesquehemosvisto,entreellosunalistadesplegable.
http://www.youtube.com/watch?v=EVdjtl8BFu4
Se ve como con el asistente de NetBeans se crea un nuevo proyecto. En l se crea un
formulario y sobre el formulario se arrastra un panel y luego otro, uno debajo del otro,
desdelapaletadecontroles.Entremediasdelosdospaneles,sesitancuatrobotonesque
searrastrantambindesdelapaleta.
EnelpaneldearribasesitandoscontrolesComboboxarrastradosdesdelapaleta,yenel
panel de abajo se sitan tres campos de texto. Los botones se cambian de etiquetan para
que muestren respectivamente los smbolos de la suma, la resta, la multiplicacin y la
divisin.
Tambin, se editan los valores posibles que pueden tomar los combos, para que sean
nmeros.

EjemploPruebaJComboBox
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import
import
import
import

javax.swing.JComboBox;
javax.swing.JFrame;
javax.swing.JTextField;
javax.swing.WindowConstants;

/**
* Ejemplo de uso de JComboBox.
* @author chuidiang
*/
public class PruebaJComboBox {
private JTextField tf;
private JComboBox combo;
private JFrame v;
/**
* @param args
*/
public static void main(String[] args) {
new PruebaJComboBox();
}
public PruebaJComboBox()
{
// Creacion del JTextField
tf = new JTextField(20);
// Creacion del JComboBox y aadir los items.
combo = new JComboBox();
combo.addItem("uno");
combo.addItem("dos");
combo.addItem("tres");
// Accion a realizar cuando el JComboBox cambia de item seleccionado.
combo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
tf.setText(combo.getSelectedItem().toString());
}
});
// Creacion de la ventana con los componentes
v = new JFrame();
v.getContentPane().setLayout(new FlowLayout());
v.getContentPane().add(combo);
v.getContentPane().add(tf);
v.pack();

41

Comunicndonosconelusuario.Interfaces

DAW

v.setVisible(true);
v.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}

5.10Mens.
Enlasaplicacionesinformticassiempreseintentaqueelusuariodispongadeunmenparafacilitar
lalocalizacinunaoperacin.Lafilosofa,alcrearunmen,esquecontengatodaslasaccionesque
elusuariopuedarealizarenlaaplicacin.Lomsnormalytileshacerloclasificandooagrupandolas
operacionesporcategorasensubmens.
EnJavausamosloscomponentes JMenu y JMenuItem paracrearunmeneinsertarloenunabarrade
mens.
Labarrademensesuncomponente JMenuBar .Losconstructoressonlossiguientes:
9 JMenu() :Construyeunmensinttulo.
9 JMenu(String s) :Construyeunmenconttuloindicadopors.
9 JMenuItem() :Construyeunaopcinsiniconoysintexto.
9 JMenuItem(Icon icono) :Construyeunaopcinconiconoycontexto.
Podemosconstruirporcdigounmensencillocomoeldelaimagenconlassiguientessentencias:
// Crear la barra de men
JMenuBar barra = new JMenuBar();
// Crear el men Archivo
JMenu menu = new JMenu("Archivo");
// Crear las opciones del men
JMenuItem opcionAbrir = new JMenuItem("Abrir");
menu.add(opcionAbrir);
JMenuItem opcionguardar = new JMenuItem("Guardar");
menu.add(opcionguardar);
JMenuItem opcionSalir = new JMenuItem("Salir");
menu.add(opcionSalir);
// Aadir las opciones a la barra
barra.add(menu);
// Establecer la barra
setJMenuBar(barra);

Frecuentemente,dispondremosdealgunaopcindentrodeunmen,quealelegirla,nosdarpaso
aunconjuntomsampliodeopcionesposibles.
Cuandoenunmen,unelementodelmismoesasuvezunmen,seindicaconelsmboloalfinalde
esaopcin,deformaquesesepaque,alseleccionarla,nosabrirunnuevomen.
Paraincluirunmencomosubmendeotrobastaconincluircomotemdelmen,unobjetoque
tambinseaunmen,esdecir,incluirdentrodel JMenu unelementodetipo JMenu .
EjemploPruebaMenu
// Demostracin de los mens
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class PruebaMenu extends JFrame
{
private final Color valoresColor[]={Color.black,Color.blue,Color.red,Color.green };
private JRadioButtonMenuItem elementosColor[], tiposLetra[];
private JCheckBoxMenuItem elementosEstilo[];
private JLabel pantallaEtiqueta;
private ButtonGroup grupoTiposLetra, grupoColores;
private int estilo;
// configurar GUI
public PruebaMenu()
{
super( "Uso de objetos JMenu" );
// establecer men Archivo y sus elementos de men
JMenu menuArchivo = new JMenu( "Archivo" );
menuArchivo.setMnemonic( 'A' );

42

DesarrollodeAplicacionesWeb

Tema7

// establecer elemento de men Acerca de...


JMenuItem elementoAcerca = new JMenuItem( "Acerca de..." );
elementoAcerca.setMnemonic( 'c' );
menuArchivo.add( elementoAcerca );
elementoAcerca.addActionListener(
new ActionListener() {

// clase interna annima

// mostrar cuadro de dilogo de mensaje cuando el usuario seleccione Acerca de...


public void actionPerformed( ActionEvent evento )
{
JOptionPane.showMessageDialog( PruebaMenu.this,
"ste es un ejemplo\ndel uso de mens",
"Acerca de", JOptionPane.PLAIN_MESSAGE );
}
}

// fin de la clase interna annima

); // fin de la llamada a addActionListener


// establecer elemento de men Salir
JMenuItem elementoSalir = new JMenuItem( "Salir" );
elementoSalir.setMnemonic( 'S' );
menuArchivo.add( elementoSalir );
elementoSalir.addActionListener(
new ActionListener() {

// clase interna annima

// terminar la aplicacin cuando el usuario haga clic en elementoSalir


public void actionPerformed( ActionEvent evento )
{
System.exit( 0 );
}
}

// fin de la clase interna annima

); // fin de la llamada a addActionListener


// crear barra de mens y adjuntarla a la ventana PruebaMenu
JMenuBar barra = new JMenuBar();
setJMenuBar( barra );
barra.add( menuArchivo );
// crear men Formato, con sus submens y elementos de men
JMenu menuFormato = new JMenu( "Formato" );
menuFormato.setMnemonic( 'F' );
// crear submen Color
String colores[] = { "Negro", "Azul", "Rojo", "Verde" };
JMenu menuColor = new JMenu( "Color" );
menuColor.setMnemonic( 'C' );
elementosColor = new JRadioButtonMenuItem[ colores.length ];
grupoColores = new ButtonGroup();
ManejadorEventos manejadorEventos = new ManejadorEventos();
// crear elementos de men tipo botones de opcin para el men Color
for ( int cuenta = 0; cuenta < colores.length; cuenta++ ) {
elementosColor[ cuenta ] =
new JRadioButtonMenuItem( colores[ cuenta ] );
menuColor.add( elementosColor[ cuenta ] );
grupoColores.add( elementosColor[ cuenta ] );
elementosColor[ cuenta ].addActionListener( manejadorEventos );
}
// seleccionar primer elemento del men Color
elementosColor[ 0 ].setSelected( true );
// agregar el men Formato a la barra de mens
menuFormato.add( menuColor );
menuFormato.addSeparator();
// crear submen Tipo de letra
String nombresTiposLetra[] = { "Serif", "Monospaced", "SansSerif" };
JMenu menuTiposLetra = new JMenu( "Tipo de letra" );

43

Comunicndonosconelusuario.Interfaces

menuTiposLetra.setMnemonic( 'T' );
tiposLetra = new JRadioButtonMenuItem[ nombresTiposLetra.length ];
grupoTiposLetra = new ButtonGroup();
// crear elementos de men tipo botones de opcin para el men Tipos de letra
for ( int cuenta = 0; cuenta < tiposLetra.length; cuenta++ ) {
tiposLetra[ cuenta ] = new JRadioButtonMenuItem( nombresTiposLetra[ cuenta ] );
menuTiposLetra.add( tiposLetra[ cuenta ] );
grupoTiposLetra.add( tiposLetra[ cuenta ] );
tiposLetra[ cuenta ].addActionListener( manejadorEventos );
}
// seleccionar el primer elemento del men Tipo de letra
tiposLetra[ 0 ].setSelected( true );
menuTiposLetra.addSeparator();
// establecer elementos del men Estilo
String nombresEstilo[] = { "Negrita", "Cursiva" };
elementosEstilo = new JCheckBoxMenuItem[ nombresEstilo.length ];
ManejadorEstilo manejadorEstilo = new ManejadorEstilo();
// crear elementos de men tipo casilla de verificacin para el men Estilo
for ( int cuenta = 0; cuenta < nombresEstilo.length; cuenta++ ) {
elementosEstilo[ cuenta ] =
new JCheckBoxMenuItem( nombresEstilo[ cuenta ] );
menuTiposLetra.add( elementosEstilo[ cuenta ] );
elementosEstilo[ cuenta ].addItemListener( manejadorEstilo );
}
// colocar men Tipo de letra en el men Formato
menuFormato.add( menuTiposLetra );
// agregar men Formato a la barra de mens
barra.add( menuFormato );
// establecer etiqueta para mostrar texto
pantallaEtiqueta = new JLabel( "Texto de ejemplo", SwingConstants.CENTER );
pantallaEtiqueta.setForeground( valoresColor[ 0 ] );
pantallaEtiqueta.setFont( new Font( "Serif", Font.PLAIN, 72 ) );
getContentPane().setBackground( Color.CYAN );
getContentPane().add( pantallaEtiqueta, BorderLayout.CENTER );
setSize( 550, 200 );
setVisible( true );
} // fin del constructor
public static void main( String args[] )
{
JFrame.setDefaultLookAndFeelDecorated(true);
PruebaMenu aplicacion = new PruebaMenu();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
// clase interna para manejar eventos de accin de los elementos de men
private class ManejadorEventos implements ActionListener {
// procesar selecciones de color y tipo de letra
public void actionPerformed( ActionEvent evento )
{
// procesar seleccin de color
for ( int cuenta = 0; cuenta < elementosColor.length; cuenta++ )
if ( elementosColor[ cuenta ].isSelected() ) {
pantallaEtiqueta.setForeground( valoresColor[ cuenta ] );
break;
}
// procesar seleccin de tipo de letra
for ( int cuenta = 0; cuenta < tiposLetra.length; cuenta++ )
if ( evento.getSource() == tiposLetra[ cuenta ] ) {
pantallaEtiqueta.setFont(

44

DAW

DesarrollodeAplicacionesWeb

Tema7

new Font( tiposLetra[ cuenta ].getText(), estilo, 72 ) );


break;
}
repaint();
} // fin del mtodo actionPerformed
} // fin de la clase ManejadorEventos
// clase interna para manejar eventos de los elementos de men tipo casilla de verificacin
private class ManejadorEstilo implements ItemListener {
// procesar selecciones de estilo de tipo de letra
public void itemStateChanged( ItemEvent e )
{
estilo = 0;
// checar seleccin de negrita
if ( elementosEstilo[ 0 ].isSelected() )
estilo += Font.BOLD;
// checar seleccin de cursiva
if ( elementosEstilo[ 1 ].isSelected() )
estilo += Font.ITALIC;
pantallaEtiqueta.setFont(
new Font( pantallaEtiqueta.getFont().getName(), estilo, 72 ) );
repaint();
}
} // fin de la clase ManejadorEstilo
} // fin de la clase PruebaMenu

Un men se crea utilizando el componente JMenu dentro de un JList


Si
No

5.10.1Separadores.
A veces, en un men pueden aparecer distintas opciones. Por ello, nos puede
interesardestacarundeterminadogrupodeopcionesoelementosdelmencomo
relacionadosentresporreferirseaunmismotema,osimplementeparasepararlos
deotrosquenotienenningunarelacinconellos.
ElcomponenteSwingquetenemosenJavaparaestafuncionalidades:
JSeparator ,quedibujaunalneahorizontalenelmen,yasseparavisualmenteen
dos partes a los componentes de ese men. En la imagen podemos ver cmo se han separado las
opcionesdeAbriryGuardardelaopcindeSalir,medianteestecomponente.
Alcdigoanterior,tanslohabraqueaadirleunalnea,laqueresaltamosennegrita:

menu.add(opcionguardar);
menu.add(new JSeparator());
JMenuItem opcionSalir = new JMenuItem("Salir");

En un men en Java se debe introducir siempre un separador para que se pueda


compilar el cdigo
Si
No

45

Comunicndonosconelusuario.Interfaces

DAW

Enesteenlacepodrsencontrarmsinformacinsobrediseodemens.
http://biblioteca.uns.edu.pe/saladocentes/archivoz/publicacionez/Programacion_Visual_co
n_Java_2.pdf

5.10.2Aceleradoresdetecladoymnemnicos.
Aveces,tenemosqueusarunaaplicacinconinterfazgrfica y
no disponemos de ratn, porque se nos ha roto, o cualquier
causa.
Adems, cuando diseamos una aplicacin, debemos
preocuparnosdelascaractersticasdeaccesibilidad.
Algunasempresasdedesarrollodesoftwareobliganatodossus
empleados a trabajar sin ratn al menos un da al ao, para
obligarlesatomarconcienciadelaimportanciadequetodassus
aplicacionesdebenseraccesibles,usablessindisponerderatn.
Yanosloenmens,sinoencualquiercomponente interactivodeunaaplicacin:campodetexto,
botndeaccin,listadesplegable,etc,esmuyrecomendablequepuedaseleccionarsesinelratn,
haciendousoexclusivamentedelteclado.
Paraconseguirquenuestrosmensseanaccesiblesmedianteelteclado,laideaesusaraceleradores
detecladooatajosdetecladoydemnemnicos.
Unaceleradoroatajodetecladoesunacombinacindeteclasqueseasociaaunaopcindelmen,
de forma que pulsndola se consigue el mismo efecto que abriendo el men y seleccionando esa
opcin.
Esa combinacin de teclas aparece escrita a la derecha de la opcin del men, de forma que el
usuariopuedatenerconocimientodesuexistencia.
Paraaadirunatajodeteclado,loquesehaceesemplearlapropiedad accelerator eneldiseador
Los atajosdetecladonosuelenasignarseatodaslasopcionesdelmen,sinosloalasquemsse
usan.
Un mnemnico consiste en resaltar una tecla dentro de esa opcin, mediante un subrayado, de
forma que pulsando Alt + <el mnemnico> se abra el men correspondiente. Por ejemplo en la
imagenconAlt+Aabriramosesemenqueseve,yahoraconCtrl+Gseguardaraeldocumento.
Paraaadirmediantecdigounmnemnicoaunaopcindelmen,sehacemediantelapropiedad
mnemonic .
Losmnemnicossquedeberanserincluidosparatodaslasopcionesdelmen,deformaquetodas
puedan ser elegidas haciendo uso slo del teclado, mejorando as la accesibilidad de nuestra
aplicacin. Para ver cmo se aadira mediante el diseador de NetBeans, mira el siguiente Debes
conocer.

Enelsiguienteenlacesepuedevercmoaadiraunaaplicacinqueestemosconstruyendo
conNetBeans,entreotrascosas,mnemnicosyaceleradores
http://jtagua.wordpress.com/2010/09/24/tutorialdejavaswing11jmenubarjmenu
jmenuitemjprogressbarjtextarea/

46

TEMA8

INDICE
1.Introduccinalasestructurasdealmacenamiento...........................................................................4
2.Cadenasdecaracteres.......................................................................................................................5
2.1.Operacionesavanzadasconcadenasdecaracteres.(I)..............................................................................6
2.1.1.Operacionesavanzadasconcadenasdecaracteres.(II)........................................................................................7
2.1.2.Operacionesavanzadasconcadenasdecaracteres.(III).......................................................................................8
Sintaxisdelascadenasdeformatoyusodelmtodoformat.........................................................................................11
2.1.3.Operacionesavanzadasconcadenasdecaracteres.(III).....................................................................................13
2.1.4.Operacionesavanzadasconcadenasdecaracteres.(IV).....................................................................................14
2.2.Expresionesregulares.(I)..........................................................................................................................15
2.2.1.Expresionesregulares.(II)....................................................................................................................................17
2.2.2.Expresionesregulares.(III)...................................................................................................................................18
3.Creacindearrays............................................................................................................................20
3.1.Usodearraysunidimensionales...............................................................................................................22
3.2.Inicializacin..............................................................................................................................................23
4.Arraysmultidimensionales...............................................................................................................25
4.1.Usodearraysmultidimensionales............................................................................................................26
4.2.Inicializacindearraysmultidimensionales.............................................................................................27
5.Clasesymtodosgenricos.(I)........................................................................................................28
5.1.Clasesymtodosgenricos.(II)................................................................................................................29
6.Introduccinalascolecciones.(I)....................................................................................................32
7.Conjuntos.(I)....................................................................................................................................34
7.1.Conjuntos.(II)............................................................................................................................................35
Ejercicioresuelto.............................................................................................................................................................................35
7.2.Conjuntos.(III)...........................................................................................................................................36
7.3.Conjuntos.(IV)..........................................................................................................................................37
7.4.Conjuntos.(V)...........................................................................................................................................38
Ejercicioresuelto.............................................................................................................................................................................38
8.Listas.(I)...........................................................................................................................................40
8.1.Listas.(II)...................................................................................................................................................41
8.2.Listas.(III)..................................................................................................................................................42
8.3.Listas.(IV)..................................................................................................................................................43
9.Conjuntosdeparesclave/valor........................................................................................................44
10.Iteradores.(I).................................................................................................................................45
10.1.Iteradores.(II).........................................................................................................................................45
11.Algoritmos.(I).................................................................................................................................47
11.1.Algoritmos.(II)........................................................................................................................................50
11.2.Algoritmos.(III).......................................................................................................................................51
12.TratamientodedocumentosestructuradosXML..........................................................................53
12.1.QuesundocumentoXML?.................................................................................................................54
12.2.LibrerasparaprocesardocumentosXML.(I).........................................................................................55
12.2.1.LibrerasparaprocesardocumentosXML.(II)....................................................................................................56
12.3.ManipulacindedocumentosXML.(I).....................................................................................................59
12.3.1.ManipulacindedocumentosXML.(II)...............................................................................................................60
Obtenerlalistadehijosdeunelementoyprocesarla.....................................................................................................................60
Aadirunnuevoelementohijoaotroelemento.............................................................................................................................60
12.3.2.ManipulacindedocumentosXML.(III)..............................................................................................................61
Eliminarunelementohijodeotroelemento...................................................................................................................................61
Cambiarelcontenidodeunelementocuandosoloestexto...........................................................................................................61
12.3.3.ManipulacindedocumentosXML.(IV)..............................................................................................................62
Atributosdeunelemento................................................................................................................................................................65

Aplicacindelasestructurasdealmacenamiento

DAW

DesarrollodeAplicacionesWeb

Tema8

APLICACINDELASESTRUCTURASDE
ALMACENAMIENTO.
CASO PRCTICO.
Ana ha recibido un pequeo encargo de parte de su tutora, Mara. Se trata de que realice un
pequeo programita, muy sencillo pero fundamental.
-Hola Ana -dice Mara-, hoy tengo una tarea especial para ti.
-Si? -responde Ana-. Estoy deseando, ltimamente no hay nada que se me resista, llevo dos
semanas en racha.
-Bueno, quizs esto se te resista un poco ms, es fcil, pero tiene cierta complicacin. Un cliente para
el que hicimos una aplicacin, nos ha dicho si podemos ayudarle. El cliente tiene una aplicacin para
gestionar los pedidos que recibe de sus clientes. Normalmente, recibe por correo electrnico los
pedidos en un formato concreto que todos sus clientes llevan tiempo usando. El cliente suele
transcribir el pedido desde el correo electrnico a la aplicacin, copiando dato a dato, pero nos ha
preguntado si es posible que copie todo el pedido de golpe, y que la aplicacin lo procese, detectando
posibles errores en el pedido.
-Qu? -dice Mara con cierta perplejidad.
-Me alegra que te guste -dice Mara esbozando una sonrisa picara-, se que te gustan los retos.
-Pero, eso como se hace? Cmo compruebo yo si el pedido es vlido? Y si el cliente ha puesto
un producto que no existe?
-No mujer, se trata de comprobar si el pedido tiene el formato correcto, y transformarlo de forma que
se genere un documento XML con los datos del pedido. Un documento XML luego se puede
incorporar fcilmente a los otros pedidos que tenga el cliente en su base de datos. De la verificacin
de si hay algn producto que no existe, o de si hay alguna incoherencia en el pedido se encarga otra
parte del software, que ya he realizado yo.
-Bueno -dice Mara justo despus de resoplar tres veces seguidas-, empieza por contarme que es el
formato XML.

Cuandoelvolumendedatosamanejarporunaaplicacineselevado,nobastaconutilizarvariables.
Manejarlosdatosdeun nicopedidoenunaaplicacinpuede serrelativamentesencillo,puesun
pedido est compuesto por una serie de datos y eso simplemente se traduce en varias variables.
Pero,quocurrecuandoenunaaplicacintenemosquegestionarvariospedidosalavez?
Lomismoocurreenotroscasos.Parapoderrealizarciertasaplicacionessenecesitapodermanejar
datosquevanmsalldemerosdatossimples(nmerosyletras).Aveces,losdatosquetieneque
manejarlaaplicacinsondatoscompuestos,esdecir,datosqueestncompuestosasuvezdevarios
datosmssimples.Porejemplo,unpedidoestcompuestoporvariosdatos,losdatospodranserel
clientequehaceelpedido,ladireccindeentrega,lafecharequeridadeentregaylosartculosdel
pedido.
Los datos compuestos son un tipo de estructura de datos, y en realidad ya los has manejado. Las
clases son un ejemplo de estructuras de datos que permiten almacenar datos compuestos, y el
objeto en s, la instancia de una clase, sera el dato compuesto. Pero, a veces, los datos tienen
estructurasanmscomplejas,ysonnecesariassolucionesadicionales.
Aqu podrs aprender esas soluciones adicionales. Esas soluciones consisten bsicamente en la
capacidaddepodermanejarvariosdatosdelmismoodiferentetipodeformadinmicayflexible.

Aplicacindelasestructurasdealmacenamiento

DAW

1.Introduccinalasestructurasdealmacenamiento.
Cmoalmacenarasenmemoriaunlistadodenmerosdelquetienesqueextraerelvalormximo?
Seguro que te resultara fcil. Pero, y si el listado de nmeros no tiene un tamao fijo, sino que
puedevariarentamaodeformadinmica?Entonceslacosasecomplica.
Un listado de nmeros que aumenta o decrece en tamao es una de las cosas que aprenders a
utilizaraqu,utilizandoestructurasdedatos.
Pasaremosporaltolasclasesylosobjetos,puesyaloshasvistoconanterioridad,perodebessaber
quelasclasesensmismassonlaevolucindeuntipodeestructurasdedatosconocidascomodatos
compuestos(tambinllamadasregistros).Lasclases,ademsdeaportarlaventajadeagrupardatos
relacionados entre s en una misma estructura (caracterstica aportada por los datos compuestos),
permitenagregarmtodosquemanejendichosdatos,ofreciendounaherramientadeprogramacin
sinigual.Perotodoestoyalosabas.
Lasestructurasdealmacenamiento,engeneral,sepuedenclasificardevariasformas.Porejemplo,
atendiendoasipuedenalmacenardatosdediferentetipo,osisolopuedenalmacenardatosdeun
solotipo,sepuedendistinguir:
9 Estructuras con capacidad de almacenar varios datos del mismo tipo: varios nmeros, varios
caracteres,etc.Ejemplosdeestasestructurassonlosarrays,lascadenasdecaracteres,laslistas
ylosconjuntos.
9 Estructurasconcapacidaddealmacenarvariosdatosdedistintotipo:nmeros,fechas,cadenas
de caracteres, etc., todo junto dentro de una misma estructura. Ejemplos de este tipo de
estructurassonlasclases.
Otraformadeclasificarlasestructurasdealmacenamientovaenfuncindesipuedenonocambiar
detamaodeformadinmica:
9 Estructurascuyotamaoseestableceenelmomentodelacreacinodefinicinysutamao
no puede variar despus. Ejemplos de estas estructuras son los arrays y las matrices (arrays
multimensionales).
9 Estructurascuyotamaoesvariable(conocidascomoestructurasdinmicas).Sutamaocrece
odecrecesegnlasnecesidadesdeformadinmica.Eselcasodelaslistas,rboles,conjuntosy,
comoveremostambin,elcasodealgunostiposdecadenasdecaracteres.
Porltimo,atendiendoalaformaenlaquelosdatosseordenandentrodelaestructura,podemos
diferenciarvariostiposdeestructuras:
9 Estructurasquenoseordenandepors,ydebeserelprogramadorelencargadodeordenarlos
datossifueranecesario.Unejemplodeestasestructurassonlosarrays.
9 Estructurasordenadas.Setratadeestructurasquealincorporarundatonuevoatodoslosdatos
existentes, este se almacena en una posicin concreta que ir en funcin del orden. El orden
establecido en la estructura puede variar dependiendo de las necesidades del programa:
alfabtico,ordennumricodemayoramenor,momentodeinsercin,etc.
Todavanoconocesmuchodelasestructuras,yprobablementetodotesuenararoyextrao.Note
preocupes,pocoapocoirsdescubrindolas.Versquesonsencillasdeutilizarymuycmodas.

El tamao de las estructuras de almacenamiento siempre se determina en el momento de


la creacin.

Verdadero
Falso

DesarrollodeAplicacionesWeb

Tema8

2.Cadenasdecaracteres.
CASO PRCTICO
Ana est asustada, le acaban de asignar una nueva tarea y le acaban de enviar por correo el formato
del archivo que tiene que procesar. El archivo tiene un formato concreto, un tanto extrao. Primero
tiene una cabecera con informacin general del pedido, y luego tiene los artculos del pedido, cada
uno en una lnea diferente.
Podr realizar la tarea encomendada? Seguro que s.
La empresa recibe los pedidos siguiendo un modelo normalizado. En realidad se trata de una
pequea aplicacin web que al rellenar un formulario, enva un correo electrnico con la informacin
siguiendo una estructura fija. A continuacin puedes ver un ejemplo:
## PEDIDO ##
Nmero de pedido: { 20304 }
Cliente: { Muebles Bonitos S.A. }
Cdigo del cliente: { 00293 }
Direccin de factura: { C/ De en frente, 11 }
Direccin de entrega: { C/ De al lado, 22 }
Nombre del contacto: { Elias }
Telfono del contacto: { 987654321 }
Correo electrnico del contacto: { mail@mail1234.com }
Fecha preferente de entrega: { 19/11/2012 }
Forma de pago: { Transferencia }
## ARTICULOS ##
{ Cdigo Artculo | Descripcin | Cantidad }
{ 0001231 | Tuercas tipo 1 | 200 }
{ 0001200 | Tornillos tipo 1 | 200 }
{ 0002200 | Arandelas tipo 2 | 200 }
## FIN ARTICULOS ##
## FIN PEDIDO ##

Como puedes observar, el pedido tiene una estructura fija, y solamente cambian los datos que estn
entre llaves. El resto del texto es fijo, dado que como se ha dicho antes, el pedido lo genera una
aplicacin web, y lo enva por correo electrnico al cliente.
Cuando un cliente solicita un pedido a esta empresa, no puede poner en ningn campo los smbolos
"{", "}", ni "|", porque entonces entrara en conflicto con el formato enviado por correo y dara
problemas, as que se opt por impedir que el cliente pudiera poner dichos caracteres extraos. Esto
garantiza que cada campo del pedido se va a poder leer adecuadamente.
Lo ms conflictivo, es la seccin de artculos del pedido, en su primera parte, tiene una especie de
cabecera que ayuda a identificar que es cada una de las columnas. Y despus, tiene tantas lneas
como artculos tenga el pedido, si tiene 100 artculos, tendrn 100 lneas que incluirn: cdigo del
artculo, descripcin del artculo y la cantidad.

Probablemente,unadelascosasquemsutilizarscuandoestsprogramandoencualquierlenguaje
de programacin son las cadenas de caracteres. Las cadenas de caracteres son estructuras de
almacenamientoquepermitenalmacenarunasecuenciadecaracteresdecasicualquierlongitud.Y
lapreguntaahoraes,quesuncarcter?
EnJavayentodolenguajedeprogramacin,yporende,entodosistemainformtico,loscaracteres
se codifican como secuencias de bits que representan a los smbolos usados en la comunicacin
humana.Estossmbolospuedenserletras,nmeros,smbolosmatemticoseinclusoideogramasy
pictogramas.

Siquierespuedesprofundizarenlacodificacindecaracteresleyendoelsiguienteartculo
delaWikipedia.
http://es.wikipedia.org/wiki/Codificacin_de_caracteres

Laformamshabitualdeverescritaunacadenadecaracteresescomounliteraldecadena.Consiste
simplementeenunasecuenciadecaracteresentrecomillasdobles,porejemplo:"Ejemplodecadena
decaracteres".
EnJava,losliteralesdecadenasonenrealidadinstanciasdelaclase String ,locualquieredecirque,
por el mero hecho de escribir un literal, se crear una instancia de dicha clase. Esto da mucha
flexibilidad, puesto que permite crear cadenas de muchas formas diferentes, pero obviamente
consumemuchamemoria.Laformamshabitualescrearunacadenapartiendodeunliteral:

Aplicacindelasestructurasdealmacenamiento

DAW

String cad="Ejemplo de cadena";

Enestecaso,elliteraldecadenasituadoaladerechadeligualesenrealidadunainstanciadelaclase
String . Al realizar esta asignacin hacemos que la variable cad se convierta en una referencia al
objetoyacreado.Otraformadecrearunacadenaesusandoeloperador new yunconstructor,como
porejemplo:
String cad=new String ("Ejemplo de cadena");

Cuandosecreanlascadenasdeestaforma,serealizaunacopiaenmemoriadelacadenapasadapor
parmetro.Lanuevainstanciadelaclase String harreferenciaportantoalacopiadelacadena,y
noaloriginal.

Fijateenelsiguientelneadecdigo,cuntasinstanciasdelaclaseStringves?
String cad="Ejemplo de cadena 1";
cad="Ejemplo de cadena 2";
cad=new String("Ejemplo de cadena 3");

Pues en realidad hay 4 instancias. La primera instancia es la que se crea con el literal de cadena
"Ejemplodecadena1".Elsegundoliteral,"Ejemplodecadena2",dalugaraotrainstanciadiferente
a la anterior. El tercer literal, "Ejemplo de cadena 3", es tambin nuevamente otra instancia de
String diferente.Yporltimo,alcrearunanuevainstanciadelaclase String atravsdeloperador
new ,secreaunnuevoobjeto String copiandoparaelloelcontenidodelacadenaqueselepasapor
parmetro,conloqueaqutenemoslacuartainstanciadelobjeto String ensolounalnea.

2.1.Operacionesavanzadasconcadenasdecaracteres.(I)
Quoperacionespuedeshacerconunacadena?Muchasmsdelasqueteimaginas.Empezaremos
conlaoperacinmssencilla:laconcatenacin.Laconcatenacineslaunindedoscadenas,para
formarunasola.EnJavaesmuysencillo,puesslotienesqueutilizareloperadordeconcatenacin
(signodesuma):
String cad = "Bien"+"venido!";
System.out.println(cad);

En la operacin anterior se est creando una nueva cadena, resultado de unir dos cadenas: una
cadena con el texto "Bien", y otra cadena con el texto "venido!". La segunda lnea de cdigo
muestraporlasalidaestndarelresultadodelaconcatenacin.Elresultadodesuejecucinserque
aparecereltexto"Bienvenido!"porlapantalla.
Otraformadeusarlaconcatenacin,queilustraquecadaliteraldecadenaesasuvezunainstancia
delaclase String ,esusandoelmtodoconcatdelobjeto String :
String cad="Bien".concat("venido!");
System.out.printf(cad);

Fjate bien en la expresin anterior, pues genera el mismo resultado que la primera opcin y en
ambasparticipantresinstanciasdelaclase String .Unainstanciaquecontieneeltexto"Bien",otra
instancia que contiene el texto "venido!", y otra que contiene el texto "Bienvenido!". La tercera
cadena se crea nueva al realizar la operacin de concatenacin, sin que las otras dos hayan
desaparecido.Peronotepreocupesporlasotrasdoscadenas,puesseborrarndememoriacuando
elrecolectordebasuradetectequeyanoseusan.
Fjate adems, que se puede invocar directamente un mtodo de la clase String , posponiendo el
mtodo al literal de cadena. Esto es una seal de que al escribir un literal de cadena, se crea una
instanciadelobjetoinmutable(aquellosquenosepuedenmodificarunavezcreados.EselcasodelosStringdeJava,
ascomolasclasesenvoltorioInteger,Float,Double,etc.) String .
Peronosolopodemosconcatenarunacadenaaotracadena.Graciasalmtodo toString() podemos
concatenarcadenasconliteralesnumricoseinstanciasdeotrosobjetossinproblemas.

Elmtodo toString() esunmtododisponibleentodaslasclasesdeJava.Suobjetivoessimple,


permitir la conversin de una instancia de clase en cadena de texto, de forma que se pueda
convertir a texto el contenido de la instancia. Lo de convertir, no siempre es posible, hay clases
fcilmenteconvertiblesatexto,comoeslaclase Integer ,porejemplo,yotrasquenosepueden
convertir,yqueelresultadodeinvocarelmtodo toString() esinformacinrelativaalainstancia.
6

DesarrollodeAplicacionesWeb

Tema8

Lagranventajadelaconcatenacinesqueelmtodo toString() seinvocarautomticamente,sin


quetengamosqueespecificarlo,porejemplo:
Integer i1=new Integer (1223); // La instancia i1 de la clase Integer contiene el nmero 1223.
System.out.println("Nmero: " + i1); // Se mostrar por pantalla el texto "Nmero: 1223"

Enelejemploanterior,sehainvocadoautomticamente i1.toString() ,paraconvertirelnmeroa


cadena. Esto se realizar para cualquier instancia de clase concatenada, pero cuidado, como se ha
dichoantes,notodaslasclasessepuedenconvertiracadenas.

Qu se mostrar como resultado


System.out.println(4+1+"-"+4+1); ?

de

ejecutar

el

siguiente

cdigo

Mostrarlacadena"541"
Mostrarlacadena"4114"
Esaoperacindarerror

2.1.1.Operacionesavanzadasconcadenasdecaracteres.(II)
Vamos a continuar revisando las operaciones que se pueden realizar con cadenas. Como vers las
operacionesarealizarsecomplicanunpocoapartirdeahora.Entodoslosejemploslavariablecad
contienelacadena"Bienvenido!",comosemuestraenlasimgenes.
9 int length() . Retorna un nmero entero
que contiene la longitud de una cadena, Stringcad= B e n v e n d o !
resultadodecontarelnmerodecaracteres
Longitud=12
porlaqueestcompuesta.Recuerdaqueun
espacioestambinuncarcter.
9 char charAt(int pos) . Retorna el carcter ubicado en la posicin pasada por parmetro. El
carcterobtenidodedichaposicinser
almacenadoenuntipodedato char .Las
0 1 2 3 4 5 6 7 8 9 10 11 Posicin
posiciones se empiezan a contar desde Stringcad= B e n v e n d o !
el 0 (y no desde el 1), y van desde 0
hastalongitud1.Porejemplo,elcdigo
cad.charAt(11)
cad.charAt(0) cad.charAt(4)
siguiente mostrara por pantalla el
carcter"v":
char t = cad.charAt(5);
System.out.println(t);

String substring(int beginIndex, int endIndex) .Estemtodopermiteextraerunasubcadena


de otra de mayor tamao. Una cadena
compuesta por todos los caracteres
0 1 2 3 4 5 6 7 8 9 10 11 Posicin
existentes entre la posicin beginIndex Stringcad= B e n v e n d o !
ylaposicinendIndex1.Porejemplo,
substring(5,11)
substring(0,5)
si pusiramos cad.substring(0,5) en
0 1 2 3 4 5 6 7 8 9 10 11 Posicin
nuestroprograma,sobrelavariablecad
anterior, dicho mtodo devolvera la Stringcad= B e n v e n d o !
subcadena "Bien" tal y como se
substring(2)
muestraenlaimagen.
9 String substring (int beginIndex) . Cuando al mtodo substring solo le proporcionamos un
parmetro, extraer una cadena que comenzar en el carcter con posicin beginIndex e ir
hasta el final de la cadena. En el siguiente ejemplo se mostrara por pantalla la cadena
ienvenido!:
String subcad = cad.substring(2);
System.out.println(subcad);

Otraoperacinmuyhabitualeslaconversindenmeroacadenaydecadenaanmero.Imagnate
que un usuario introduce su edad. Al recoger la edad desde la interfaz de usuario, capturars

Aplicacindelasestructurasdealmacenamiento

DAW

generalmente una cadena, pero, cmo compruebas que la edad es mayor que 0? Para poder
realizar esa comprobacin tienes que pasar la cadena a nmero. Empezaremos por ver como se
convierteunnmeroacadena.

Losnmerosgeneralmentesealmacenanenmemoriacomonmerosbinarios,esdecir,secuencias
deunosycerosconlosquesepuedeoperar(sumar,restar,etc.).Nodebesconfundirlostiposde
datos quecontienen nmeros( int , short , long , float y double )conlas secuenciasdecaracteres
querepresentanunnmero.Noeslomismo123que"123",elprimeroesunnmeroyelsegundo
esunacadenaformadaportrescaracteres:'1','2'y'3'.
Convertir un nmero a cadena es fcil desde que existe, para todas las clases Java, el mtodo
toString() .Graciasaesemtodopodemoshacercosascomolassiguientes:
String cad2="Nmero cinco: " + 5;
System.out.println(cad2);

Elresultadodelcdigoanterioresquesemostrarporpantalla"Nmerocinco:5",ynodarningn
error.EstoesposiblegraciasaqueJavaconvierteelnmero5asuclaseenvoltorio(wrapperclass)
correspondiente ( Integer , Float , Double , etc.), y despus ejecuta automticamente el mtodo
toString() dedichaclase.

Cul crees que ser el resultado de poner System.out.println(A+5f) ? Prubalo y recuerda: no


olvides indicar el tipo de literal ( f para lo literales de nmeros flotantes, y d para los literales de
nmerosdobles),asobtendrselresultadoesperadoynoalgodiferente.
2.1.2.Operacionesavanzadasconcadenasdecaracteres.(III)
Cmo comprobaras que la cadena "3" es mayor que 0? No puedes comparar directamente una
cadena con un nmero, as que necesitars aprender cmo convertir cadenas que contienen
nmeros a tipos de datos numricos ( int , short , long , float o double ). Esta es una operacin
habitual en todos los lenguajes de programacin, y Java, para este propsito, ofrece los mtodos
valueOf ,existentesentodaslasclasesenvoltoriodescendientesdelaclaseNumber: Integer , Long ,
Short , Float y Double .
Veamos un ejemplo de su uso para un nmero de doble precisin, para el resto de las clases es
similar:
String c="1234.5678";
double n;
try {
n=Double.valueOf(c).doubleValue();
} catch (NumberFormatException e)
{ /* Cdigo a ejecutar si no se puede convertir */ }

Fijate en el cdigo anterior, en l puedes comprobar cmo la cadena c contiene en su interior un


nmero, pero escrito con dgitos numricos (caracteres). El cdigo escrito esta destinado a
transformar la cadena en nmero, usando el mtodo valueOf . Este mtodo lanzar la excepcin
NumberFormatException sinoconsigueconvertireltextoanmero.Enelsiguientearchivo,tienesun
ejemplomscompleto,dondeaparecentambinejemplosparalasotrostiposnumricos:

import javax.swing.JOptionPane;
/**
* Ejemplo en el que se muestra la conversin de varias cadenas de texto, que
* contienen nmeros, a nmeros.
* @author Salvador Romero Villegas
*/
public class EjemplosConversionStringANumero {
boolean operacionCancelada;
/**
* Constructor de la clase.
*/
public EjemplosConversionStringANumero() {

DesarrollodeAplicacionesWeb

Tema8

setOperacionCancelada(false);
}
/**
* Mtodo que permite comprobar si la ltima operacin tipo Pedir ha sido
* cancelada.
* @return true si la ltima operacin realizada ha sido cancelada, false
* en otro caso.
*/
public boolean isOperacionCancelada() {
return operacionCancelada;
}
/**
* Mtodo que permite cambiar el estado de la variable privada
* operacionCancelada. Este mtodo es privado y solo debe usarse desde
* un mtodo propio de esta clase.
* @param operacionCancelada True o false, el nuevo estado para la variable.
*/
private void setOperacionCancelada(boolean operacionCancelada) {
this.operacionCancelada = operacionCancelada;
}
/**
* Clase que pide al usuario que introduzca un nmero. El nmero esperado
* es un nmero de doble precisin, en cualquiera de sus formatos. Admitir
* nmeros como: 2E10 (2*10^10); 2,45; etc.
* @param titulo
* @param mensaje
* @return
*/
public double PedirNumeroDouble(String titulo, String mensaje) {
double d = 0;
setOperacionCancelada(false);
boolean NumeroValido = false;
do {
String s = (String) JOptionPane.showInputDialog(null, mensaje,
titulo, JOptionPane.PLAIN_MESSAGE, null, null, "");
if (s != null) {
try {
d = Double.valueOf(s).doubleValue();
NumeroValido = true;
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "El nmero introducido no es vlido.",
"Error", JOptionPane.ERROR_MESSAGE);
}
}
else { NumeroValido=true; // Cancelado
setOperacionCancelada(true);
}
} while (!NumeroValido);
return d;
}
/**
* Clase que pide al usuario que introduzca un nmero. El nmero esperado
* es un nmero de precisin sencilla, en cualquiera de sus formatos.
* @param titulo
* @param mensaje
* @return
*/
public float PedirNumeroFloat (String titulo, String mensaje) {
float d = 0;
setOperacionCancelada(false);
boolean NumeroValido = false;
do {
String s = (String) JOptionPane.showInputDialog(null, mensaje,
titulo, JOptionPane.PLAIN_MESSAGE, null, null, "");
if (s != null) {
try {
d = Float.valueOf(s).floatValue();
NumeroValido = true;
} catch (NumberFormatException e) {

Aplicacindelasestructurasdealmacenamiento

DAW

JOptionPane.showMessageDialog(null, "El nmero introducido no es vlido.",


"Error", JOptionPane.ERROR_MESSAGE);
}
}
else { NumeroValido=true; // Cancelado
setOperacionCancelada(true);
}
} while (!NumeroValido);
return d;
}
/**
* Clase que pide al usuario que introduzca un nmero. El nmero esperado
* es un nmero entero.
* @param titulo
* @param mensaje
* @return
*/
public int PedirNumeroInteger (String titulo, String mensaje) {
int d = 0;
setOperacionCancelada(false);
boolean NumeroValido = false;
do {
String s = (String) JOptionPane.showInputDialog(null, mensaje,
titulo, JOptionPane.PLAIN_MESSAGE, null, null, "");
if (s != null) {
try {
d = Integer.valueOf(s).intValue();
NumeroValido = true;
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "El nmero introducido no es vlido.",
"Error", JOptionPane.ERROR_MESSAGE);
}
}
else { NumeroValido=true; // Cancelado
setOperacionCancelada(true);
}
} while (!NumeroValido);
return d;
}
/**
* Clase que pide al usuario que introduzca un nmero. El nmero esperado
* es un nmero entero.
* @param titulo
* @param mensaje
* @return
*/
public long PedirNumeroLong (String titulo, String mensaje) {
long d = 0;
setOperacionCancelada(false);
boolean NumeroValido = false;
do {
String s = (String) JOptionPane.showInputDialog(null, mensaje,
titulo, JOptionPane.PLAIN_MESSAGE, null, null, "");
if (s != null) {
try {
d = Long.valueOf(s).longValue();
NumeroValido = true;
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "El nmero introducido no es vlido.",
"Error", JOptionPane.ERROR_MESSAGE);
}
}
else { NumeroValido=true; // Cancelado
setOperacionCancelada(true);
}
} while (!NumeroValido);
return d;
}
/**
* Clase que pide al usuario que introduzca un nmero. El nmero esperado

10

DesarrollodeAplicacionesWeb

Tema8

* es un nmero entero corto.


* @param titulo
* @param mensaje
* @return
*/
public short PedirNumeroShort (String titulo, String mensaje) {
short d = 0;
setOperacionCancelada(false);
boolean NumeroValido = false;
do {
String s = (String) JOptionPane.showInputDialog(null, mensaje,
titulo, JOptionPane.PLAIN_MESSAGE, null, null, "");
if (s != null) {
try {
d = Short.valueOf(s).shortValue();
NumeroValido = true;
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "El nmero introducido no es vlido.",
"Error", JOptionPane.ERROR_MESSAGE);
}
}
else { NumeroValido=true; // Cancelado
setOperacionCancelada(true);
}
} while (!NumeroValido);
return d;
}
}

Seguro que ya te vas familiarizando con este embrollo y encontrars interesante todas estas
operaciones. Ahora te planteamos otro reto: imagina que tienes que mostrar el precio de un
productoporpantalla.Generalmente,siunproductovale,porejemplo3,3euros,elpreciosedebe
mostrarcomo"3,30",esdecir,seleaadeunceroextraalfinalparamostrarlascentsimas.Conlo
quesabemoshastaahora,usandolaconcatenacinenJava,podemosconseguirqueunacadenase
concateneaunnmeroflotante,peroelresultadonoserelesperado.
Pruebaelsiguientecdigo:
float precio=3.3f;
System.out.println("El precio es: "+precio+"");

Sihasprobadoelcdigoanterior,habrscomprobadoqueelresultadonomuestra"3,30"sinoque
muestra "3,3 ". Cmo lo solucionamos? Podramos dedicar bastantes lneas de cdigo hasta
conseguir algo que realmente funcione, pero no es necesario, dado que Java y otros lenguajes de
programacin(comoC),disponendeloquesedenominaformateadodecadenas.EnJavapodemos
formatear cadenas a travs del mtodo esttico format disponible en el objeto String . Este
mtodopermitecrearunacadenaproyectandolosargumentosenunformatoespecficodesalida.
Lomejoresverloconunejemplo,veamosculseralasolucinalproblemaplanteadoantes:
float precio=3.3f;
String salida=string.format ("El precio es: %.2f ", precio));
System.out.println(salida);

Elformatodesalida,tambindenominadocadenadeformato,eselprimerargumentodelmtodo
format .Lavariableprecio,situadacomosegundoargumento,eslavariablequeseproyectarenla
salida siguiendo un formato concreto. Seguro que te preguntars, qu es %.2f? Pues es un
especificador de formato, e indica cmo se deben formatear o proyectar los argumentos que hay
despusdelacadenadeformatoenelmtodo format .

Esnecesarioqueconozcasbienelmtodo format ylosespecificadoresdeformato.Poresemotivo,


tepedimosqueleasatentamenteelsiguientedocumento:

Sintaxisdelascadenasdeformatoyusodelmtodoformat.
EnJava,elmtodoestticoformatdelaclase String permiteformatearlosdatosquesemuestranal
usuarioolausuariadelaaplicacin.Elmtodo format tienelossiguientesargumentos:

11

Aplicacindelasestructurasdealmacenamiento

DAW

9 Cadenadeformato.Cadenaqueespecificacmoserelformatodesalida,enellasemezclar
textonormalconespecificadoresdeformato,queindicarncmosedebeformatearlosdatos.
9 Listadeargumentos.Variablesquecontienenlosdatoscuyosdatosseformatearn.Tieneque
habertantosargumentoscomoespecificadoresdeformatohayaenlacadenadeformato.
Losespecificadoresdeformatocomienzansiemprepor"%",esloquesedenominauncarcterde
escape(carcterquesirveparaindicarqueloquehayacontinuacinnoestextonormal,sinoalgo
especial). El especificador de formato debe llevar como mnimo el smbolo "%" y un carcter que
indicalaconversinarealizar,porejemplo" %d ".

Laconversinseindicaconunsimplecarcter,ysealaalmtodo format cmodebeserformateado


elargumento.Dependiendodeltipodedatopodemosusarunasconversionesuotras.Veamoslas
conversionesmsutilizadas:
Listadodeconversionesmsutilizadayejemplos.
Conversin
Formato Tiposdedatos
Ejemplo
Resultado
Boolean(cuandose
booleanb=true;
usanotrostiposde
Stringd=
Valorlgicoo
"%b"o
Resultado:
datossiemprelo
String.format("Resultado:
booleano.
"%B"
true
formatearescribiendo %b",b);
true).
System.out.println(d);
Cualquiera,se
Stringcad="holamundo";
convertirelobjetoa
Stringd=
Cadenade
"%s"o
Resultado:
cadenasiesposible
String.format("Resultado:
caracteres.
"%S"
holamundo
(invocandoelmtodo
%s",cad);
toString).
System.out.println(d);
inti=10;
Stringd=
Enterodecimal "%d"
Untipodedatoentero. String.format("Resultado:
Resultado:10
%d",i);
System.out.println(d);
doublei=10.5;
Nmeroen
Stringd=
"%e"o
Flotantessimpleso
Resultado:
notacin
String.format("Resultado:
"%E"
dobles.
1.050000E+01
cientfica
%E",i);
System.out.println(d);
floati=10.5f;
Stringd=
Nmero
Flotantessimpleso
Resultado:
"%f"
String.format("Resultado:
decimal
dobles.
10,500000
%f",i);
System.out.println(d);
Flotantessimpleso
Nmeroen
doublei=10.5;
dobles.Elnmerose
notacin
Stringd=
"%g"o
mostrarcomodecimal
Resultado:
cientficao
String.format("Resultado:
"%G"
oennotacincientfica
10.5000
decimal(lo
%g",i);
dependiendodeloque
mscorto)
System.out.println(d);
seamascorto.

Ahora que ya hemos visto alguna de las conversiones existentes (las ms importantes), veamos
algunosmodificadoresqueselepuedenaplicaralasconversiones,paraajustarcomoqueremosque
sealasalida.Losmodificadoressesitanentreelcarcterdeescape("%")ylaletraqueindicaeltipo
deconversin(d,f,g,etc.).

12

DesarrollodeAplicacionesWeb

Tema8

Podemosespecificar,porejemplo,elnmerodecaracteresquetendrcomomnimolasalidadeuna
conversin.Sieldatomostradonollegaaeseanchoencaracteres,serellenarconespacios(salvo
queseespecifiquelocontrario):
%[Ancho]Conversin

Elhechodequeestentrecorchetessignificaqueesopcional.Siqueremosporejemploquelasalida
generealmenos5caracteres(poniendoespaciosdelante)podramosponerloas:
String.format ("%5d",10);

Se mostrar el "10" pero tambin se aadirn 3 espacios delante para rellenar. Este tipo de
modificadorsepuedeusarconcualquierconversin.
Cuando se trata de conversiones de tipo numricas con decimales, solo para tipos de datos que
admitandecimales,podemosindicartambinlaprecisin,queserelnmerodedecimalesmnimos
quesemostrarn:
%[Ancho][.Precisin]Conversin

Comopuedesver,tanto elanchocomolaprecisinvanentrecorchetes,loscorchetes nohayque


ponerlos, solo indican que son modificaciones opcionales. Si queremos, por ejemplo, que la salida
genere3decimalescomomnimo,podremosponerloas:
String.format ("%.3f",4.2f);

Como el nmero indicado como parmetro solo tiene un decimal, el resultado se completar con
cerosporladerecha,generandounacadenacomolasiguiente:"4,200".
Una cadena de formato puede contener varios especificadores de formato y varios argumentos.
Veamosunejemplodeunacadenaconvariosespecificadoresdeformato:
String np="Lavadora";
int u=10;
float ppu = 302.4f;
float p=u*ppu;
String output=String.format("Producto: %s; Unidades: %d; Precio por unidad: %.2f ; Total:
%.2f ", np, u, ppu, p);
System.out.println(output);

Cuandoelordendelosargumentosesunpococomplicado,porquesereutilizanvariasvecesenla
cadenadeformatolosmismosargumentos,sepuederecurriralosndicesdeargumento.Setratade
especificar la posicin del argumento a utilizar, indicando la posicin del argumento (el primer
argumentoserael1ynoel0)seguidoporelsmbolodeldlar("$").Elndiceseubicaraalcomienzo
delespecificadordeformato,despusdelporcentaje,porejemplo:
int i=10;
int j=20;
String d=String.format("%1$d multiplicado por %2$d (%1$dx%2$d) es %3$d",i,j,i*j);
System.out.println(d);

El ejemplo anterior mostrara por pantalla la cadena "10 multiplicado por 20 (10x20) es 200". Los
ndices de argumento se pueden usar con todas las conversiones, y es compatible con otros
modificadoresdeformato(incluidalaprecisin).
2.1.3.Operacionesavanzadasconcadenasdecaracteres.(III)
Cmo puedo comprobar si dos cadenas son iguales? Qu ms operaciones ofrece Java sobre las
cadenas?Javaofreceunmontndeoperacionesmssobrecadena.Enlasiguientetablapuedesver
lasoperacionesmsimportantes.Entodoslosejemplosexpuestos,lasvariablescad1,cad2ycad3
soncadenasyaexistentes,ylavariablenumesunnmeroenteromayoroigualacero.
Mtodo.
Descripcin
Permite comparar dos cadenas entre s lexicogrficamente.
Retornar 0 si son iguales, un nmero menor que cero si la
cad1.compareTo(cad2)
cadena(cad1)esanteriorenordenalfabticoalaquesepasa
por argumento (cad2), y un nmero mayor que cero si la
cadenaesposteriorenordenalfabtico.
Cuando se comparan si dos cadenas son iguales, no se debe
cad1.equals(cad2)
usareloperadordecomparacin"==",sinoelmtodo equals .
Retornartruesisoniguales,yfalsesinoloson.

13

Aplicacindelasestructurasdealmacenamiento

cad1.compareToIgnoreCase(cad2)
cad1.equalsIgnoreCase(cad2)

cad1.trim()
cad1.toLowerCase()
cad1.toUpperCase()

cad1.indexOf(cad2)
cad1.indexOf(cad2,num)

cad1.contains(cad2)
cad1.startsWith(cad2)
cad1.endsWith(cad2)

cad1.replace(cad2,cad3)

DAW

El mtodo compareToIgnoreCase funciona igual que el mtodo


compareTo , pero ignora las maysculas y las minsculas a la
hora de hacer la comparacin. Las maysculas van antes en
orden alfabtico que las minsculas, por lo que hay que
tenerloencuenta.Elmtodo equalsIgnoresCase esigualqueel
mtodo equals perosintenerencuentalasminsculas.
Genera una copia de la cadena eliminando los espacios en
blancoanterioresyposterioresdelacadena.
Genera una copia de la cadena con todos los caracteres a
minscula.
Genera una copia de la cadena con todos los caracteres a
maysculas.
Si la cadena o carcter pasado por argumento est contenida
enlacadenainvocante,retornasuposicin,encasocontrario
retornar 1. Opcionalmente se le puede indicar la posicin a
partir de la cual buscar, lo cual es til para buscar varias
aparicionesdeunacadenadentrodeotra.
Retornar true si la cadena pasada por argumento est
contenida dentro de la cadena. En caso contrario retornar
false.
Retornar true si la cadena comienza por la cadena pasada
comoargumento.Encasocontrarioretornarfalse.
Retornartruesilacadenaacabaporlacadenapasadacomo
argumento.Encasocontrarioretornarfalse.
Generar una copia de la cadena cad1, en la que se
reemplazarn todas las apariciones de cad2 por cad3. El
reemplazo se har de izquierda a derecha, por ejemplo:
reemplazar"zzz"por"xx"enlacadena"zzzzz"generar"xxzz"
yno"zzxx".

Cul ser el resultado de ejecutar


cadena "hojalata"?

cad1.replace("l","j").indexOf("ja")

si cad1 contiene la

2
3
4
1

2.1.4.Operacionesavanzadasconcadenasdecaracteres.(IV)
Sabes cul es el principal problema de las cadenas de caracteres? Su alto consumo de memoria.
Cuando realizamos un programa que realiza muchsimas operaciones con cadenas, es necesario
optimizarelusodememoria.
EnJava, String esunobjetoinmutable,locualsignifica,entreotrascosas,quecadavezquecreamos
un String ,ounliteralde String ,secreaunnuevoobjetoquenoesmodificable.Javaproporcionala
clase StringBuilder ,lacualesunmutable(objetos que una vez creados se puedenmodificar sin problemas),y
permiteunamayoroptimizacindelamemoria.Tambinexistelaclase StringBuffer ,peroconsume
mayores recursos al estar pensada para aplicaciones multihilo (aplicaciones que ejecutan varias lneas de
ejecucinsimultneamenteyquenecesitanaccederadatoscompartidos.Cuandovariaslneasdeejecucin,cadaunaasu
ritmo, necesitan acceder a datos compartidos hay que tener mucho cuidado, para que los datos que manejan no sean
incoherentes),porloqueennuestrocasonoscentraremosenlaprimera.

14

DesarrollodeAplicacionesWeb

Tema8

Pero, en qu se diferencian StringBuilder de la clase String ? Pues bsicamente en que la clase


StringBuilder permitemodificarlacadenaquecontiene,mientrasquelaclase String no.Comoya
sedijoantes,alrealizaroperacionescomplejassecreaunanuevainstanciadelaclase String .
Veamos un pequeo ejemplo de uso de esta clase. En el ejemplo que vas a ver, se parte de una
cadena con errores, que modificaremos para ir hacindola legible. Lo primero que tenemos que
hacer es crear la instancia de esta clase. Se puede inicializar de muchas formas, por ejemplo,
partiendodeunliteraldecadena:
StringBuilder strb=new StringBuilder ("Hoal Muuundo");

Yahora,usandolosmtodos append (insertaralfinal), insert (insertarunacadenaocarcterenuna


posicin especfica), delete (eliminar los caracteres que hay entre dos posiciones) y replace
(reemplazar los caracteres que hay entre dos posiciones por otros diferentes), rectificaremos la
cadenaanteriorylaharemoscorrecta:
1. strb.delete(6,8); Eliminamoslas'uu'quesobranenlacadena.Laprimera'u'quesobraesten
laposicin6(noolvidescontarelespacio),ylaltima'u'aeliminarestenlaposicin7.Para
eliminardichoscaracteresdeformacorrectahayquepasarcomoprimerargumentolaposicin6
(posicininicial)ycomosegundoargumentolaposicin8(posicincontiguaalltimocarctera
eliminar),dadoquelaposicinfinalnoindicaelltimocarcteraeliminar,sinoelcarcterjusto
posterioralltimoquehayqueeliminar(igualqueocurraconelmtodo substring ).
2. strb.append ("!"); Aadimosalfinaldelacadenaelsmbolodecierredeexclamacin.
3. strb.insert (0,""); Insertamosenlaposicin0,elsmbolodeaperturadeexclamacin.
4. strb.replace (3,5,"la"); Reemplazamosloscaracteres'al'situadosentrelaposicininicial3y
laposicinfinal4,porlacadena'la'.Enestemtodoocurreigualqueenlosmtodos delete y
substring ,envezdeindicarcomoposicinfinallaposicin4,sedebeindicarjustolaposicin
contigua,esdecir5.
StringBuilder contiene muchos mtodos de la clase String ( charAt , indexOf , lenght , substring ,
replace ,etc.),peronotodos,puessonclasesdiferentesconfuncionalidadesrealmentediferentes.

Enlasiguientepginapuedesencontrarmsinformacin(eningls)sobrecmoutilizarla
claseStringBuilder.
http://download.oracle.com/javase/tutorial/java/data/buffers.html

Rotar una cadena es poner simplemente el primer carcter al final, y retroceder el resto
una posicin. Despus de unas cuantas rotaciones la cadena queda igual. Cul de las
siguientes expresiones servira para hacer una rotacin (rotar solo una posicin)?

stb.delete(0,1);strb.append(stb.charAt(0));
strb.append(strb.charAt(0));strb.delete(0,1);
strb.append(strb.charAt(0));strb.delete(0);
strb.append(strb.charAt(1));strb.delete(1,2);

2.2.Expresionesregulares.(I)
Tienen algo en comn todos los nmeros de DNI y de NIE? Podras hacer un programa que
verificarasiunDNIounNIEescorrecto?Seguroques.Sitefijas,losnmerosdeDNIylosdeNIE
tienen una estructura fija: X1234567Z (en el caso del NIE) y 1234567Z (en el caso del DNI). Ambos
siguenunpatrn(Modeloconelqueencajalainformacinqueestamosanalizandooquesimplementesehautilizado
paraconstruirdichainformacin.Unpatrn,enelcasodelainformtica,estconstituidoporunaseriedereglasfijasque
debencumplirseoserseguidasparaformarlainformacin.Lasdireccionesdecorreoelectrnico,porejemplo,todastienen
lamismaforma,yesoesporquetodassiguenelmismopatrnparaserconstruidas)quepodradescribirsecomo:

unaletrainicialopcional(solopresenteenlosNIE),seguidadeunasecuencianumricayfinalizando
conotraletra.Fcilno?

15

Aplicacindelasestructurasdealmacenamiento

DAW

Puesestaeslafuncindelasexpresionesregulares:permitircomprobarsiunacadenasigueonoun
patrnpreestablecido.Lasexpresionesregularessonunmecanismoparadescribiresospatrones,y
seconstruyendeunaformarelativamentesencilla.Existenmuchaslibrerasdiferentesparatrabajar
con expresiones regulares, y casi todas siguen, ms o menos, una sintaxis similar, con ligeras
variaciones.Dichasintaxisnospermiteindicarelpatrndeformacmoda,comosideunacadenade
textosetratase,enlaquedeterminadossmbolostienenunsignificadoespecial.Porejemplo"[01]+"
es una expresin regular que permite comprobar si una cadena conforma un nmero binario.
Veamosculessonlasreglasgeneralesparaconstruirunaexpresinregular:
9 Podemosindicarqueunacadenacontieneunconjuntodesmbolosfijo,simplementeponiendo
dichos smbolos en el patrn, excepto para algunos smbolos especiales que necesitarn un
carcterdeescapecomoveremosmsadelante.Porejemplo,elpatrn"aaa"admitircadenas
quecontengantresaes.
9 " [xyz] ".Entrecorchetespodemosindicaropcionalidad.Solounodelossmbolosquehayentre
los corchetes podr aparecer en el lugar donde estn los corchetes. Por ejemplo, la expresin
regular " aaa[xy] " admitir como vlidas las cadenas "aaax" y la cadena "aaay". Los corchetes
representanunaposicindelacadenaquepuedetomarunodevariosvaloresposibles.
9 " [a-z] " " [A-Z] " " [a-zA-Z] ". Usando el guin y los corchetes podemos indicar que el patrn
admite cualquier carcter entre la letra inicial y la final. Es importante que sepas que se
diferencia entre letras maysculas y minsculas, no son iguales de cara a las expresiones
regulares.
9 " [0-9] ". Y nuevamente, usando un guin, podemos indicar que se permite la presencia de un
dgito numrico entre 0 y 9, cualquiera de ellos, pero solo uno. Con las reglas anteriores
podemos indicar el conjunto de smbolos que admite el patrn y el orden que deben tener. Si
unacadenanocontienelossmbolosespecificadosenelpatrn,enelmismoorden,entoncesla
cadenanoencajarconelpatrn.Veamosahoracomoindicarrepeticiones:
9 " a? ".Usaremoselinterroganteparaindicarqueunsmbolopuedeaparecerunavezoninguna.
Deestaformalaletra"a"podraparecerunavezosimplementenoaparecer.
9 " a* ".Usaremoselasteriscoparaindicarqueunsmbolopuedeaparecerunavezomuchasveces,
pero tambin ninguna. Cadenas vlidas para esta expresin regular seran "aa", "aaa" o
"aaaaaaaa".
9 " a+ ".Usaremoselsmbolodesumaparaindicarqueotrosmbolodebeapareceralmenosuna
vez,pudiendorepetirsecuantasvecesquiera.
9 " a{1,4} " . Usando las llaves, podemos indicar el nmero mnimo y mximo de veces que un
smbolopodrrepetirse.Elprimernmerodelejemploeselnmero1,yquieredecirquelaletra
"a" debe aparecer al menos una vez. El segundo nmero, 4, indica que como mximo puede
repetirsecuatroveces.
9 " a{2,} ". Tambin es posible indicar solo el nmero mnimo de veces que un carcter debe
aparecer(sindeterminarelmximo),haciendousodelasllaves,indicandoelprimernmeroy
poniendolacoma(nolaolvides).
9 " a{5} ".Adiferenciadelaformaanterior,sisoloescribimosunnmeroentrellaves,sinponerla
comadetrs,significarqueelsmbolodebeaparecerunnmeroexactodeveces.Enestecaso,
la"a"debeaparecerexactamente5veces.
9 " [a-z]{1,4}[0-9]+ ".Losindicadoresderepeticinsepuedenusartambinconcorchetes,dado
queloscorchetesrepresentan,bsicamente,unsmbolo.Enelejemploanteriorsepermitirade
unaacuatroletrasminsculas,seguidasdealmenosundgitonumrico.

Con lo visto hasta ahora ya es posible construir una expresin regular capaz de verificar si una
cadena contiene un DNI o un NIE, seras capaz de averiguar cul es dicha expresin regular?
La expresin regular que permite verificar si una cadena contiene un DNI o un NIE es la siguiente:
"[XYxy]?[0-9]{1,9}[A-Za-z]"; aunque no es la nica solucin.

16

DesarrollodeAplicacionesWeb

Tema8

2.2.1.Expresionesregulares.(II)
Ycmousolasexpresionesregularesenunprograma?Puesdeunaformasencilla.Parasuuso,Java
ofrecelasclases Pattern y Matcher contenidasenelpaquete java.util.regex.* .Laclase Pattern se
utilizaparaprocesarlaexpresinregularycompilarla,locualsignificaverificarqueescorrectay
dejarlalistaparasuutilizacin.Laclase Matcher sirveparacomprobarsiunacadenacualquierasigue
onounpatrn.Veamosloconunejemplo:
Pattern p=Pattern.compile("[01]+");
Matcher m=p.matcher("00001010");
if (m.matches()) System.out.println("Si, contiene el patrn");
else System.out.println("No, no contiene el patrn");

Enelejemplo,elmtodoestticocompiledelaclase Pattern permitecrearunpatrn,dichomtodo


compila la expresin regular pasada por parmetro y genera una instancia de Pattern (p en el
ejemplo).Elpatrnppodrserusadomltiplesvecesparaverificarsiunacadenacoincideonocon
elpatrn,dichacomprobacinsehaceinvocandoelmtodo matcher ,elcualcombinaelpatrncon
lacadenadeentradaygeneraunainstanciadelaclase Matcher (menelejemplo).Laclase Matcher
contieneelresultadodelacomprobacinyofrecevariosmtodosparaanalizarlaformaenlaquela
cadenahaencajadoconunpatrn:
9 m.matches() .Devolvertruesitodalacadena(deprincipioafin)encajaconelpatrnofalseen
casocontrario.
9 m.lookingAt() . Devolver true si el patrn se ha encontrado al principio de la cadena. A
diferenciadelmtodo matches() ,lacadenapodrconteneralfinalcaracteresadicionales alos
indicadosporelpatrn,sinqueellosupongaunproblema.
9 m.find() .Devolvertruesielpatrnexisteenalgnlugarlacadena(nonecesariamentetodala
cadena debe coincidir con el patrn) y false en caso contrario, pudiendo tener ms de una
coincidencia. Para obtener la posicin exacta donde se ha producido la coincidencia con el
patrn podemos usar los mtodos m.start() y m.end() , para saber la posicin inicial y final
donde se ha encontrado. Una segunda invocacin del mtodo find() ir a la segunda
coincidencia (si existe), y as sucesivamente. Podemos reiniciar el mtodo find() , para que
vuelvaacomenzarporlaprimeracoincidencia,invocandoelmtodo m.reset() .

Veamos algunas construcciones adicionales que pueden ayudarnos a especificar expresiones


regularesmscomplejas:
9 "[^abc]" . El smbolo "^", cuando se pone justo detrs del corchete de apertura, significa
negacin. La expresin regular admitir cualquier smbolo diferente a los puestos entre
corchetes.Enestecaso,cualquiersmbolodiferentedea,boc.
9 "^[01]+$" . Cuando el smbolo "^" aparece al comienzo de la expresin regular, permite indicar
comienzo de lnea o de entrada. El smbolo "$" permite indicar fin de lnea o fin de entrada.
Usndolospodemosverificarqueunalneacompleta(deprincipioafin)encajeconlaexpresin
regular,esmuytilcuandosetrabajaenmodomultilnea(cadenasquecontienenensuinteriormsde
un salto de lnea a veces no se procesan bien con las expresiones regulares, dado que estas se limitan a verificar
generalmente solo la primera lnea. El modo multilnea permite buscar lneas completas que encajan con un patrn
dentrodeunacadenaquecontienevariaslneas)yconelmtodo find() .

9
9
9
9
9
9

"." .Elpuntosimbolizacualquiercarcter.
"\\d" .Undgitonumrico.Equivalea" [0-9] ".
"\\D" .Cualquiercosaexceptoundgitonumrico.Equivalea" [^0-9] .
"\\s" .Unespacioenblanco(incluyetabulaciones,saltosdelneayotrasformasdeespacio).
"\\S" .Cualquiercosaexceptounespacioenblanco.
"\\w" .Cualquiercarcterquepodrasencontrarenunapalabra.Equivalea"[azAZ_09]".

17

Aplicacindelasestructurasdealmacenamiento

DAW

En cuales de las siguientes opciones se cumple el patrn "A.\\d+"?


"GA99"siutilizamoselmtodofind

"GAX99"siutilizamoselmtodolookingAt

"AX99"siutilizamoselmtodomatches

"A99"siutilizamoselmtodomatches

2.2.2.Expresionesregulares.(III)
Teresultandifcileslasexpresionesregulares?Alprincipiosiempreloson...peronotepreocupes.
Hasta ahora has visto como las expresiones regulares permiten verificar datos de entrada,
permitiendocomprobarsiundatoindicadosigueelformatoesperado:queunDNItengaelformato
esperado, que un email sea un email y no otra cosa, etc. Pero ahora vamos a dar una vuelta de
tuercaadicional.
Losparntesis,deloscualesnohemoshabladohastaahora,tienenunsignificadoespecial,permiten
indicar repeticiones para un conjunto de smbolos, por ejemplo: "(#[01]){2,3}". En el ejemplo
anterior,laexpresin"#[01]"admitiracadenascomo"#0"o"#1",peroalponerloentreparntesise
indicarloscontadoresderepeticin,loqueestamosdiciendoesquelamismasecuenciasetieneque
repetir entre dos y tres veces, con lo que las cadenas que admitira seran del estilo a: "#0#1" o
"#0#1#0".
Pero los parntesis tienen una funcin adicional, y es la de permitir definir grupos. Un grupo
comienza cuando se abre un parntesis y termina cuando se cierra el parntesis. Los grupos
permitenaccederdeformacmodaalasdiferentespartesdeunacadenacuandoestacoincidecon
unaexpresinregular.Lomejoresverloconunejemplo(seguroqueteresultarfamiliar):
Pattern p=Pattern.compile("([XY]?)([0-9]{1,9})([A-Za-z])");
Matcher m=p.matcher("X123456789Z Y00110011M 999999T");
while (m.find())
{
System.out.println("Letra inicial (opcional):"+m.group(1));
System.out.println("Nmero:"+m.group(2));
System.out.println("Letra NIF:"+m.group(3));
}

Usandolosgrupos,podemosobtenerporseparadoeltextocontenidoencadaunodelosgrupos.En
el ejemplo anterior, en el patrn hay tres grupos: uno para la letra inicial (grupo 1), otro para el
nmerodelDNIoNIE(grupo2),yotroparalaletrafinaloletraNIF(grupo3).Alponerloengrupos,
usando el mtodo group() , podemos extraer la informacin de cada grupo y usarla a nuestra
conveniencia.

Tenencuentaqueelprimergrupoesel1,ynoel0.Sipones m.group(0) obtendrsunacadenacon


todalaocurrenciaocoincidenciadelpatrnenlacadena,esdecir,obtendrslasecuenciaentera
desmbolosquecoincideconelpatrn.

Enelejemploanteriorseusaelmtodo find ,stebuscarunaauna,cadaunadelasocurrenciasdel


patrn en la cadena. Cada vez que se invoca, busca la siguiente ocurrencia del patrn y devolver
truesihaencontradounaocurrencia.Sinoencuentraenunaiteracinningunaocurrenciaesporque
noexistenms,yretornarfalse,saliendodelbucle.Estaconstruccin while esmuytpicaparaeste
tipodemtodosyparalasiteraciones,queveremosmsadelante.
Loltimoimportantedelasexpresionesregularesquedebesconocersonlassecuenciasdeescape.
Cuandoenunaexpresinregularnecesitamosespecificarqueloquetienequehaberenlacadenaes
unparntesis,unallave,ouncorchete,tenemosqueusarunasecuenciadeescape,dadoqueesos
smbolostienenunsignificadoespecialenlospatrones.Paraello,simplementeantepondremos"\\"
alsmbolo.Porejemplo,"\\("significarquedebehaberunparntesisenlacadenayseomitirel
significado especial del parntesis. Lo mismo ocurre con "\\[", "\\]", "\\)", etc. Lo mismo para el

18

DesarrollodeAplicacionesWeb

Tema8

significado especial del punto, ste, tiene un significado especial (Lo recuerdas del apartado
anterior?)salvoqueseponga"\\.",quepasarasignificarunpuntoenvezdecualquiercarcter.
Laexcepcinsonlascomillas,quesepondranconunasolabarra:"\"".

Conloestudiadohastaahora,yapuedesutilizarlasexpresionesregularesysacarlespartido
casiquealmximo.Perolasexpresionesregularessonuncampomuyamplio,porloquees
muyaconsejablequeamplestusconocimientosconelsiguienteenlace:
http://download.oracle.com/javase/tutorial/essential/regex/

19

Aplicacindelasestructurasdealmacenamiento

DAW

3.Creacindearrays.
Caso prctico.
Despus del susto inicial, al recibir el archivo con el formato de pedido, Ana se puso a pensar. Vio
que lo ms adecuado era procesar el archivo de pedido lnea a lnea, viendo con que corresponde
cada lnea a travs de expresiones regulares.
Para identificar si hay un inicio o fin de seccin dentro del pedido, as como el inicio o fin del listado de
artculos, ha decidido usar la siguiente expresin regular:
"^##[]*(FIN){0,1}[]*(PEDIDO|ARTICULOS)[ ]*##$".

Y para identificar cada dato del pedido (nombre, direccin, etc.) va a utilizar la siguiente expresin
regular:
"^(.+):.*\\{(.*)\\}$"

Que al usar grupos le permitir separar el nombre del campo (direccin por ejemplo) de su valor
(direccin concreta). La expresin regular le ha costado mucho trabajo y ha tenido que pedir ayuda,
pero despus, una vez que la ha conseguido, se ha dado cuenta de que ha sido relativamente fcil.
De momento solo est haciendo pruebas, pero le estn saliendo muy bien, mira como lo lleva:
import
import
import
import
import
import
import
import
import

java.io.BufferedReader;
java.io.FileNotFoundException;
java.io.FileReader;
java.io.IOException;
java.util.Scanner;
java.util.logging.Level;
java.util.logging.Logger;
java.util.regex.Matcher;
java.util.regex.Pattern;

/* Clase que se encarga de procesar un pedido.


* El archivo con el pedido debe estar en codificacin UTF8, sino no funciona bien.
* Tu sistema debe soportar de forma nativa la coficacin UTF8, sino no
* funcionar del todo bien.
*/
public class ProcesarArchivo1 {
/* Entrada contendr una instancia de la clase Scanner que permitir
leer las teclas pulsadas desde teclado */
static Scanner entrada = new Scanner(System.in);
/* Definimos las expresiones regulares que usaremos una y otra vez para
cada lnea del pedido. La expresin regular "seccion" permite detectar
si hay un comienzo o fin de pedido, y la expresin campo, permite detectar
si hay un campo con informacin del pedido. */
static Pattern seccion = Pattern.compile("^##[ ]*(FIN)?[ ]*(PEDIDO|ARTICULOS)[ ]*##$");
static Pattern campo = Pattern.compile("^(.+):.*\\{(.*)\\}$");

public static void main(String[] args) {


BufferedReader lector;
/* 1er paso: cargamos el archivo para poder procesarlo lnea a lnea
* para ello nos apoyamos en la clase BufferedReader, que con el mtodo
* readLine nos permite recorrer todo el archivo lnea a lnea.
*/
if (args.length > 0) {
lector = cargarArchivo(args[0]);
} else {
lector = cargarArchivo();
}

if (lector == null) {
/* Si no se ha podido cargar el archivo, no contina con el
* procesado, simplemente termina la ejecucin. */
System.out.println("No se ha podido cargar el archivo.");
} else {
/* Si ha podido cargar el archivo, contina el procesado de lnea
* a lnea. */
String linea;
try {
linea = lector.readLine();
while (linea != null) {
procesarLinea(linea);
linea = lector.readLine();

20

DesarrollodeAplicacionesWeb

Tema8

}
} catch (IOException ex) {
System.out.println("Error de entrada y salida.");
}
}
}
/**
* Procesa una lnea del archivo de pedido para detectar que es y
* extraer la informacin que contiene.
* @param linea
*/
static void procesarLinea(String linea) {
Matcher deteccionSeccion = seccion.matcher(linea);
Matcher deteccionCampo = campo.matcher(linea);
/* Si el patrn coincide con el de un indicador de comienzo del pedido
* o de la seccin con el listado de artculos, se ejecutar este trozo
* de cdigo, pues habr encontrado el patrn.
*/
System.out.println(linea);
if (deteccionSeccion.matches()) {
if (deteccionSeccion.group(1)!=null) {
System.out.println("////
Detectado
deteccionSeccion.group(2));
} else {
System.out.println("////
Detectado
deteccionSeccion.group(2));
}
}

fin

inicio

seccin

seccin

de

de

"

"

/* Si el patrn coincide con el de un campo con informacin, entonces


se ejecutar este trozo de cdigo. */
else if (deteccionCampo.matches()) {
System.out.print("//// Detectado Campo:" + deteccionCampo.group(1));
System.out.println("; con el valor:" + deteccionCampo.group(2));
}
else
{
System.out.println("//// Esto no se que es (todava)");
}
}
/**
* cargarArchivo crear una instancia de la clase BufferedReader que
* permitir leer lnea a lnea el archivo de texto. Si no se ha podido
* cargar el archivo retornar null.
* @param name Nombre del archivo a cargar. si el nombre del archivo no
* se ha pasado por parmetro (valor null) se pedir al usuario que lo
* introduzca.
* @return null si no ha podido cargar el archivo, o la instancia de la
* clase BufferedReader si dicho archivo se ha podido cargar.
*/
static BufferedReader cargarArchivo(String name) {
String nombreArchivo = name;
BufferedReader reader = null;
if (name == null) {
System.out.print("Introduce el nombre del archivo:");
nombreArchivo = entrada.nextLine();
}
try {
FileReader f =new FileReader(nombreArchivo);
reader = new BufferedReader(f);
} catch (FileNotFoundException ex) {
Logger.getLogger(ProcesarArchivo1.class.getName()).log(Level.SEVERE, null, ex);
}
return reader;
}
/**
* Igual que el mtodo BufferedReader cargarArchivo(String name), pero
* que siempre le pedir al usuario que lo introduzca.
* @return null si no ha podido cargar el archivo, y una instancia de BufferedReader
* en otro caso.
*/

21

Aplicacindelasestructurasdealmacenamiento

DAW

static BufferedReader cargarArchivo() {


return cargarArchivo(null);
}
}

Ya tiene parte del trabajo hecho, al programa que ha realizado se le puede pasar el archivo de pedido
en texto plano, con codificacin UTF-8 y ya es capaz de procesarlo casi entero. Pero la parte de
artculos todava no la tiene terminada, bsicamente tiene dudas sobre donde almacenar la
informacin procesada, en especial, la lista de artculos.
Y dnde almacenaras t la lista de artculos del pedido? Una de las soluciones es usar arrays,
puede que sea justo lo que necesita Ana, pero puede que no.

Todosloslenguajesdeprogramacinpermitenelusodearrays,veamoscomosonenJava.
Losarrayspermitenalmacenarunacoleccindeobjetosodatosdelmismotipo.Sonmuytilesy
suutilizacinesmuysimple:
9 Declaracindelarray.Ladeclaracindeunarrayconsisteendecirestoesunarrayysiguela
siguienteestructura:" tipo[] nombre; ".Eltiposeruntipodevariableounaclaseyaexistente,
delacualsequieranalmacenarvariasunidades.
9 Creacindelarray.Lacreacindeunarrayconsisteendecireltamaoquetendrelarray,es
decir, el nmero de elementos que contendr, y se pone de la siguiente forma: nombre=new
tipo[dimension] , donde dimensin es un nmero entero positivo que indicar el tamao del
array.Unavezcreadoelarrayestenopodrcambiardetamao.
Veamosunejemplodesuuso:
int[] n; // Declaracin del array.
n = new int[10]; //Creacin del array reservando para l un espacio en memoria.
int[] m=new int[10]; // Declaracin y creacin en un mismo lugar.

Unavezhechoesto,yapodemosalmacenarvaloresencada
0 1
una de las posiciones del array, usando corchetes e
99 120
indicandoensuinteriorlaposicinenlaquequeremosleer
oescribir,teniendoencuentaquelaprimeraposicinesla
cero y la ltima el tamao del array menos uno. En el
ejemploanterior,laprimeraposicinserala0ylaltimaserala9.

6 7

9 Posicin

33

96

128

90

15

76

int[]n=newint[10];

Cules de las siguientes opciones permitira almacenar ms de 50 nmeros decimales?


int[] numeros; numeros=new int[51];

int[]numeros;numeros=newfloat[52];

double[]numeros;numeros=newdouble[53];
float[]numeros=newfloat[54];

3.1.Usodearraysunidimensionales.
Ya sabes declarar y crear arrays, pero, cmo y cuando se usan? Pues existen tres mbitos
principalmentedondesepuedenusar,ylostressonmuyimportantes:
1. modificacindeunaposicindelarray
2. accesoaunaposicindelarray
3. pasodeparmetros.
La modificacin de una posicin del array se realiza con una simple asignacin. Simplemente se
especifica entre corchetes la posicin a modificar despus del nombre del array. Veamoslo con un
simpleejemplo:
int[] Numeros=new int[3]; // Array de 3 nmeros (posiciones del 0 al 2).
Numeros[0]=99; // Primera posicin del array.
Numeros[1]=120; // Segunda posicin del array.
Numeros[2]=33; // Tercera y ltima posicin del array.

22

DesarrollodeAplicacionesWeb

Tema8

El acceso a un valor ya existente dentro de una posicin del array se consigue de forma similar,
simplementeponiendoelnombredelarrayylaposicinalacualsequiereaccederentrecorchetes:
int suma=Numeros[0] + Numeros[1] + Numeros[2];

Para nuestra comodidad, los arrays, como objetos que son en Java, disponen de una propiedad
pblica muy til. La propiedad length nos permite saber el tamao de cualquier array, lo cual es
especialmentetilenmtodosquetienencomoargumentounarray.
System.out.println("Longitud del array: "+Numeros.length);

El tercer uso principal de los arrays, como se dijo antes, es en el paso de parmetros. Para pasar
comoargumentounarrayaunafuncinomtodo,estadebetenerensudefinicinunparmetro
declaradocomoarray.Estoessimplementequeunodelosparmetrosdelafuncinseaunarray.
Veamosunejemplo:
int sumaarray (int[] j) {
int suma=0;
for (int i=0; i<j.length;i++)
suma=suma+j[i];
return suma;
}

Enelmtodoanteriorsepasacomoargumentounarraynumrico,sobreelcualsecalculalasuma
de todos los nmeros que contiene. Es un uso tpico de los arrays, fijate que especificar que un
argumento es un array es igual que declarar un array, sin la creacin del mismo. Para pasar como
argumentounarrayaunafuncin,simplementeseponeelnombredelarray:
int suma=sumaarray (Numeros);

EnJavalasvariablessepasanporcopiaalosmtodos,estoquieredecirquecuandosepasauna
variable a un mtodo, y se realiza una modificacin de su valor en dicho mtodo, el valor de la
variableenelmtododesdeelqueseharealizadolainvocacinnosemodifica.Perocuidado,eso
no pasa con los arrays. Cuando dicha modificacin se realiza en un array, es decir, se cambia el
valordeunodeloselementosdelarray,siquecambiasuvalordeformadefinitiva.
Veamosunejemploqueilustraambascosas:
public static void main(String[] args) {
int j=0; int[] i=new int(1); i[0]=0;
modificaArray(j,i);
System.out.println(j+"-"+i[0]); /* Mostrar por pantalla "01", puesto que el contenido del
array es modificado en la funcin, y aunque la variable j tambin se modifica, se modifica una
copia de la misma, dejando el original intacto */
}
int modificaArray(int j, int[] i); {
j++; i[0]++; /* Modificacin de los valores de la variable, solo afectar al array, no a j
*/
}

3.2.Inicializacin.
Rellenarunarray,parasuprimerautilizacin,esunatareamuyhabitualquepuedeserrpidamente
simplificada. Vamos a explorar dos sistemas que nos van a permitir inicializar un array de forma
cmodayrpida.
En primer lugar, una forma habitual de crear un array y rellenarlo es simplemente a travs de un
mtodo que lleve a cabo la creacin y el rellenado del array. Esto es sencillo desde que podemos
hacer que un mtodo retorne un array simplemente indicando en la declaracin que el valor
retornadoes tipo[] ,dondetipodedatoprimitivo( int , short , float ,...)ounaclaseexistente( String
porejemplo).Veamosunejemplo:
static int[] ArrayConNumerosConsecutivos (int totalNumeros) {
int[] r=new int[totalNumeros];
for (int i=0;i<totalNumeros;i++) r[i]=i;
return r;
}

Enelejemploanteriorsecreaunarrayconunaseriedenmerosconsecutivos,empezandoporel
cero, sencillo no? Este uso suele ahorrar bastantes lneas de cdigo en tareas repetitivas. Otra
formadeinicializarlosarrays,cuandoelnmerodeelementosesfijoysabidoapriori,esindicando

23

Aplicacindelasestructurasdealmacenamiento

DAW

entre llaves el listado de valores que tiene el array. En el siguiente ejemplo puedes ver la
inicializacindeunarraydetresnmeros,ylainicializacindeunarraycontrescadenasdetexto:
int[] array = {10, 20, 30};
String[]
diassemana=
{"Lunes",
"Domingo"};

"Martes",

"Mircoles",

"Jueves",

"Viernes",

"Sbado",

Perocuidado,lainicializacinsolosepuedeusarenciertoscasos.Lainicializacinanteriorfunciona
cuandosetratadeuntipodedatoprimitivo( int , short , float , double ,etc.)oun String ,yalgunos
pocoscasosms,peronofuncionarparacualquierobjeto.
Cuandosetratadeunarraydeobjetos,lainicializacindelmismoesunpocomsliosa,dadoqueel
valorinicialdeloselementosdelarraydeobjetossernull,oloqueeslomismo,crearunarrayde
objetosnosignificaquesehancreadolasinstanciasdelosobjetos.Hayquecrear,paracadaposicin
delarray,el objetodeltipocorrespondienteconeloperador new .Veamosunejemploconlaclase
StringBuilder .Enelsiguienteejemplosoloaparecernullporpantalla:
StringBuilder[] j=new StringBuilder[10];
for (int i=0; i<j.length;i++) System.out.println("Valor" +i + "="+j[i]); // Imprimir null
para los 10 valores.

Para solucionar este problema podemos optar por lo siguiente, crear para cada posicin del array
unainstanciadelobjeto:
StringBuilder[] j=new StringBuilder[10];
for (int i=0; i<j.length;i++) j[i]=new StringBuilder("cadena "+i);

Paraaccederaunapropiedadoaunmtodocuandoloselementosdelarraysonobjetos,puedes
usarlanotacindepuntodetrsdeloscorchetes,porejemplo:diassemana[0].length.Fijatebien
en el array diassemana anterior y piensa en lo que se mostrara por pantalla con el siguiente
cdigo:
System.out.println(diassemana[0].substring(0,2));

Cul es el valor de la posicin 3 del siguiente array: String[]

24

null
Unacadenavaca
Daraerrorynosepodracompilar

m=new String[10] ?

DesarrollodeAplicacionesWeb

Tema8

4.Arraysmultidimensionales.
Caso prctico.
Ana sigue dndole vueltas a como almacenar los diferentes datos del pedido, y sobre todo, sobre
como procesar los artculos, dado que los artculos del pedido pueden ser ms de uno. Ha pensado
en crear primero una clase para almacenar los datos del pedido, llamada Pedido, donde cada dato
del pedido sea un atributo de la clase. Pero claro, los artculos son ms de uno y no puede saber
cuntos atributos necesitar.
Para almacenar los artculos ha pensado en crear una clase llamada Articulo donde se meteran
todos los datos de cada artculo, y despus en la clase Pedido poner un array de artculos. Pero no lo
tiene claro y ha decidido preguntar a su tutora, Mara.

Questructuradedatosutilizarasparaalmacenarlospxelesdeunaimagendigital?Normalmente
lasimgenessoncuadradasasqueunadelasestructurasmsadecuadaseslamatriz.Enlamatriz
cadavalorpodraserelcolordecadapxel.Pero,quesunamatrizaniveldeprogramacin?Pues
es un array con dos dimensiones, o lo que es lo mismo, un array cuyos elementos son arrays de
nmeros.
Losarraysmultidimensionalesestnentodosloslenguajesdeprogramacinactuales,yobviamente
tambinenJava.LaformadecrearunarraydedosdimensionesenJavaeslasiguiente:
int[][] a2d=new int[4][5];

El cdigo anterior crear un array de dos dimensiones, o lo que es lo mismo, crear un array que
contendr4arraysde5nmeroscadauno.Vemosloconunejemplogrfico:
Posicinenla
1dimensin

0
1

2
3

10

11

12

13

14

15

16

17

18

19

Posicinenla
1dimensin

Posicinenla
2dimensin

Posicinenla
3dimensin

Posicinenla
4dimensin

Aligualqueconlosarraysdeunasoladimensin,losarraysmultidimensionalesdebendeclararsey
crearse. Podremos hacer arrays multidimensionales de todas las dimensiones que queramos y de
cualquiertipo.Enellostodosloselementosdelarrayserndelmismotipo,comoenelcasodelos
arrays de una sola dimensin. La declaracin comenzar especificando el tipo o la clase de los
elementos que forman el array, despus pondremos tantos corchetes como dimensiones tenga el
arrayyporltimoelnombredelarray,porejemplo:
int [][][] arrayde3dim;

La creacin se hace usando el operador new, seguido del tipo y los corchetes, en los cuales se
especificaeltamaodecadadimensin:
arrayde3dim=new int[2][3][4];

Todoesto,comoyahasvistoenunejemploanterior,sepuedeescribirenunanicasentencia.

Completa con los nmeros que faltan


int[][][] k=new int[10][11][12];
3
El array anterior es de
dimensiones, y tiene un total de

1320

nmeros enteros.

25

Aplicacindelasestructurasdealmacenamiento

DAW

4.1.Usodearraysmultidimensionales.
Y en qu se diferencia el uso de un array multidimensional con respecto a uno de una nica
dimensin?Puesenmuypocolaverdad.Continuaremosconelejemplodelapartadoanterior:
int[][] a2d=new int[4][5];

Paraaccederacadaunodeloselementosdelarrayanterior,habrqueindicarsuposicinenlasdos
dimensiones, teniendo en cuenta que los ndices de cada una de las dimensiones empiezan a
numerarseen0yquelaltimaposicineseltamaodeladimensinencuestinmenos1.
Puedesasignarunvaloraunaposicinconcretadentrodelarray,indicandolaposicinencadauna
delasdimensionesentrecorchetes:
a2d[0][0]=3;

Ycomoesdeimaginar,puedesusarunvaloralmacenadoenunaposicindelarraymultidimensional
simplementeponiendoelnombredelarrayylosndicesdelelementoalquedeseasaccederentre
corchetes,paracadaunadelasdimensionesdelarray.Porejemplo:
int suma=a2d[0][0]+a2d[0][1]+a2d[0][2]+a2d[0][3]+a2d[0][4];

Comoimaginars,losarraysmultidimensionalespuedentambinserpasadoscomoparmetrosalos
mtodos,simplementeescribiendoladeclaracindelarrayenlosargumentosdelmtodo,deforma
similaracomoserealizabaparaarraysdeunadimensin.Porejemplo:
static int sumaarray2d(int[][] a2d) {
int suma = 0;
for (int i1 = 0; i1 < a2d.length; i1++)
for (int i2 = 0; i2 < a2d[i1].length; i2++) suma += a2d[i1][i2];
return suma;
}

Delcdigoanterior,fjateespecialmenteenelusodelatributo length (quenospermiteobtenerel


tamao de un array). Aplicado directamente sobre el array nos permite saber el tamao de la
primeradimensin( a2d.length ).
Comolosarraysmultidimensionalessonarraysquetienencomoelementosarrays(exceptoelltimo
nivel que ya ser del tipo concreto almacenado), para saber el tamao de una dimensin superior
tenemosqueponerlosndicesentrecorchetesseguidosde length (a2d[i1].length) .
Para saber al tamao de una segunda dimensin (dentro de una funcin por ejemplo) hay que
hacerlo as y puede resultar un poco engorroso, pero gracias a esto podemos tener arrays
multidimensionalesirregulares.
Unamatrizesunejemplodearraymultidimensionalregular,porqu?
Puesporqueesunarrayquecontienearraysdenmerostodosdelmismotamao.Cuandoestono
es as, es decir, cuando
int [][] m=new int[4][];
los arrays de la segunda
0
1
2
3
dimensin
son
de
m[0]=new int[4];
0
diferente tamao entre
0
1
2
3
s, se puede decir que es
0
1
2
3
4
un
array
m[1]=new int[5];
1
multidimensional
5
6
7
8
9
irregular. En Java se
0
1
2
puede crear un array
m[2]=new int[3];
2
10
11
12
irregular
de
forma
relativamente
fcil,
0
1
2
3
4
m[3]=new int[5];
veamos un ejemplo para
3
15
16
17
18
19
dosdimensiones.

9 Declaramos y creamos el array pero sin especificar la segunda dimensin. Lo que estamos
haciendoenrealidadescrearsimplementeunarrayquecontendrarrays,sindecircomosonde
grandeslosarraysdelasiguientedimensin: int[][] irregular=new int[3][];
9 Despus creamos cada uno de los arrays unidimensionales (del tamao que queramos) y lo
asignamos a la posicin correspondiente del array anterior: irregular[0]=new int[7];
irregular[1]=new int[15]; irregular[2]=new int[9];

26

DesarrollodeAplicacionesWeb

Tema8

Cuandousesarraysirregulares,porseguridad,esconvenientequeverifiquessiemprequeelarray
no sea null en segundas dimensiones, y que la longitud sea la esperada antes de acceder a los
datos:
if (irregular[1]!=null && irregular[1].length>10) {...}

4.2.Inicializacindearraysmultidimensionales.
Enqusediferencialainicializacindearraysunidimensionalesdearraysmultidimensionales?En
muypoco.
Lainicializacindelosarraysmultidimensionalesesigualqueladelosarraysunidimensionales.Para
que una funcin retorne un array multidimensional, se hace igual que en arrays unidimensionales.
Simplemente hay que poner el tipo de dato seguido del nmero de corchetes correspondiente,
segnelnmerodedimensionesdelarray.Esoclaro,hayqueponerloenladefinicindelmtodo:
int[][] inicializarArray (int n, int m){
int[][] ret=new int[n][m];
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
ret[i][j]=n*m;
return ret;
}

Tambin se puede inicializar un array multidimensional usando las llaves, poniendo despus de la
declaracin del array un smbolo de igual, y encerrado entre llaves los diferentes valores del array
separadosporcomas,conlasalvedaddequehayqueponerunasllavesnuevascadavezquehaya
queponerlosdatosdeunanuevadimensin,lomejoresverloconunejemplo:
int[][] a2d={{0,1,2},{3,4,5},{6,7,8},{9,10,11}};
int[][][] a3d={{{0,1},{2,3}},{{0,1},{2,3}}};

Elprimerarrayanteriorseraunarrayde4por3yelsiguienteseraunarrayde2x2x2.Comopuedes
observar esta notacin a partir de 3 dimensiones ya es muy liosa y normalmente no se usa.
Utilizando esta notacin tambin podemos inicializar rpidamente arrays irregulares, simplemente
poniendoseparadosporcomasloselementosquetienecadadimensin:
int[][] i2d={{0,1},{0,1,2},{0,1,2,3},{0,1,2,3,4},{0,1,2,3,4,5}};
int[][][] i3d={ { {0,1},{0,2} } , {{0,1,3}} , {{0,3,4},{0,1,5} } };

EsposiblequeenalgunoslibrosyenInternetserefieranalosarraysusandootraterminologa.A
los arrays unidimensionales es comn llamarlos tambin arreglos o vectores, a los arrays de dos
dimensionesescomnllamarlosdirectamentematrices,yalosarraysdemsdedosdimensiones
esposiblequelosveasescritoscomomatricesmultidimensionales.Seacomosea,lomsnormal
enlajergainformticaesllamarlosarrays,trminoqueprocededelingls.

Dado el siguiente array: int[][][] i3d={{{0,1},{0,2}},


Cul es el valor de la posicin [1][1][2]?

{{0,1,3}},{{0,3,4},{0,1,5}}};

3
4
5
Ningunodelosanteriores

siintentasaccederaellasinverificarloobtendrasunaexcepcintipoArrayIndexOutOfBoundsException(excepcindeindicedearray
fueradeloslmites).

Las matrices tienen asociadas un amplio abanico de operaciones (transposicin, suma,


producto, etc.). En la siguiente pgina tienes ejemplos de cmo realizar algunas de estas
operaciones,usandoporsupuestoarrays:
www.sc.ehu.es/sbweb/fisica/cursoJava/numerico/matrices/matriz/matriz.htm

27

Aplicacindelasestructurasdealmacenamiento

DAW

5.Clasesymtodosgenricos.(I)
Caso prctico.
Mara se acerca a la mesa de Ana, quiere saber cmo lo lleva:
-Qu tal? Cmo vas con la tarea? -pregunta Mara.
-Bien, creo. Mi programita ya sabe procesar el archivo de pedido y he creado un par de clases para
almacenar los datos de forma estructurada para luego hacer el volcado XML, pero no se como
almacenar los artculos del pedido, porque son varios -comenta Ana.
-Pero, cul es el problema? Eso es algo sencillo.
-Pues que tengo que crear un array para guardar los artculos del pedido, y no s como averiguar el
nmero de artculos antes de empezar a procesarlos. Es necesario saber el nmero de artculos para
crear el array del tamao adecuado.
-Pues en vez de utilizar un array, podras utilizar una lista.

Sabes por qu se suele aprender el uso de los genricos? Pues porque se necesita para usar las
listas,aunquerealmentelosgenricossonunaherramientamuypotenteyquenospuedeahorrar
tareasdeprogramacinrepetitivas.
Lasclasesylosmtodosgenricossonunrecursodeprogramacindisponibleenmuchoslenguajes
de programacin. Su objetivo es claro: facilitar la reutilizacin del software, creando mtodos y
clases que puedan trabajar con diferentes tipos de objetos, evitando incomodas y engorrosas
conversionesdetipos.Suinicioseremontaalasplantillas(templates)deC++,ungranavanceenel
mundodeprogramacinsinduda.EnlenguajesdemsaltonivelcomoJavaoC#sehatransformado
en lo que se denomina genricos. Veamos un ejemplo sencillo de como transformar un mtodo
normalengenrico:
Versinnogenrica
Versingenricadelmtodo
public class util {
public static int compararTamano(Object[]
a,Object[] b) {
return a.length-b.length;
}
}

public class util {


public static <T> int compararTamano (T[]
a, T[] b) {
return a.length-b.length;
}
}

Losdosmtodosanteriorestienenunclaroobjetivo:permitircomprobarsiunarrayesmayorque
otro.
Retornarn 0 si ambos arrays son iguales, un nmero mayor de cero si el array a es mayor, y un
nmeromenordecerosielarraybesmayor,perounoesgenricoyelotrono.Laversingenrica
del mdulo incluye la expresin <T>, justo antes del tipo retornado por el mtodo. <T> es la
definicin de una variable o parmetro formal de tipo de la clase o mtodo genrico, al que
podemosllamarsimplementeparmetrodetipooparmetrogenrico.Esteparmetrogenrico(T)
se puede usar a lo largo de todo el mtodo o clase, dependiendo del mbito de definicin, y har
referencia a cualquier clase con la que nuestro algoritmo tenga que trabajar. Como veremos ms
adelante,puedehabermsdeunparmetrogenrico.
Utilizargenricostieneclarasventajas.Parainvocarunmtodogenrico,slohayquerealizaruna
invocacindetipogenrico,olvidndonosdelasconversionesdetipo.Estoconsisteenindicarqu
clasesointerfacesconcretasseutilizarnenlugardecadaparmetrogenrico(<T>),paradespus,
pasndolelosargumentoscorrespondientes,ejecutarelalgoritmo.Cadaclaseointerfazconcreta,la
podemosdenominartipootipobaseysedaporsentadoquelosargumentospasadosalmtodo
genricoserntambindedichotipobase.
Supongamos que el tipo base es Integer , pues para realizar la invocacin del mtodo genrico
anteriorbastaconindicareltipo,entrelossmbolosdemenorquymayorqu( <Integer> ),justo
antesdelnombredelmtodo.
InvocacindelmtodoNOgenrico
Invocacindelmtodogenrico
Integer []a={0,1,2,3,4};
Integer []b={0,1,2,3,4,5};
util.compararTamano ((Object[])a, (Object[])b);

..

28

Integer []a={0,1,2,3,4};
Integer []b={0,1,2,3,4,5};
util.<Integer>compararTamano (a, b);

DesarrollodeApllicacionesW
Web

Tema8
8

5.1.Clasesymtodosgenrico
os.(II)
Creees qu el c
digo es ms legible al utilizar gen
ricos o qu se complicca? La verdaad es que all
principiocuesta,perodespus,elcdigoseentiendemejorquessiseempiezaaainsertarcconversioness
detip
po.
Lasclasesgenriccassonequivalentesalo
osmtodosggenricospeeroaniveldeeclase,perm
mitendefinirr
unpaarmetrodeetipoogenricoquesepodrusar alolargodetodalaclaase,facilitan
ndoascrearr
clasesgenricasq
quesoncapaacesdetrabajarcondife
erentestipossdedatosbaase.Paracre
earunaclasee
odelnombreedelaclase:
genricaseespeccificanlospaarmetrosdeetipoallado
publi
ic class Util<T> {
T t1;
pu
ublic void invertir(T[] array) {
for (int i = 0; i < ar
rray.length / 2; i++) {
t1 = array[i];
array[i] = array[ar
rray.length - i - 1];
array[array.length - i - 1] = t1;
}
}
}

Enelejemploanterior,laclaaseUtilcontieneelmto
odoinvertir cuyafuncin
nesinvertir elordendee
quecrearun
n
losellementosdeecualquierarray,seadelltipoquesea.Parausar esaclasegeenricahayq
objetto o instanciia de dicha clase especificando el tipo base entre los smb
bolos menor que (<) y
y
mayo
orque(>),justodetrsdelnombreedelaclase.Veamosunejemplo:
Integ
ger[] numero
os={0,1,2,3,4,5,6,7,8,9};
Util<
<Integer> u=
= new Util<In
nteger>();
u.inv
vertir(numer
ros);
for (int
(
i=0;i<n
numeros.length;i++) Syst
tem.out.prin
ntln(numeros
s[i]);

Como
o puedes ob
bservar, el uso
u de genricos es sencillo, tanto
o a nivel de clase como
o a nivel dee
mto
odo.
Simplemente, a la hora de crear
c
una instancia de una
u clase geenrica, hay que especifficar el tipo,,
oenladefinicin(Util<in
nteger>u)co
omoenlacre
eacin(newUtil<Integerr>()).
tanto
Los genricos
g
loss vamos a usar
u
ampliam
mente a partir de ahoraa, aplicados a un mont
n de clasess
genricasquetieeneJavayqu
uesondegrranutilidad, porloqueeesconvenien
ntequeapre
endasbienaa
usarunaclasegenrica.

Losp
parmetrosd
detipodelasclasesgen
ricassolop
puedensercclases,nopuedenserjam
mstiposde
e
datoss primitivos como int, short, doub
ble, etc. En su lugar, de
ebemos usaar sus clasess envoltorio
o
Integger,Short,Do
ouble,etc.

Todavahayunm
montndeco
osasmssob
brelosmtodosylasclassesgenricasquedeberassaber.En
n
nalgunosusosinteresantesdelosgeenricos:
lasiguientetablasemuestran

29

Aplicacind
delasestructturasdealm
macenamientto

DAW

30

DesarrollodeAplicacionesWeb

Tema8

Dada la siguiente clase, donde el cdigo del mtodo prueba carece de importancia,
podras decir cul de las siguientes invocaciones es la correcta?
public class Util {
public static <T> int prueba (T t) { }
};

Util.<int>prueba(4);
Util.<Integer>prueba(newInteger(4));
Utilu=newUtil();u.<int>prueba(4);

31

Aplicacindelasestructurasdealmacenamiento

DAW

6.Introduccinalascolecciones.(I)
Caso prctico.
A Ana las listas siempre se le han atragantado, por eso no las usa. Despus de darle muchas
vueltas, ha pensado que no le queda ms remedio y que tendr que usarlas para almacenar los
artculos del pedido. Adems, ha concluido que es la mejor forma de gestionar un grupo de objetos,
aunque sean del mismo tipo.
No sabe si lo ms adecuado es usar una lista u otro tipo de coleccin, as que ha decido revisar todos
los tipos de colecciones disponibles en Java, para ver cul se adecua mejor a sus necesidades.

Qu consideras una coleccin? Pues seguramente al pensar en el trmino se te viene a la cabeza


unacoleccindelibrosoalgoparecido,ylaideanovamuydesencaminada.Unacoleccinanivelde
softwareesungrupodeelementosalmacenadosdeformaconjuntaenunamismaestructura.Eso
sonlascolecciones.
Las colecciones definen un conjunto de interfaces, clases genricas y algoritmos que permiten
manejargruposdeobjetos,todoelloenfocadoapotenciarlareusabilidaddelsoftwareyfacilitarlas
tareas de programacin. Te parecer increble el tiempo que se ahorra empleando colecciones y
cmo se reduce la complejidad del software usndolas adecuadamente. Las colecciones permiten
almacenar y manipular grupos de objetos que, a priori, estn relacionados entre s (aunque no es
obligatorioqueestnrelacionados,lolgicoesquesisealmacenanjuntosesporquetienenalguna
relacin entre s), pudiendo trabajar con cualquier tipo de objeto (de ah que se empleen los
genricosenlascolecciones).
Adems las colecciones permiten realizar algunas operaciones tiles sobre los elementos
almacenados, tales como bsqueda u ordenacin. En algunos casos es necesario que los objetos
almacenadoscumplanalgunascondiciones(queimplementenalgunasinterfaces),parapoderhacer
usodeestosalgoritmos.
Las colecciones son en general elementos de programacin que estn disponibles en muchos
lenguajes de programacin. En algunos lenguajes de programacin su uso es algo ms complejo
(comoeselcasodeC++),peroenJavasuusoesbastantesencillo,esalgoquedescubrirsalolargo
deloquequedadetema.
LascoleccionesenJavapartendeunaseriedeinterfacesbsicas.Cadainterfazdefineunmodelode
coleccinylasoperacionesquesepuedenllevaracabosobrelosdatosalmacenados,porloquees
necesarioconocerlas.Lainterfazinicial,atravsdelacualsehanconstruidoelrestodecolecciones,
es la interfaz java.util.Collection, que define las operaciones comunes a todas las colecciones
derivadas.Acontinuacinsemuestranlasoperacionesmsimportantesdefinidasporestainterfaz,
tenencuentaque Collection esunainterfazgenricadonde <E> eselparmetrodetipo(podra
sercualquierclase):
9 Mtodo int size() :retornaelnmerodeelementosdelacoleccin.
9 Mtodo boolean isEmpty() :retornarverdaderosilacoleccinestvaca.
9 Mtodo boolean contains (Object element) : retornar verdadero si la coleccin tiene el
elementopasadocomoparmetro.
9 Mtodo boolean add(E element) :permitiraadirelementosalacoleccin.
9 Mtodo boolean remove (Object element) :permitireliminarelementosdelacoleccin.
9 Mtodo Iterator<E> iterator() : permitir crear un iterador para recorrer los elementos de la
coleccin.Estosevemsadelante,notepreocupes.
9 Mtodo Object[] toArray() :permitepasarlacoleccinaunarraydeobjetostipoObject.
9 Mtodo containsAll(Collection<?> c) : permite comprobar si una coleccin contiene los
elementosexistentesenotracoleccin,siesas,retornaverdadero.
9 Mtodo addAll (Collection<? extends E> c) : permite aadir todos los elementos de una
coleccinaotracoleccin,siemprequeseandelmismotipo(oderivendelmismotipobase).
9 Mtodo boolean removeAll(Collection<?> c) : si los elementos de la coleccin pasada como
parmetroestnennuestracoleccin,seeliminan,elrestosequedan.
9 Mtodo boolean retainAll(Collection<?> c) : si los elementos de la coleccin pasada como
parmetroestnennuestracoleccin,sedejan,elrestoseeliminan.

32

DesarrollodeAplicacionesWeb

Tema8

9 Mtodo void clear() :vacarlacoleccin.


Ms adelante veremos cmo se usan estos mtodos, ser cuando veamos las implementaciones
(clasesgenricasqueimplementanalgunadelasinterfacesderivadasdelainterfaz Collection ).

33

Aplicacindelasestructurasdealmacenamiento

DAW

7.Conjuntos.(I)
Caso prctico.
Ana se toma un descanso, se levanta y en el pasillo se encuentra con Juan, con el que entabla una
conversacin bastante amena. Una cosa lleva a otra y al final, Ana saca el tema que ms le
preocupa:
-Cuntos tipos de colecciones hay? T te los sabes? -pregunta Ana.
-Yo? Qu va! Normalmente consulto la documentacin cuando los voy a usar, como todo el mundo.
Lo que s creo recordar es que haba cuatro tipos bsicos: los conjuntos, las listas, las colas y alguno
ms que no recuerdo. Ah s, los mapas, aunque creo que no se consideraban un tipo de coleccin.
Por qu lo preguntas?
-Pues porque tengo que usar uno y no s cul.

Conqurelacionaraslosconjuntos?Seguro
que con las matemticas. Los conjuntos son
Funcin
un tipo de coleccin que no admite
Zorro
DFCD3454
Hash
duplicados, derivados del concepto
matemticodeconjunto.
Elzorrorojo
Funcin
La interfaz java.util.Set define cmo deben
correatravs
52ED879E
Hash
ser los conjuntos, y extiende la interfaz
delhielo
Collection , aunque no aade ninguna
operacin nueva. Las implementaciones
Elzorrorojo
(clasesgenricasqueimplementanlainterfaz
Funcin
46042841
caminaa
Hash
Set )msusadassonlassiguientes:
travsdelhielo

9 java.util.HashSet .
Conjunto
que
almacenalosobjetosusandotablas hash (estructura de datos formada bsicamente por un array donde la

Entrada

Valor Hash

posicin de los datos va determinada por una funcin hash, permitiendo localizar la informacin de forma
extraordinariamenterpida.Losdatosestnordenadosenlatablaenbaseaunresumennumricodelosmismos(en
hexadecimal generalmente) obtenido a partir de un algoritmo para clculo de resmenes, denominadas funciones
hash. El resumen no tiene significado para un ser humano, se trata simplemente de un mecanismo para obtener un
nmeroasociadoaunconjuntodedatos.Elinconvenientedeestastablasesquelosdatosseordenanporelresumen
obtenido, y no por el valor almacenado. El resumen, de un buen algoritmo hash, no se parece en nada al contenido
almacenado)locualaceleraenormementeelaccesoalosobjetosalmacenados.

Inconvenientes:necesitanbastantememoriaynoalmacenanlosobjetosdeformaordenada(al
contrariopuedenaparecercompletamentedesordenados).
9 java.util.LinkedHashSet . Conjunto que almacena objetos combinando tablas hash , para un
acceso rpido a los datos, y listas enlazadas (estructura de datos que almacena los objetos enlazndolos
entresatravsdeunapuntadordememoriaopuntero,manteniendounorden,quegeneralmenteeseldemomento
de insercin, pero que puede ser otro. Cada dato se almacena en una estructura llamada nodo en la que existe un
campo, generalmente llamado siguiente, que contiene la direccin de memoria del siguiente nodo (con el siguiente
dato)) para conservar el orden. El orden de almacenamiento es el de insercin, por lo que se

puededecirqueesunaestructuraordenadaamedias.
Inconvenientes:necesitanbastantememoriayesalgomslentaque HashSet .
9 java.util.TreeSet .Conjuntoquealmacenalosobjetosusandounasestructurasconocidascomo
rbolesrojonegro.Sonmslentasquelosdostiposanteriores.perotienenunagranventaja:los
datos almacenados se ordenan por valor. Es decir, que aunque se inserten los elementos de
formadesordenada,internamenteseordenandependiendodelvalordecadauno.
Poco a poco, iremos viendo que son las listas enlazadas y los rboles (no profundizaremos en los
rbolesrojonegro,perosiveremoslasestructurastiporbolengeneral).Veamosunejemplodeuso
bsicodelaestructura HashSet ydespus,profundizaremosenlos LinkedHashSet ylos TreeSet .
Para crear un conjunto, simplemente creamos el HashSet indicando el tipo de objeto que va a
almacenar,dadoqueesunaclasegenricaquepuedetrabajarconcualquiertipodedatodebemos
crearlocomosigue(noolvideshacerlaimportacinde java.util.HashSet primero):
HashSet<Integer> conjunto=new HashSet<Integer>();

34

DesarrollodeAplicacionesWeb

Tema8

Despuspodremosiralmacenandoobjetosdentrodelconjuntousandoelmtodo add (definidopor


la interfaz Set ). Los objetos que se pueden insertar sern siempre del tipo especificado al crear el
conjunto:
Integer n=new Integer(10);
if (!conjunto.add(n)) System.out.println("Nmero ya en la lista.");

Si el elemento ya est en el conjunto, el mtodo add retornar false indicando que no se pueden
insertarduplicados.Sitodovabien,retornartrue.

Cul de las siguientes estructuras ordena automticamente los elementos segn su


valor?

HashSet
LinkedHashSet
TreeSet

7.1.Conjuntos.(II).
Yahoratepreguntars,cmoaccedoaloselementosalmacenadosenunconjunto?Paraobtener
los elementos almacenados en un conjunto hay que usar iteradores, que permiten obtener los
elementos del conjunto uno a uno de forma secuencial (no hay otra forma de acceder a los
elementos de un conjunto, es su inconveniente). Los iteradores se ven en mayor profundidad ms
adelante,demomento,vamosausariteradoresdeformatransparente,atravsdeunaestructura
for especial, denominada bucle for-each o bucle para cada. En el siguiente cdigo se usa un
bucleforeach,enllavariableivatomandotodoslosvaloresalmacenadosenelconjuntohastaque
llegaalltimo:
for (Integer i: conjunto) {
System.out.println("Elemento almacenado:"+i);
}

Comoveslaestructura for-each esmuysencilla:lapalabra for seguidade(tipovariable:coleccin)


yelcuerpodelbucle;tipoeseltipodelobjetosobreelquesehacreadolacoleccin,variablepues
eslavariabledondesealmacenarcadaelementodelacoleccinycoleccinpueslacoleccinens.
Losbucles for-each sepuedenusarparatodaslascolecciones.
Ejercicioresuelto
Realiza un pequeo programita que pregunte al usuario 5 nmeros diferentes (almacenndolos en
unHashSet),yquedespuscalculelasumadelosmismos(usandounbucleforeach).
Respuesta
Unasolucinposiblepodraserlasiguiente.Parapreguntaralusuariounnmeroyparamostrarlela
informacin sehausadolaclaseJOptionPane,peropodrashaberutilizadocualquierotrosistema.
Fijate en la solucin y vers que el uso de conjuntos ha simplificado enormemente el ejercicio,
permitiendoalprogramadorolaprogramadoracentrarseenotrosaspectos:
import java.util.HashSet;
import javax.swing.JOptionPane;
public class ejemplo {
public static void main(String[] args)
{
HashSet<Integer> conjunto=new HashSet<Integer>();
String str;
do {
str=JOptionPane.showInputDialog("Introduce un nmero "+(conjunto.size()+1)+":");
try {
Integer n= Integer.parseInt(str);
if (!conjunto.add(n))
JOptionPane.showMessageDialog(null, "Nmero ya en la lista. Debes introducir
otro.");
}
catch (NumberFormatException e)
{ JOptionPane.showMessageDialog(null,"Nmero errneo."); }

35

Aplicacindelasestructurasdealmacenamiento

DAW

} while (conjunto.size()<5);
// Calcular la suma
Integer suma=new Integer(0);
for (Integer i: conjunto) {
suma=suma+i;
}
JOptionPane.showMessageDialog(null,"La suma es:"+suma);
}
}

7.2.Conjuntos.(III).

36

dch

izq

dch

izq

dch
dch

dch

izq
izq

izq

Enqusediferencianlasestructuras LinkedHashSet y
publicclassNodo{
TreeSet de la estructura HashSet ? Ya se comento
publicNodosig;
antes, y es bsicamente en su funcionamiento
publicObjectv;
interno.
}
La estructura LinkedHashSet es una estructura que
internamente funciona como una lista enlazada,
sig
sig
sig
null
aunque usa tambin tablas hash para poder acceder
Nodo1
Nodo2
Nodo3
rpidamente a los elementos. Una lista enlazada es
unaestructurasimilaralarepresentadaenlaimagen
de la derecha, la cual est compuesta por nodos (elementos que forman la lista) que van
enlazndose entre s. Un nodo contiene dos cosas: el dato u objeto almacenado en la lista y el
siguientenododelalista.Sinohaysiguientenodo,seindicaponiendonulo(null)enlavariableque
contieneelsiguientenodo.
Laslistasenlazadastienenunmontndeoperacionesasociadasenlasquenovamosaprofundizar:
eliminacindeunnododelalista,insercindeunnodoalfinal,alprincipiooentredosnodos,etc.
Graciasalascoleccionespodremosutilizarlistasenlazadassintenerquecomplicarnosendetallesde
programacin.
Laestructura TreeSet ,encambio,utilizainternamenterboles.Losrbolessoncomolaslistaspero
mucho ms complejos. En vez de tener un nico elemento siguiente, pueden tener dos o ms
elementossiguientes,formandoestructurasorganizadasyjerrquicas.
Losnodossediferencianendostipos:nodospadreynodoshijo;unnodopadrepuedetenervarios
nodoshijoasociados(dependedeltipoderbol),dandolugaraunaestructuraquepareceunrbol
invertido(deahsunombre).
En la figura de la derecha se puede
Nodo
publicclassNodo
apreciar un rbol donde cada nodo Nivel0
{
puede tener dos hijos, denominados
publicNodoizq;
izquierdo (izq) y derecho (dch). Puesto
publicNododch;
Nodo
Nodo
que un nodo hijo puede tambin ser
publicObjectv;
padre a su vez, los rboles se suelen Nivel1
}
visualizar para su estudio por niveles
para entenderlos mejor, donde cada
Nodo
Nodo
nivelcontienehijosdelosnodosdelnivel Nivel2
null
null
anterior,exceptoelprimernivel(queno
tienepadre).
Losrbolessonestructurascomplejasde
null
null
null
null
manejar y que permiten operaciones
muy sofisticadas. Los rboles usados en los TreeSet , los rboles rojonegro, son rboles auto
ordenados,esdecir,quealinsertarunelemento,estequedaordenadoporsuvalordeformaqueal
recorrerelrbol,pasandoportodoslosnodos,loselementossalenordenados.Elejemplomostrado
enlaimagenessimplementeunrbolbinario,elmssimpledetodos.
Nuevamente,nosevaaprofundizarenlasoperacionesquesepuedenrealizarenunrbolanivel
interno(insercindenodos,eliminacindenodos,bsquedadeunvalor,etc.).Nosaprovecharemos

DesarrollodeAplicacionesWeb

Tema8

delascoleccionesparahacerusodesupotencial.Enlasiguientetablatienesunusocomparadode
TreeSet y LinkedHashSet . Su creacin es similar a como se hace con HashSet , simplemente
sustituyendo el nombre de la clase HashSet por una de las otras. Ni TreeSet , ni LinkedHashSet
admitenduplicados,yseusanlosmismosmtodosyavistosantes,losexistentesenlainterfaz Set
(queeslainterfazqueimplementan).

ConjuntoTreeSet
ConjuntoLinkedHashSet
TreeSet<Integer>t;
LinkedHashSet<Integer>t;
t=newTreeSet<Integer>();
t=newLinkedHashSet<Integer>();
t.add(newInteger(4));
t.add(newInteger(4));
Ejemplode t.add(newInteger(3));
t.add(newInteger(3));
uso
t.add(newInteger(1));
t.add(newInteger(1));
t.add(newInteger(99));
t.add(newInteger(99));
for(Integeri:t)System.out.println(i);
for(Integeri:t)System.out.println(i);
Resultado
mostrado
porpantalla

13499
(elresultadosaleordenadoporvalor)

43199
(losvaloressalenordenadossegnel
momentodeinsercinenelconjunto)

Un rbol cuyos nodos solo pueden tener un nico nodo hijo, en realidad es una lista.

Verdadero
Falso

7.3.Conjuntos.(IV)
Cmopodracopiarloselementosdeunconjuntodeunoaotro?Hay
que usar un bucle for y recorrer toda la lista para ello? Qu va! Para
facilitarestatarea,losconjuntos,ylascoleccionesengeneral,facilitanun
montn de operaciones para poder combinar los datos de varias
colecciones. Ya se vieron en un apartado anterior, aqu simplemente
vamosponerunejemplodesuuso.
Partimos del siguiente ejemplo, en el que hay dos colecciones de
diferentetipo,cadaunacon4nmerosenteros:
TreeSet<Integer> A= new TreeSet<Integer>();
A.add(9); A.add(19); A.add(5); A.add(7); // Elementos del conjunto A: 9, 19, 5 y 7
LinkedHashSet<Integer> B= new LinkedHashSet<Integer>();
B.add(10); B.add(20); B.add(5); B.add(7); // Elementos del conjunto B: 10, 20, 5 y 7

En el ejemplo anterior, el literal de nmero se convierte automticamente a la clase envoltorio


Integer sin tener que hacer nada, lo cual es una ventaja. Veamos las formas de combinar ambas
colecciones:

Combinacin.
Cdigo.
ElementosfinalesdelconjuntoA.
TodoslosdelconjuntoA,
Unin. Aadir todos los
aadiendolosdelB,pero
elementosdelconjuntoBenel A.addAll(B)
sin repetir los que ya
conjuntoA.
estn:5,7,9,10,19y20.
Todos los elementos del
Diferencia.
Eliminar
los
conjuntoA,quenoestn
elementos del conjunto B que A.removeAll(B)
enelconjuntoB:9,19.
puedanestarenelconjuntoA.
Todos los elementos del
Interseccin. Retiene los
conjuntoA, que tambin
elementos comunes a ambos A.retainAll(B)
estnenelconjuntoB:5
conjuntos.
y7.

37

Aplicacindelasestructurasdealmacenamiento

DAW

Recuerda,estasoperacionessoncomunesatodaslascolecciones.

Puede que no recuerdes cmo era eso de los conjuntos, y dada la ntima relacin de las
colecciones con el lgebra de conjuntos, es recomendable que repases cmo era aquello,
conelsiguienteartculodelaWikipedia.
http://es.wikipedia.org/wiki/%C3%81lgebra_de_conjuntos

Tienes un HashSet llamado vocales que contiene los elementos a, e, i, o, u, y


otro, llamado vocales_fuertes con los elementos a, e y o. De qu forma
podramos sacar una lista con las denominadas vocales dbiles (que son aquellas que no
son fuertes)?

vocales.retainAll(vocales_fuertes);
vocales.removeAll(vocales_fuertes);
NoesposiblehacerestoconHashSet,solosepuedehacerconTreeSetoLinkedHashSet.

7.4.Conjuntos.(V)
Por defecto, los TreeSet ordenan sus elementos de forma ascendente, pero, se podra cambiar el
ordendeordenacin?Los TreeSet tienenunconjuntodeoperacionesadicionales,ademsdelasque
incluyeporelhechodeserunconjunto,quepermiteentreotrascosas,cambiarlaformadeordenar
loselementos.Estoesespecialmentetilcuandoeltipodeobjetoquesealmacenanoesunsimple
nmero,sinoalgomscomplejo(unartculoporejemplo). TreeSet escapazdeordenartiposbsicos
(nmeros,cadenasyfechas)perootrotipodeobjetosnopuedeordenarloscontantafacilidad.
Para indicar a un TreeSet cmo tiene que ordenar los elementos, debemos decirle cundo un
elementovaantesodespusqueotro,ycundosoniguales.Paraello,utilizamoslainterfazgenrica
java.util.Comparator ,usadaengeneralenalgoritmosdeordenacin,comoveremosmsadelante.
Setratadecrearunaclasequeimplementedichainterfaz,asdefcil.Dichainterfazrequieredeun
nicomtodoquedebecalcularsiunobjetopasadoporparmetroesmayor,menoroigualqueotro
del mismo tipo. Veamos un ejemplo general de cmo implementar un comparador para una
hipotticaclaseObjeto:
class ComparadorDeObjetos implements Comparator<Objeto> {
public int compare(Objeto o1, Objeto o2) { ... }
}

Lainterfaz Comparator obligaaimplementarunnicomtodo,eselmtodo compare ,elcualtienedos


parmetros:losdoselementosacomparar.Lasreglassonsencillas,alahoradepersonalizardicho
mtodo:
9 Sielprimerobjeto(o1)esmenorqueelsegundo(o2),deberetornarunnmeroenteronegativo.
9 Sielprimerobjeto(o1)esmayorqueelsegundo(o2),deberetornarunnmeroenteropositivo.
9 Siambossoniguales,deberetornar0.
A veces, cuando el orden que deben tener los elementos es diferente al orden real (por ejemplo
cuandoordenamoslosnmerosenordeninverso),ladefinicindeantespuedeserunpocoliosa,as
queesrecomendableentalescasospensardelasiguienteforma:
9 Sielprimerobjeto(o1)debeirantesqueelsegundoobjeto(o2),retornarenteronegativo.
9 Sielprimerobjeto(o1)debeirdespusqueelsegundoobjeto(o2),retornarenteropositivo.
9 Siambossoniguales,deberetornar0.
Unavezcreadoelcomparadorsimplementetenemosquepasarlocomoparmetroenelmomento
delacreacinal TreeSet ,ylosdatosinternamentemantendrndichaordenacin:
TreeSet<Objeto> ts=new TreeSet<Objeto>(new ComparadorDeObjetos());

Ejercicioresuelto
ImagnatequeObjetoesunaclasecomolasiguiente:
class Objeto {

38

DesarrollodeAplicacionesWeb

Tema8

public int a;
public int b;
}

Imaginaqueahora,alaadirlosenunTreeSet,estossetienenqueordenardeformaquelasumade
susatributos(ayb)seadescendente,comoseraelcomparador?
Respuesta
Unadelasposiblessolucionesaesteproblemapodraserlasiguiente:
class ComparadorDeObjetos implements Comparador<Objeto> {
@Override
public int compare(Objeto o1, Objeto o2) {
int sumao1=o1.a+o1.b; int sumao2=o2.a+o2.b;
if (sumao1<sumao2) return 1;
else if (sumao1>sumao2) return -1;
else return 0;
}
}

39

Aplicacindelasestructurasdealmacenamiento

DAW

8.Listas.(I)
Caso prctico.
Juan se queda pensando despus de que Ana le preguntara si saba los tipos de colecciones que
haba en Java. Obviamente no lo saba, son muchos tipos, pero ya tena una respuesta preparada:
-Bueno, sea lo que sea, siempre puedes utilizar una lista para almacenar lo que sea. Yo siempre las
uso, pues te permiten almacenar cualquier tipo de objeto, extraer uno de las lista sin tener que
recorrerla entera, buscar si hay o no un elemento en ella, de forma cmoda. Son para m el mejor
invento desde la rueda -dijo Juan.
-Ya, supongo, pero hay dos tipos de listas que me interesan, LinkedList y ArrayList, cul es mejor?
Cul me conviene ms? -respondi Ana.

Enqusediferenciaunalistadeunconjunto?Laslistassonelementosdeprogramacinunpoco
ms avanzados que los conjuntos. Su ventaja es que amplan el conjunto de operaciones de las
coleccionesaadiendooperacionesextra,veamosalgunasdeellas:
9 Las listas si pueden almacenar duplicados, si no queremos duplicados, hay que verificar
manualmentequeelelementonoestenlalistaantesdesuinsercin.
9 Accesoposicional.Podemosaccederaunelementoindicandosuposicinenlalista.
9 Bsqueda.Esposiblebuscarelementosenlalistayobtenersuposicin.Enlosconjuntos,alser
colecciones sin aportar nada nuevo, solo se poda comprobar si un conjunto contena o no un
elementodelalista,retornandoverdaderoofalso.Laslistasmejoranesteaspecto.
9 Extraccin de sublistas. Es posible obtener una lista que contenga solo una parte de los
elementosdeformamuysencilla.
EnJava,paralaslistassedisponedeunainterfazllamada java.util.List ,ydosimplementaciones
( java.util.LinkedList y java.util.ArrayList ),condiferenciassignificativasentreellas.Losmtodos
de la interfaz List , que obviamente estarn en todas las implementaciones, y que permiten las
operacionesanterioresson:
9 E get(int index) .Elmtodo get permiteobtenerunelementopartiendodesuposicin(index).
9 E set(int index, E element) .Elmtodo set permitecambiarelelementoalmacenadoenuna
posicindelalista(index),porotro(element).
9 void add(int index, E element) . Se aade otra versin del mtodo add, en la cual se puede
insertar un elemento (element) en la lista en una posicin concreta (index), desplazando los
existentes.
9 E remove(int index) .Seaadeotraversindelmtodoremove,estaversinpermiteeliminar
unelementoindicandosuposicinenlalista.
9 boolean addAll(int index, Collection<? extends E> c) . Se aade otra versin del mtodo
addAll , que permite insertar una coleccin pasada por parmetro en una posicin de la lista,
desplazandoelrestodeelementos.
9 int indexOf(Object o) .Elmtodo indexOf permiteconocerlaposicin(ndice)deunelemento,
sidichoelementonoestenlalistaretornar1.
9 int lastIndexOf(Object o) .Elmtodo lastIndexOf nospermiteobtenerlaltimaocurrenciadel
objetoenlalista(dadoquelalistasipuedealmacenarduplicados).
9 List<E> subList(int from, int to) .Elmtodo subList generaunasublista(unavistaparcialde
lalista)conloselementoscomprendidosentrelaposicininicial(incluida)ylaposicinfinal(no
incluida).
Tenencuentaqueloselementosdeunalistaempiezananumerarsepor0.Esdecir,queelprimer
elementodelalistaesel0.TenencuentatambinqueListesunainterfazgenrica,porloque<E>
correspondeconeltipobaseusadocomoparmetrogenricoalcrearlalista.

Si M es una lista de nmeros enteros, sera correcto poner M.add(M.size(),3);?

S
No

InsertaunelementoalfinaldelalistayesequivalenteaponerM.add(3).

40

DesarrollodeAplicacionesWeb

Tema8

8.1.Listas.(II)
Y, cmo se usan las listas? Pues para usar una lista haremos uso de sus implementaciones
LinkedList y ArrayList . Veamos un ejemplo de su uso y despus obtendrs respuesta a esta
pregunta.
Supongo que intuirs como se usan, pero nunca viene mal un ejemplo sencillo, que nos aclare las
ideas.Elsiguienteejemplomuestracomousarun LinkedList perovaldratambinpara ArrayList
(noolvidesimportarlasclases java.util.LinkedList y java.util.ArrayList segnseanecesario).En
esteejemploseusanlosmtodosdeaccesoposicionalalalista:
LinkedList<Integer> t=new LinkedList<Integer>(); // Declaracin y creacin del LinkedList de
enteros.
t.add(1); // Aade un elemento al final de la lista.
t.add(3); // Aade otro elemento al final de la lista.
t.add(1,2); // Aade en la posicin 1 el elemento 2.
t.add(t.get(1)+t.get(2)); // Suma los valores contenidos en la posicin 1 y 2, y lo agrega al
final.
t.remove(0); // Elimina el primer elementos de la lista.
for (Integer i: t) System.out.println("Elemento:" + i); // Muestra la lista.

Enelejemploanterior,serealizanmuchasoperaciones,culserel contenidodelalistaalfinal?
Puesser2,3y5.Enelejemplocabedestacarelusodelbucle for-each ,recuerdaquesepuedeusar
encualquiercoleccin.
Veamos otro ejemplo, esta vez con ArrayList , de cmo obtener la posicin de un elemento en la
lista:
ArrayList<Integer> al=new ArrayList<Integer>(); // Declaracin y creacin del ArrayList de
enteros.
al.add(10); al.add(11); // Aadimos dos elementos a la lista.
al.set(al.indexOf(11), 12); // Sustituimos el 11 por el 12, primero lo buscamos y luego lo
reemplazamos.

Enelejemploanterior,seempleatantoelmtodo indexOf paraobtenerlaposicindeunelemento,


como el mtodo set para reemplazar el valor en una posicin, una combinacin muy habitual. El
ejemploanteriorgenerarun ArrayList quecontendrdosnmeros,el10yel12.Veamosahoraun
ejemploalgomsdifcil:
al.addAll(0, t.subList(1, t.size()));

Esteejemploesespecialporqueusasublistas.Seusaelmtodo size paraobtenereltamaodela


lista. Despus el mtodo subList para extraer una sublista de la lista (que inclua en origen los
nmeros 2, 3 y 5), desde la posicin 1 hasta el final de la lista (lo cual dejara fuera al primer
elemento).Yporltimo,seusaelmtodo addAll paraaadirtodosloselementosdelasublistaal
ArrayList anterior.
Debes saber que las operaciones aplicadas a una sublista repercuten sobre la lista original. Por
ejemplo, si ejecutamos el mtodo clear sobre una sublista, se borrarn todos los elementos de la
sublista,perotambinseborrarndichoselementosdelalistaoriginal:
al.subList(0, 2).clear();

Lomismoocurrealaadirunelemento,seaadeenlasublistayenlalistaoriginal.

Las listas enlazadas son un elemento muy recurrido y su funcionamiento interno es


complejo.Terecomendamoselsiguienteartculodelawikipediaparaprofundizarunpoco
msenlaslistasenlazadasylosdiferentestiposquehay.
http://es.wikipedia.org/wiki/Lista_enlazada

Completa con el nmero que falta.


Dado el siguiente cdigo:
LinkedList<Integer> t=new LinkedList<Integer>();
t.add(t.size()+1); t.add(t.size()+1); Integer suma = t.get(0) + t.get(1);

El valor de la variable suma despus de ejecutarlo es

41

Aplicacindelasestructurasdealmacenamiento

DAW

8.2.Listas.(III)
Yen qusediferenciaun LinkedList deun ArrayList ?Los LinkedList utilizanlistasdoblemente
enlazadas,quesonlistasenlazadas(comosevioenunapartadoanterior),peroquepermitenirhacia
atrsenlalistadeelementos.Loselementosdelalistaseencapsulanenlosllamadosnodos.
Los nodos van enlazados unos a otros para
publicclassnodo{

publicNodosig;
noperderelordenynolimitareltamaode

publicNodoant;
almacenamiento. Tener un doble enlace

publicObjectV;
significa que en cada nodo se almacena la
}
informacin de cul es el siguiente nodo y
sig
sig
sig
adems, de cul es el nodo anterior. Si un
Nodo2
Nodo2
Nodo2
null
null
nodo no tiene nodo siguiente o nodo
ant
ant
ant
anterior,sealmacenanullonuloparaambos
casos.
Noeselcasodelos ArrayList .Estosseimplementanutilizandoarraysquesevanredimensionando
conforme se necesita ms espacio o menos. La redimensin es transparente a nosotros, no nos
enteramos cuando se produce, pero eso redunda en una diferencia de rendimiento notable
dependiendodeluso.Los ArrayList sonmsrpidosencuantoaaccesoaloselementos,accedera
unelementosegnsuposicinesmsrpidoenunarrayqueenunalistadoblementeenlazada(hay
querecorrerlalista).Encambio,eliminarunelementoimplicamuchasmsoperacionesenunarray
queenunalistaenlazadadecualquiertipo.
Yestoquequieredecir?Quesisevanarealizarmuchasoperacionesdeeliminacindeelementos
sobre la lista, conviene usar una lista enlazada ( LinkedList ), pero si no se van a realizar muchas
eliminaciones,sinoquesolamentesevanainsertaryconsultarelementosporposicin,conviene
usarunalistabasadaenarraysredimensionados( ArrayList ).
LinkedList tiene otras ventajas que nos puede llevar a su uso. Implementa las interfaces
java.util.Queue y java.util.Deque .Dichasinterfacespermitenhacerusodelaslistascomosifueran
unacoladeprioridadounapila,respectivamente.
Lascolas,tambinconocidascomocolasdeprioridad,sonunalistaperoqueaportanmtodospara
trabajardeformadiferente.Tsabesloqueeshacercolaparaqueteatiendanenunaventanilla?
Puesigual.Setratadequeelqueprimeroquellegaeselprimeroenseratendido(FIFOeningls).
Simplemente se aportan tres mtodos nuevos: meter en el final de la lista ( add y offer ), sacar y
eliminarelelementomsantiguo( poll ),yexaminarelelementoalprincipiodelalistasineliminarlo
( peek ).Dichosmtodosestndisponiblesenlaslistasenlazadas LinkedList :
9 boolean add(E e) y boolean offer(E e) ,retornarntruesisehapodidoinsertarelelementoal
finaldela LinkedList .
9 E poll() retornarelprimerelementodela LinkedList yloeliminardelamisma.Alinsertaral
final,loselementosmsantiguossiempreestnalprincipio.Retornarnullsilalistaestvaca.
9 E peek() retornar el primer elemento de la LinkedList pero no lo eliminar, permite
examinarlo.Retornarnullsilalistaestvaca.
Laspilas,muchomenosusadas,sontodolocontrarioalaslistas.Unapilaesigualqueunamontaa
dehojasenblanco,paraaadirhojasnuevasseponenencimadelresto,ypararetirarunasecogela
primeraquehay,encimadetodas.Enlaspilaselltimoenllegareselprimeroenseratendido.Para
elloseproveendetresmtodos:meteralprincipiodelapila( push ),sacaryeliminardelprincipiode
lapila( pop ),yexaminarelprimerelementodelapila( peek ,igualquesiusaralalistacomounacola).
Laspilasseusanmenosyharemosmenoshincapienellas.Simplementetenenmenteque,tanto
lascolascomolaspilas,sonunalistaenlazadasobrelaquesehacenoperacionesespeciales.

Dada la siguiente lista, usada como si fuera una cola de prioridad, cul es la letra que
se mostrara por la pantalla tras su ejecucin?
LinkedList<String> tt=new LinkedList<String>();
tt.offer("A"); tt.offer("B"); tt.offer("C");
System.out.println(tt.poll());

42

DesarrollodeAplicacionesWeb

Tema8

8.3.Listas.(IV)
Alahoradeusarlaslistas,hayquetenerencuentaunpardedetalles,sabescules?Essencillo,
peroimportante.
No es lo mismo usar las colecciones (listas y conjuntos) con objetos inmutables ( Strings , Integer ,
etc.) que con objetos mutables. Los objetos inmutables no pueden ser modificados despus de su
creacin,porloquecuandoseincorporanalalista,atravsdelosmtodos add ,sepasanporcopia
(esdecir,serealizaunacopiadelosmismos).Encambiolosobjetosmutables(comolasclasesquet
puedescrear),nosecopian,yesopuedeproducirefectosnodeseados.
Imaginatelasiguienteclase,quecontieneunnmero:
class Test
{
public Integer num;
Test (int num) { this.num=new Integer(num); }
}

Laclasedeantesesmutable,porloquenosepasaporcopiaalalista.Ahoraimaginaelsiguiente
cdigoenelquesecreaunalistaqueusaestetipodeobjeto,yenelqueseinsertandosobjetos:
Test p1=new Test(11); // Se crea un objeto Test donde el entero que contiene vale 11.
Test p2=new Test(12); // Se crea otro objeto Test donde el entero que contiene vale 12.
LinkedList<Test> lista=new LinkedList<Test>(); // Creamos una lista enlazada para objetos tipo
Test.
lista.add(p1); // Aadimos el primero objeto test.
lista.add(p2); // Aadimos el segundo objeto test.
for (Test p:lista) System.out.println(p.num); // Mostramos la lista de objetos.

Qumostraraporpantallaelcdigoanterior?Simplementemostraralosnmeros11y12.Ahora
bien,qupasasimodificamoselvalordeunodelosnmerosdelosobjetostest?Qusemostrar
alejecutarelsiguientecdigo?
p1.num=44;
for (Test p:lista) System.out.println(p.num);

El resultado de ejecutar el cdigo anterior es que se muestran los nmeros 44 y 12. El nmero ha
sidomodificadoynohemostenidoquevolverainsertarelelementoenlalistaparaqueenlalistase
cambie tambin. Esto es porque en la lista no se almacena una copia del objeto Test, sino un
apuntadoradichoobjeto(solohayunacopiadelobjetoalaquesehacereferenciadesdedistintos
lugares).

"Controlarlacomplejidadeslaesenciadelaprogramacin."
BrianKerniga

En el siguiente documento encontrars mucha informacin adicional sobre las estructuras


de datos, incluyendo algunas estructuras de datos adicionales menos usadas que no se
abordan en este tema. Algunas palabras cambian, por ejemplo, llama arreglos a los
arrays (ya se coment con anterioridad la existencia de esa otra nomenclatura). Es un
textoqueprofundizabastante,enlasestructurasdedatos,asqueleeloconpacienciaysin
prisas:
http://www.utim.edu.mx/~svalero/docs/ED_Java.pdf

Los elementos de un ArrayList de objetos Short se copian al insertarse al ser objetos


mutables.

Verdadero
Falso

Loselementossepasanporcopiaporserinmutables,nomutables.

43

Aplicacindelasestructurasdealmacenamiento

DAW

9.Conjuntosdeparesclave/valor.
Caso prctico.
Juan se quedo pensativo despus de la conversacin con Ana. Ana se fue a su puesto a seguir
trabajando, pero el se qued dndole vueltas al asunto... Si que est bien preparada Ana, me ha
puesto en jaque y no saba qu responder. El hecho de no poder ayudar a Ana le frustr un poco.
De repente, apareci Mara. Entonces Juan aprovecha el momento para preguntar con ms detalle
acerca del trabajo de Ana. Mara se lo cuenta y de repente, se le enciende una bombilla a Juan...
dice: Vale, creo que puedo ayudar a Ana en algo, le aconsejare usar mapas y le explicar como se
usan.

Cmoalmacenaraslos datosde un diccionario?Tenemosporunlado cadapalabray porotrosu


significado. Para resolver este problema existen precisamente los arrays asociativos . Un tipo de
array asociativo son los mapas o diccionarios, que permiten almacenar pares de valores conocidos
como clave y valor. La clave se utiliza para acceder al valor, como una entrada de un diccionario
permiteaccederasudefinicin.
EnJavaexistelainterfaz java.util.Map quedefinelosmtodosquedebentenerlosmapas,yexisten
tres implementaciones principales de dicha interfaz: java.util.HashMap , java.util.TreeMap y
java.util.LinkedHashMap . Te suenan? Claro que si. Cada una de ellas, respectivamente, tiene
caractersticassimilaresa HashSet , TreeSet y LinkedHashSet ,tantoenfuncionamientointernocomo
enrendimiento.
Losmapasutilizanclasesgenricasparadarextensibilidadyflexibilidad,ypermitendefiniruntipo
baseparalaclave,yotrotipodiferenteparaelvalor.Veamosunejemplodecomocrearunmapa,
queesextensiblealosotrosdostiposdemapas:
HashMap<String,Integer> t=new HashMap<String,Integer>();

Elmapaanteriorpermiteusarcadenascomollavesyalmacenardeformaasociadaacadallave,un
nmero entero. Veamos los mtodos principales de la interfaz Map , disponibles en todas las
implementaciones.Enlosejemplos,VeseltipobaseusadoparaelvaloryKeltipobaseusadopara
lallave:
Mtodo.
Descripcin.
Inserta un par de objetos llave (key) y valor (value) en el
mapa.Silallaveyaexisteenelmapa,entoncesretornarel
Vput(Kkey,Vvalue);
valor asociado que tena antes, si la llave no exista,
entoncesretornarnull.
Obtiene el valor asociado a una llave ya almacenada en el
Vget(Objectkey);
mapa.Sinoexistelallave,retornarnull.
Eliminalallaveyelvalorasociado.Retornaelvalorasociado
Vremove(Objectkey);
a la llave, por si lo queremos utilizar para algo, o null, si la
llavenoexiste.
Retornartruesielmapatienealmacenadalallavepasada
booleancontainsKey(Objectkey);
porparmetro,falseencualquierotrocaso.
Retornartruesielmapatienealmacenadoelvalorpasado
booleancontainsValue(Objectvalue);
porparmetro,falseencualquierotrocaso.
Retornar el nmero de pares llave y valor almacenado en
intsize();
elmapa.
Retornartruesielmapaestvaco,falseencualquierotro
booleanisEmpty();
caso.
voidclear();
Vacaelmapa.

Completa el siguiente cdigo para que al final se muestre el nmero 40 por pantalla:
HashMap<String, String >datos=new HashMap<String,String>();
datos.put ("A","44");
System.out.println(Integer.parseInt (datos.get (" A ")) 4 );

44

DesarrollodeAplicacionesWeb

Tema8

10.Iteradores.(I)
Caso prctico.
Juan se acerco a la mesa de Ana y le dijo:
-Mara me ha contado la tarea que te ha encomendado y he pensado que quizs te convendra usar
mapas en algunos casos. Por ejemplo, para almacenar los datos del pedido asociados con una
etiqueta: nombre, direccin, fecha, etc. As creo que te ser ms fcil generar luego el XML.
-La verdad es que pensaba almacenar los datos del pedido en una clase especial llamada Pedido. No
tengo ni idea de que son los mapas -dijo Ana-, supongo que son como las listas, tienen iteradores?
-Segn me ha contado Mara, no necesitas hacer tanto, no es necesario crear una clase especfica
para los pedidos. Y respondiendo a tu pregunta, los mapas no tienen iteradores, pero hay una
solucin... te explico.

Qu son los iteradores realmente? Son un mecanismo que nos permite recorrer todos los
elementosdeunacoleccindeformasencilla,deformasecuencial,ydeformasegura.Losmapas,
como no derivan de la interfaz Collection realmente, no tienen iteradores, pero como veremos,
existeuntrucointeresante.
Lositeradorespermitenrecorrerlascoleccionesdedosformas:buclesforeach(existentesenJavaa
partirdelaversin1.5)yatravsde unbucle normalcreando uniterador. Comolosbucles foreach yaloshemosvistoantes(yhaquedadopatentesusimplicidad),nosvamosacentrarenelotro
mtodo,especialmentetilenversionesantiguasdeJava.Ahoralapreguntaes,cmosecreaun
iterador?Puesinvocandoelmtodo iterator() decualquiercoleccin.
Veamosunejemplo(enelejemplotesunacoleccincualquiera):
Iterator<Integer> it=t.iterator();

Fijate que se ha especificado un parmetro para el tipo de dato genrico en el iterador (poniendo
<Integer> despusde Iterator ).Estoesporquelositeradoressontambinclasesgenricas,yes
necesario especificar el tipo base que contendr el iterador. Sino se especifica el tipo base del
iterador,igualmentenospermitirarecorrerlacoleccin,peroretornarobjetostipo Object (clasede
laquederivantodaslasclases),conloquenosveremosobligadosaforzarlaconversindetipo.
Pararecorrerygestionarlacoleccin,eliteradorofrecetresmtodosbsicos:
9 boolean hasNext() .Retornartruesilequedanmselementosalacoleccinporvisitar.Falseen
casocontrario.
9 E next() . Retornar el siguiente elemento de la coleccin, si no existe siguiente elemento,
lanzarunaexcepcin( NoSuchElementException paraserexactos),conloqueconvienechequear
primerosielsiguienteelementoexiste.
9 remove() .Eliminadelacoleccinelltimoelementoretornadoenlaltimainvocacindenext
(noesnecesariopasarseloporparmetro).Cuidado,sinextnohasidoinvocadotodava,saltar
unaincomodaexcepcin.
Cmorecorreramosunacoleccinconestosmtodos?Puesdeunaformamuysencilla,unsimple
buclemientras( while )conlacondicin hasNext() nospermitehacerlo:
while (it.hasNext()) // Mientras que haya un siguiente elemento, seguiremos en el bucle.
{
Integer t=it.next(); // Escogemos el siguiente elemento.
if (t%2==0) it.remove(); //Si es necesario, podemos eliminar el elemento extrado de la
lista.
}

Qu elementos contendra la lista despus de ejecutar el bucle? Efectivamente, solo los nmeros
impares.

Laslistaspermitenaccesoposicionalatravsdelosmtodosgetyset,yaccesosecuencialatravs
deiteradores,culesparatlaformamscmodaderecorrertodosloselementos?Unacceso
posicional a travs un bucle for (i=0;i<lista.size();i++) o un acceso secuencial usando un
bucle while (iterador.hasNext()) ?

10.1.Iteradores.(II)
Qu inconvenientes tiene usar los iteradores sin especificar el tipo de objeto? En el siguiente
ejemplo, se genera una lista con los nmeros del 0 al 10. De la lista, se eliminan aquellos que son

45

Aplicacindelasestructurasdealmacenamiento

DAW

pares y solo se dejan los impares. En el ejemplo de la izquierda se especifica el tipo de objeto del
iterador,enelejemplodeladerechano,observaelusodelaconversindetiposenlalnea6.
Ejemplonoindicandoeltipodeobjetodel
Ejemploindicandoeltipodeobjetodeiterador.
iterador,
ArrayList
<Integer>
lista=new
ArrayList<Integer>();
for (int i=0;i<10;i++) lista.add(i);
Iterator<Integer> it=lista.iterator();
while (it.hasNext()) {
Integer t=it.next();
if (t%2==0) it.remove();
}

ArrayList
<Integer>
lista=new
ArrayList<Integer>();
for (int i=0;i<10;i++) lista.add(i);
Iterator it=lista.iterator();
while (it.hasNext()) {
Integer t=(Integer)it.next();
if (t%2==0) it.remove();
}

Uniteradoresseguroporqueestapensadoparanosobrepasarloslmitesdelacoleccin,ocultando
operaciones ms complicadas que pueden repercutir en errores de software. Pero realmente se
convierteeninsegurocuandoesnecesariohacerlaoperacindeconversindetipos.Silacoleccin
nocontienelosobjetosesperados,alintentarhacerlaconversin,saltarunaincmodaexcepcin.
Usargenricosaportagrandesventajas,perousndolosadecuadamente.
Para recorrer los mapas con iteradores, hay que hacer un pequeo truco. Usamos el mtodo
entrySet queofrecenlosmapasparagenerarunconjuntoconlasentradas(paresdellavevalor),o
bien,elmtodo keySet paragenerarunconjuntoconlasllavesexistentesenelmapa.Veamoscomo
seraparaelsegundocaso,elmssencillo:
HashMap<Integer,Integer> mapa=new HashMap<Integer,Integer>test();
for (int i=0;i<10;i++) mapa.put(i, i); // Insertamos datos de prueba en el mapa.
for (Integer llave:mapa.keySet()) // Recorremos el conjunto generado por keySet, contendr las
llaves.
{
Integer valor=mapa.get(llave); //Para cada llave, accedemos a su valor si es necesario.
}

Lo nico que tienes que tener en cuenta es que el conjunto generado por keySet no tendr
obviamente el mtodo add para aadir elementos al mismo, dado que eso tendrs que hacerlo a
travsdelmapa.

Siusasiteradores,ypiensaseliminarelementosdelacoleccin(einclusodeunmapa),debesusar
el mtodo remove del iterador y no el de la coleccin. Si eliminas los elementos utilizando el
mtodo remove de la coleccin, mientras ests dentro de un bucle de iteracin, o dentro de un
bucle foreach, los fallos que pueden producirse en tu programa son impredecibles. Logras
adivinarporqusepuedenproducirdichosproblemas?
Losproblemassondebidosaqueelmtodoremovedeliteradoreliminaelelementodedossitios:
de la coleccin y del iterador en s (que mantiene interiormente informacin del orden de los
elementos).Siusaselmtodoremovedelacoleccin,lainformacinsoloseeliminadeunlugar,
delacoleccin.

Cundo debemos invocar el mtodo remove() de los iteradores?

46

Encualquiermomento
Despusdeinvocarelmtodonext()
DespusdeinvocarelmtodohasNext()
No es conveniente usar este mtodo para eliminar elementos, es mejor usar el de la
coleccin

DesarrollodeAplicacionesWeb

Tema8

11.Algoritmos.(I)
Caso prctico.
Ada se acerc a preguntar a Ana. Ada era la jefa y Ana le tena mucho respeto. Ada le pregunt
cmo llevaba la tarea que le haba encomendado Mara. Era una tarea importante, as que prest
mucha atencin.
Ana le ense el cdigo que estaba elaborando, le dijo que en un principio haba pensado crear una
clase llamada Pedido, para almacenar los datos del pedido, pero que Juan le recomend usar mapas
para almacenar los pares de valor y dato. As que se decant por usar mapas para ese caso. Le
coment tambin que para almacenar los artculos si haba creado una pequea clase llamada
Articulo. Ada le dio el visto bueno:
-Pues Juan te ha recomendado de forma adecuada, no vas a necesitar hacer ningn procesamiento
especial de los datos del pedido, solo convertirlos de un formato especfico a XML. Eso s, sera
recomendable que los artculos del pedido vayan ordenados por cdigo de artculo -dijo Ada.
-Ordenar los artculos? Vaya, que jaleo -respondi Ana.
-Arriba ese nimo mujer, si has usado listas es muy fcil, djame ver tu cdigo y te explicar cmo
hacerlo.
-Si, aqu est, es el siguiente, espero que te guste:
import
import
import
import
import
import
import
import
import
import
import
import
import

java.io.BufferedReader;
java.io.FileNotFoundException;
java.io.FileReader;
java.io.IOException;
java.util.ArrayList;
java.util.HashMap;
java.util.List;
java.util.Map;
java.util.Scanner;
java.util.logging.Level;
java.util.logging.Logger;
java.util.regex.Matcher;
java.util.regex.Pattern;

/*
* Clase destinada a almacenar los datos de un artculo.
*/
class Articulo {
public String codArticulo;
public String descripcion;
public int cantidad;
}

/* Clase que se encarga de procesar un pedido.


* El archivo con el pedido debe estar en codificacin UTF8, sino no funciona
* bien.
* Tu sistema debe soportar de forma nativa la coficacin UTF8, sino no
* funcionar del todo bien.
*/
public class ProcesarArchivo2 {
/* Entrada contendr una instancia de la clase Scanner que permitir
leer las teclas pulsadas desde teclado */
static Scanner entrada = new Scanner(System.in);
/* Definimos las expresiones regulares que usaremos una y otra vez para
cada lnea del pedido. La expresin regular "seccion" permite detectar
si hay un comienzo o fin de pedido, y la expresin campo, permite detectar
si hay un campo con informacin del pedido. */
static Pattern seccion = Pattern.compile("^##[ ]*(FIN)?[ ]*(PEDIDO|ARTICULOS)[ ]*##$");
static Pattern campo = Pattern.compile("^(.+):.*\\{(.*)\\}$");
static Pattern articulo = Pattern.compile ("^\\{(.*)\\|(.*)\\|[ ]*([0-9]*)[ ]*\\}$");
public static void main(String[] args) {
BufferedReader lector;
ArrayList<Articulo> Articulos=new ArrayList<Articulo>();
HashMap<String,String> DatosPedido=new HashMap<String,String>();
/*
* 1er paso: cargamos el archivo para poder procesarlo lnea a lnea
* para ello nos apoyamos en la clase BufferedReader, que con el mtodo
* readLine nos permite recorrer todo el archivo lnea a lnea.
*/

47

Aplicacindelasestructurasdealmacenamiento

DAW

if (args.length > 0) {
lector = cargarArchivo(args[0]);
} else {
lector = cargarArchivo();
}

if (lector == null) {
/* Si no se ha podido cargar el archivo, no contina con el
* procesado, simplemente termina la ejecucin. */
System.out.println("No se ha podido cargar el archivo.");
} else {
/* Si ha podido cargar el archivo, contina el procesado de lnea
* a lnea. */
String linea;
try {
linea = lector.readLine();
while (linea != null) {
procesarLinea(linea,DatosPedido,Articulos);
linea = lector.readLine();
}
} catch (IOException ex) {
System.out.println("Error de entrada y salida.");
}
// Mostramos los datos del pedido para ver si son correctos.
for (String etiqueta:DatosPedido.keySet())
{
System.out.println("Dato pedido-->"+etiqueta+":"+DatosPedido.get(etiqueta));
}
// Mostramos los datos de los articulos para ver si son correctos.
for (Articulo ar:Articulos)
{
System.out.print("articulo codigo='"+ar.codArticulo+"' ");
System.out.print("descripcion='"+ar.descripcion+"' ");
System.out.println("cantidad='"+ar.cantidad+"'");
}
}
}
/**
* Procesa una lnea del archivo de pedido para detectar que es y
* extraer la informacin que contiene.
* @param linea
* @param datosPedido Mapa en el que ir metiendo la informacin del pedido.
* La llave del mapa ser el nombre del campo.
* @param articulos Lista en la que se irn metiendo los artculos del pedido.
* @return true si la lnea contiene informacin que corresponde al formato
* esperado, false en caso contrario.
*/
static boolean procesarLinea(String linea, Map<String,String> datosPedido,
List<Articulo> articulos) {
Matcher deteccionSeccion = seccion.matcher(linea);
Matcher deteccionCampo = campo.matcher(linea);
Matcher deteccionArticulo= articulo.matcher(linea);
/* Si el patrn coincide con el de un indicador de comienzo del pedido
* o de la seccin con el listado de artculos, se ejecutar este trozo
* de cdigo, pues habr encontrado el patrn. No hace nada,
* simplemente lo detecta para as no informar de algo raro.
*/
if (deteccionSeccion.matches()) {
return true;
}
/* Si el patrn coincide con el de un campo con datos del pedido
entonces meter tanto el campo como el valor en el mapa.*/
else if (deteccionCampo.matches()) {
datosPedido.put(deteccionCampo.group(1).trim().toLowerCase(),
deteccionCampo.group(2).trim());
return true;
}
/* Si el patrn coincide con el de un artculo, entonces
guardar los datos del pedido en una clase articulo y lo meter
en la lista de artculos.*/
else if (deteccionArticulo.matches())
{

48

DesarrollodeAplicacionesWeb

Tema8

Articulo n=new Articulo();


n.codArticulo=deteccionArticulo.group(1).trim();
n.descripcion=deteccionArticulo.group(2).trim();
n.cantidad=Integer.parseInt(deteccionArticulo.group(3));
articulos.add(n);
return true;
}
else { System.out.println("Cuidado! Lnea no procesable: "+linea); return false; }
}
/**
* cargarArchivo crear una instancia de la clase BufferedReader que
* permitir leer lnea a lnea el archivo de texto. Si no se ha podido
* cargar el archivo retornar null.
* @param name Nombre del archivo a cargar. si el nombre del archivo no
* se ha pasado por parmetro (valor null) se pedir al usuario que lo
* introduzca.
* @return null si no ha podido cargar el archivo, o la instancia de la
* clase BufferedReader si dicho archivo se ha podido cargar.
*/
static BufferedReader cargarArchivo(String name) {
String nombreArchivo = name;
BufferedReader reader = null;
if (name == null) {
System.out.print("Introduce el nombre del archivo:");
nombreArchivo = entrada.nextLine();
}
try {
FileReader f =new FileReader(nombreArchivo);
reader = new BufferedReader(f);
} catch (FileNotFoundException ex) {
Logger.getLogger(ProcesarArchivo2.class.getName()).log(Level.SEVERE, null, ex);
}
return reader;
}
/**
* Igual que el mtodo BufferedReader cargarArchivo(String name), pero
* que siempre le pedir al usuario que lo introduzca.
* @return null si no ha podido cargar el archivo, y una instancia de BufferedReader
* en otro caso.
*/
static BufferedReader cargarArchivo() {
return cargarArchivo(null);
}
}

Lapalabraalgoritmoseguroquetesuena,pero,aquserefiereenelcontextodelascoleccionesy
deotrasestructurasdedatos?Lascolecciones,losarrayseinclusolascadenas,tienenunconjunto
deoperacionestpicasasociadasquesonhabituales.Algunasdeestasoperacionesyalashemosvisto
antes,perootrasno.Veamosparaqunospuedenservirestasoperaciones:
9 Ordenarlistasyarrays.
9 Desordenarlistasyarrays.
9 Bsquedabinariaenlistasyarrays.
9 Conversindearraysalistasydelistasaarray.
9 Partircadenasyalmacenarelresultadoenunarray.
Estos algoritmos estn en su mayora recogidos como mtodos estticos de las clases
java.util.Collections y java.util.Arrays ,salvolosreferentesacadenasobviamente.
Losalgoritmosdeordenacinordenanloselementosenordennatural,siemprequeJavasepacomo
ordenarlos.
Como se explico en el apartado de conjuntos, cuando se desea que la ordenacin siga un orden
diferente, o simplemente los elementos no son ordenables de forma natural, hay que facilitar un
mecanismoparaquesepuedaproducirlaordenacin.Lostiposordenablesdeformanaturalson
losenteros,lascadenas(ordenalfabtico)ylasfechas,ypordefectosuordenesascendente.
La clase Collections y la clase Arrays facilitan el mtodo sort , que permiten ordenar
respectivamente listas y arrays. Los siguientes ejemplos ordenaran los nmeros de forma
ascendente(demenoramayor):

49

Aplicacindelasestructurasdealmacenamiento

DAW

Ejemplo de ordenacin de un array de Ejemplodeordenacindeunalistaconnmeros.


nmeros
Integer[] array={10,9,99,3,5};
Arrays.sort(array);

ArrayList<Integer> lista=new ArrayList<Integer>();


lista.add(10); lista.add(9);lista.add(99);
lista.add(3); lista.add(5);
Collections.sort(lista);

11.1.Algoritmos.(II)
EnJavahaydosmecanismosparacambiarlaformaenlaqueloselementosseordenan.Recuerdas
la tarea que Ada pidi a Ana? Que los artculos del pedido aparecieran ordenados por cdigo de
artculo. Imagina que tienes los artculos almacenados en una lista llamada articulos, y que cada
artculo se almacena en la siguiente clase (fijate que el cdigo de artculo es una cadena y no un
nmero):
class Articulo {
public String codArticulo; // Cdigo de artculo
public String descripcion; // Descripcin del artculo.
public int cantidad; // Cantidad a proveer del artculo.
}

La primera forma de ordenar consiste en crear una clase que implemente la interfaz
java.util.Comparator ,yporende,elmtodocomparedefinidoendichainterfaz.Estoseexplicen
elapartadodeconjuntos,alexplicarel TreeSet ,asquenovamosaprofundizarenello.Noobstante,
elcomparadorparaesecasopodraseras:
class comparadorArticulos implements Comparator<Articulo>{
@Override
public int compare( Articulo o1, Articulo o2) {
return o1.codArticulo.compareTo(o2.codArticulo);
}
}

Una vez creada esta clase, ordenar los elementos es muy sencillo, simplemente se pasa como
segundoparmetrodelmtodosortunainstanciadelcomparadorcreado:
Collections.sort(articulos, new comparadorArticulos());

La segunda forma es quizs ms sencilla cuando se trata de objetos cuya ordenacin no existe de
forma natural, pero requiere modificar la clase Articulo. Consiste en hacer que los objetos que se
meten en la lista o array implementen la interfaz java.util.Comparable . Todos los objetos que
implementan la interfaz Comparable son ordenables y se puede invocar el mtodo sort sin
indicaruncomparadorparaordenarlos.Lainterfaz comparable solorequiereimplementarelmtodo
compareTo :
class Articulo implements Comparable<Articulo>{
public String codArticulo;
public String descripcion;
public int cantidad;
@Override
public int compareTo(Articulo o) {
return codArticulo.compareTo(o.codArticulo);
}
}

Del ejemplo anterior se pueden denotar dos cosas importantes: que la interfaz Comparable es
genricayqueparaquefuncionesinproblemasesconvenienteindicareltipobasesobreelquese
permitelacomparacin(enestecaso,elobjetoArticulodebecompararseconsigomismo),yqueel
mtodo compareTo soloadmiteunparmetro,dadoquecompararelobjetoconelquesepasapor
parmetro.
El funcionamiento del mtodo compareTo es el mismo que el mtodo compare de la interfaz
Comparator :silaclasequesepasaporparmetroesigualalobjeto,setendraqueretornar0;sies
menoroanterior,sedeberaretornarunnmeromenorquecero;siesmayoroposterior,sedebera
retornarunnmeromayorque0.
Ordenarahoralalistadeartculosessencillo,fjatequefcil: Collections.sort(articulos);

50

DesarrollodeAplicacionesWeb

Tema8

Si tienes que ordenar los elementos de una lista de tres formas diferentes, cul de los
mtodos anteriores es ms conveniente?

Usarcomparadores,atravsdelainterfazjava.util.Comparator
Implementarlainterfazcomparableenelobjetoalmacenadoenlalista

11.2.Algoritmos.(III)
Qu ms ofrece las clases java.util.Collections y java.util.Arrays de Java? Una vez vista la
ordenacin,quizslomscomplicado,veamosalgunasoperacionesadicionales.Enlosejemplos,la
variablearrayesunarrayylavariablelistaesunalistadecualquiertipodeelemento:
Operacin
Descripcin
Ejemplos
Desordena una lista, este
Desordenaruna
mtodonoestdisponiblepara Collections.shuffle (lista);
lista.
arrays.
Rellena una lista o array
copiando el mismo valor en
Rellenarunalistao
Collections.fill (lista,elemento);
todosloselementosdelarrayo Arrays.fill (array,elemento);
array.
lista.tilparareiniciarunalista
oarray.
Permite realizar bsquedas
rpidas en un una lista o array
ordenados. Es necesario que la Collections.binarySearch(lista,elemento);
Busquedabinaria.
listaoarrayestnordenados,si Arrays.binarySearch(array, elemento);
no lo estn, la bsqueda no
tendrxito.
Permite rpidamente convertir
un array a una lista de List lista=Arrays.asList(array);
elementos, extremadamente Sieltipodedatoalmacenadoenelarrayes
til. No se especifica el tipo de conocido (Integer por ejemplo), es
Convertirunarray
lista retornado (no es ArrayList convenienteespecificareltipodeobjetode
alista.
ni LinkedList), solo se especifica lalista:
=
que retorna una lista que List<Integer>lista
Arrays.asList(array);
implementa
la
interfaz
java.util.List.
Permite convertir una lista a Para este ejemplo, supondremos que los
array. Esto se puede realizar en elementos de la lista son nmeros, dado
todaslascolecciones,ynoesun que hay que crear un array del tipo
Convertirunalista
mtodo de la clase Collections, almacenado en la lista, y del tamao de la
aarray.
sino propio de la interfaz lista:
array=new
Collection. Es conveniente que Integer[]
Integer[lista.size()];
sepasdesuexistencia.
lista.toArray(array);
Da la vuelta a una lista,
Darlavuelta.
ponindola en orden inverso al Collections.reverse(lista);
quetiene.

Otraoperacinquenosehavistohastaahoraesladividirunacadenaenpartes.Cuandounacadena
estformadainternamenteportrozosdetextoclaramentedelimitadosporunseparador(unacoma,
unpuntoycomaocualquierotro),esposibledividirlacadenayobtenercadaunodelostrozosde
textoporseparadoenunarraydecadenas.Esunaoperacinsencilla,perodadoqueesnecesario
conocerelfuncionamientodelosarraysydelasexpresionesregularesparasuuso,nosehapodido

51

Aplicacindelasestructurasdealmacenamiento

DAW

verhastaahora.Parapoderrealizarestaoperacin,usaremoselmtodo split delaclase String .El


delimitadoroseparadoresunaexpresinregular,nicoargumentodelmtodo split ,ypuedeser
obviamentetodolocomplejoqueseanecesario:
String texto="Z,B,A,X,M,O,P,U";
String []partes=texto.split(",");
Arrays.sort(partes);

Enelejemploanteriorlacadenatextocontieneunaseriedeletrasseparadasporcomas.Lacadena
se ha dividido con el mtodo split , y se ha guardado cada carcter por separado en un array.
Despus se ha ordenado el array. Increble lo que se puede llegar a hacer con solo tres lneas de
cdigo!

En el siguiente vdeo podrs ver en qu consiste la bsqueda binaria y como se aplica de


formasencilla:
http://www.youtube.com/watch?v=_B2mEOA7hSo
Vdeoenelqueseexplicaquelabsquedabinariaesunatcnicaquepermitebuscarrpidamente
nmerosen unarrayordenado(aunquetambinesaplicablealistasordenadas).Enelprocesode
bsquedabinariaconsisteendividirenhallarelpuntomediodelarray.Sielvalorbuscadocoincide
conelpuntomedio,entoncessehaencontrado.Sielvalorbuscadoesmenoralvalorquehayenla
mitaddelarray,entonceselvalorbuscadoestarenlaprimeramitaddelarray,seprocedeabuscar
elvalorendichamitad.Sielvalorbuscadoesmayoralvalorquehayenlamitaddelarray,entonces
el valor buscado estar en en la segunda mitad del array, y se procede a buscar el valor en dicha
mitad.
Para encontrar el valor en cada una de las mitades, se procede de igual forma, se busca el punto
centralysevuelveadividirendos.Elprocesocontinahastaquenosepuedavolverarealizaruna
nuevadivisin.

52

DesarrollodeAplicacionesWeb

Tema8

12.TratamientodedocumentosestructuradosXML.
Caso prctico.
Ana ya ha terminado lo principal, ya es capaz de procesar el pedido y de almacenar la informacin en
estructuras de memoria que luego podr proyectar a un documento XML, incluso ha ordenado los
artculos en base al cdigo de artculo, definitivamente era bastante ms fcil de lo que ella pensaba.
Ahora le toca la tarea ms ardua de todas, o al menos as lo ve ella, generar el documento XML con
la informacin del pedido, le resultar muy difcil?

Qu es XML? XML es un mecanismo extraordinariamente sencillo para estructurar, almacenar e


intercambiarinformacinentresistemasinformticos.
XMLdefineunlenguajedeetiquetas,muyfcildeentenderperoconunasreglasmuyestrictas,que
permite encapsular informacin de cualquier tipo para posteriormente ser manipulada. Se ha
extendidotantoquehoydaesunestndarenelintercambiodeinformacinentresistemas.
LainformacinenXMLvaescritaentextolegibleporelserhumano,peronoestpensadaparaque
sealedaporunserhumano,sinoporunamquina.Lainformacinvacodificadageneralmenteen
unicode, pero estructurada de forma que una mquina es capaz de procesarla eficazmente. Esto
tiene una clara ventaja: si necesitamos modificar algn dato de un documento en XML, podemos
hacerloconuneditordetextoplano.VeamosloselementosbsicosdelXML:
Elemento
Descripcin
Ejemplo
Es lo primero que encontramos en el documento
Cabecerao XML y define cosas como, por ejemplo, la
<?xml
version="1.0"
declaracin codificacin del documento XML (que suele ser encoding="ISO-8859-1"?>
delXML.
ISO88591oUTF8)ylaversindelestndarXML
quesiguenuestrodocumentoXML.
Una etiqueta es un delimitador de datos, y a su
vez, un elemento organizativo. La informacin va
entre las etiquetas de apertura (<pedido>) y <pedido>
informacin del pedido
Etiquetas.
cierre (</pedido>). Fjate en el nombre de la
</pedido>
etiqueta (pedido), debe ser el mismo tanto en
el cierre como en la apertura, respetando
maysculas.
Una etiqueta puede tener asociado uno o ms
atributos.Siempredebenirdetrsdelnombrede
cantidad="20">
la etiqueta, en la etiqueta de apertura, poniendo <articulo
informacin
Atributos.
elnombredelatributoseguidodeigualyelvalor </articulo>
encerradoentrecomillas.Siempredebesdejaral
menosunespacioentrelosatributos.
Entreelcierreylaaperturadeunaetiquetapuede <cliente>
Muebles Bonitos S.A.
Texto.
habertexto.
</cliente>
Cuandounaetiquetanotienecontenido,notiene
Etiquetassin porqu haber una etiqueta de cierre, pero no <fecha entrega="1/1/2012" />
contenido.
debesolvidarponerlabarradecierre(/)alfinal
delaetiquetaparaindicarquenotienecontenido.
Es posible introducir comentarios en XML y estos
Comentario. van dirigidos generalmente a un ser humano que <!-- comentario -->
leedirectamenteeldocumentoXML.

El nombre de la etiqueta y de los nombres de los atributos no deben tener espacios. Tambin es
convenienteevitarlospuntos,comasydemscaracteresdepuntuacin.Ensulugarsepuedeusarel
guinbajo( <pedido_enviado> </pedido_enviado> ).

Seala las lneas que no seran elementos XML vlidos.

53

Aplicacindelasestructurasdealmacenamiento

DAW

<cliente>InformticaElegante<cliente/>

<!>

<pedidofechaentrega=25/>

<direccion_entrega>sinespecificar</direccion_entrega>

12.1.QuesundocumentoXML?
Los documentos XML son documentos que solo utilizan los elementos expuestos en el apartado
anterior(declaracin,etiquetas,comentarios,etc.)deformaestructurada.Siguenunaestructurade
rbol,pseudojerrquica,permitiendoagruparlainformacinendiferentesniveles,quevandesdela
razalashojas.
Para comprender la estructura de un documento XML vamos a utilizar una terminologa afn a la
formaenlacualprocesaremoslosdocumentosXML.UndocumentoXMLestcompuestodesdeel
puntodevistadeprogramacinpornodos,pornodosquepueden(ono)contenerotrosnodos.Todo
esunnodo:
9 El par formado por la etiqueta de apertura ( <etiqueta> ) y por la de cierre ( </etiqueta> ),
junto con todo su contenido (elementos, atributos y texto de su interior) es un nodo llamado
elemento( Element desdeelpuntodevistadeprogramacin).Unelementopuedecontenerotros
elementos,esdecir,puedecontenerensuinteriorsubetiquetas,deformaanidada.
9 Un atributo es un nodo especial llamado atributo ( Attr desde el punto de vista de
programacin), que solo puede estar dentro de un elemento (concretamente dentro de la
etiquetadeapertura).
9 Eltextoesunnodoespecialllamadotexto( Text ),quesolopuedeestardentrodeunaetiqueta.
9 Uncomentarioesunnodoespecialllamadocomentario( Comment ),quepuedeestarencualquier
lugardeldocumentoXML.
9 Yporltimo,undocumentoesunnodoquecontieneunajerarquadenodosensuinterior.Est
formado opcionalmente por una declaracin, opcionalmente por uno o varios comentarios y
obligatoriamenteporunnicoelemento.
Estoesunpocolioso,verdad?Vamosaclarificarloconejemplos.Primero,tenemosqueentenderla
diferencia entre nodos padre y nodos hijo. Un elemento (par de etiquetas) puede contener varios
nodoshijo,quepuedensertextouotroselementos.Porejemplo:
<padre att1="valor" att2="valor">
texto 1
<ethija> texto 2 </ethija>
</padre>

Enelejemploanterior,elelementopadretendradoshijos:eltextotexto1,seraelprimerhijo,y
elelementoetiquetadocomoethija,elsegundo.Tendratambindosatributos,queseranodos
hijo tambin pero que se consideran especiales y la forma de acceso es diferente. A su vez, el
elementoethijatieneunnodohijo,quesereltextotexto2.Fcilno?
Ahora veamos el conjunto, un documento estar formado, como se dijo antes, por algunos
elementos opcionales, y obligatoriamente por un nico elemento (es decir, por nico par de
etiquetas que lo engloba todo) que contendr internamente el resto de informacin como nodos
hijo.Porejemplo:
<?xml version="1.0" encoding="ISO-8859-1"?>
<pedido>
<cliente> texto </cliente>
<codCliente> texto </codCliente>
...
</pedido>

Laetiquetapedidodelejemploanterior,serportantoelelementorazdeldocumentoydentrode
lestartodalainformacindeldocumentoXML.Ahoraseguroqueesmsfcil,no?

54

DesarrollodeAplicacionesWeb

Tema8

EnelsiguienteenlacepodrsencontrarunabreveguadelastecnologasasociadasaXML
actuales.Sonbastantesysupotencialesincreble.
http://www.w3c.es/divulgacion/guiasbreves/tecnologiasxml

XMLEssentials

Schema

Security

Transformation

Query

Components
Processing
Internationalization

Publishing

TecnologasXML
XML est compuesto por un conjunto de tecnologas esenciales como el
conjuntodeinformacinyespaciosde nombre.Abordanproblemascuando
seutilizanXMLencontextosdeaplicacionesespecficas.
Lasdescripcionesformalesdelosvocabularioscreanflexibilidadenentornos
decreacinylascadenasdecontroldecalidad.XMLSchemadelW3C,SML,y
las tecnologas de enlace de datos proporcionan las herramientas para el
controldecalidaddelosdatosXML.
La manipulacin de datos con XML requiere a veces de integridad,
autenticacinyprivacidad.FirmaXML,cifradoyXKMSpuedeayudaracrear
unentornoseguroparaXML.
Muy frecuentemente uno quiere transformar el contenido XML en otro
formato (incluyendo otros formatos XML). XSLT y XPath son herramientas
poderosasparalacreacindediferentesrepresentacionesdecontenidoXML.
XQuery(soportadoporXPath)esunlenguajedeconsultaparaextraerdatos
delXML,similaralasreglasdeSQLparalasbasesdedatos,oSPARQLparala
semnticaWeb.
The XML ecosystem is using additional tools to create a richer environment
forusingandmanipulatingXMLdocuments.Thesecomponentsincludestyle
sheets,xlinkxml:id,xinclude,xpointer,xforms,xmlfragments,andevents.
Unmodelodeprocesamientodefinequoperacionesdebenllevarseacabo
enquordendeundocumentoXML.
W3C ha trabajado con la comunidad en la internacionalizacin de XML, por
ejemplo,paraespecificarelidiomadelcontenidoXML.
XML surgi de la comunidad de publicacin tcnica. El uso de XSLFO para
publicarinclusograndesocomplejosdocumentosXMLaHTMLmultilinges,
losformatosPDFodeotrotipo;incluyendiagramasyfrmulasMathMLSVG
enlasalida.

12.2.LibrerasparaprocesardocumentosXML.(I)
QuinestablecelasbasesdelXML?PueselW3CoWoldWideWebConsortiumeslaentidadque
establece las bases del XML. Dicha entidad, adems de describir como es el XML internamente,
define un montn de tecnologas estndar adicionales para verificar, convertir y manipular
documentosXML.NosotrosnovamosaexplorartodaslastecnologasdeXMLaqu(sonmuchsimas),
solamentevamosausardosdeellas,aquellasquenosvanapermitirmanejardeformasimpleun
documentoXML:
9 Procesadores de XML. Son libreras para leer documentos XML y comprobar que estn bien
formados.EnJava,elprocesadormsutilizadoesSAX,lousaremosperosinpercatarnoscaside
ello.
9 XMLDOM.PermitetransformarundocumentoXMLenunmodelodeobjetos(dehecho DOM
significaDocumentObjectModel),accesiblecmodamentedesdeellenguajedeprogramacin.
DOM almacena cada elemento, atributo, texto, comentario, etc. del documento XML en una
estructura tipo rbol compuesta por nodos fcilmente accesibles, sin perder la jerarqua del
documento.Apartirdeahora,laestructuraDOMquealmacenaunXMLlallamaremosrbolo
jerarquadeobjetosDOM.
En Java, estas y otras funciones estn implementadas en la librera JAXP (Java API for XML
Processing),yyavanincorporadasenlaedicinestndardeJava(JavaSE).Enprimerlugarvamosa

55

Aplicacindelasestructurasdealmacenamiento

DAW

ver como convertir un documento XML a un rbol DOM, y viceversa, para despus ver cmo
manipulardesdeJavaunrbolDOM.
Para cargar un documento XML tenemos que hacer uso de un procesador de documentos XML
(conocidosgeneralmentecomoparsers)ydeunconstructordedocumentosDOM.LasclasesdeJava
quetendremosqueutilizarson:
9 javax.xml.parsers.DocumentBuilder : ser el procesador y transformar un documento XML a
DOM,seleconocecomoconstructordedocumentos.
9 javax.xml.parsers.DocumentBuilderFactory :permitecrearunconstructordedocumentos,esuna
fbricadeconstructoresdedocumentos.
9 org.w3c.dom.Document : una instancia de esta clase es un documento XML pero almacenado en
memoria siguiendo el modelo DOM. Cuando el parser procesa un documento XML crear una
instanciadeestaclaseconelcontenidodeldocumentoXML.
Ahorabien,estocmoseusa?Puesmuyfcil,enpocaslneas(noolvidesimportarlaslibreras):
try {
// 1 Creamos una nueva instancia de una fabrica de constructores de documentos.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 2 A partir de la instancia anterior, fabricamos un constructor de documentos, que
procesar el XML.
DocumentBuilder db = dbf.newDocumentBuilder();
// 3 Procesamos el documento (almacenado en un archivo) y lo convertimos en un rbol DOM.
Document doc=db.parse(CaminoAArchivoXml);
} catch (Exception ex) {
System.out.println("Error! No se ha podido cargar el documento XML.");
}

Esunpocoenrevesadoperonotienemuchacomplicacin,esunpelnmscomplicadoparahacerel
caminoinverso(pasarelDOMaXML).Esteprocesopuedegenerarhastatrestiposdeexcepciones
diferentes. La ms comn, que el documento XML est mal formado, por lo que tienes que tener
cuidadoconlasintaxisXML.

Cul es la funcin de la clase org.w3c.dom.Document?

ProcesareldocumentoXML
AlmacenareldocumentoXMLenunmodelodeobjetosaccesibledesdeJava
Fabricarunnuevoconstructordedocumentos

12.2.1.LibrerasparaprocesardocumentosXML.(II)
YcmopasolajerarquaorboldeobjetosDOMaXML?EnJavaestoesunpelnmscomplicado
quelaoperacininversa,yrequiereelusodeunmontndeclasesdelpaquetejava.xml.transform,
pueslaideaestransformarelrbolDOMenunarchivodetextoquecontieneeldocumentoXML.
Lasclasesquetendremosqueusarson:
9 javax.xml.transform.TransformerFactory . Fbrica de transformadores, permite crear un nuevo
transformadorqueconvertirelrbolDOMaXML.
9 javax.xml.transform.Transformer .TransformadorquepermitepasarunrbolDOMaXML.
9 javax.xml.transform.TransformerException .Excepcinlanzadacuandoseproduceunfalloenla
transformacin.
9 javax.xml.transform.OutputKeys . Clase que contiene opciones de salida para el transformador.
Se suele usar para indicar la codificacin de salida (generalmente UTF8) del documento XML
generado.
9 javax.xml.transform.dom.DOMSource .ClasequeactuardeintermediariaentreelrbolDOMyel
transformador,permitiendoaltransformadoraccederalainformacindelrbolDOM.
9 javax.xml.transform.stream.StreamResult . Clase que actuar de intermediaria entre el
transformadoryelarchivooStringdondesealmacenareldocumentoXMLgenerado.

56

DesarrollodeAplicacionesWeb

Tema8

java.io.File . Clase que, como posiblemente sabrs, permite leer y escribir en un archivo
almacenadoendisco.ElarchivoserobviamenteeldocumentoXMLquevamosaescribirenel
disco.
Estoesunpocolioso,ono?Noloestantocuandoseveunejemplodecmorealizarelprocesode
transformacinderbolDOMaXML,veamoselejemplo:

try {
// 1 Creamos una instancia de la clase File para acceder al archivo donde guardaremos el XML.
File f=new File(CaminoAlArchivoXML);
//2 Creamos una nueva instancia del transformador a travs de la fbrica de transformadores.
Transformer transformer = TransformerFactory.newInstance().newTransformer();
//3 Establecemos algunas opciones de salida, como por ejemplo, la codificacin de salida.
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
//4 Creamos el StreamResult, intermediaria entre el transformador y el archivo de destino.
StreamResult result = new StreamResult(f);
//5 Creamos el DOMSource, intermediaria entre el transformador y el rbol DOM.
DOMSource source = new DOMSource(doc);
//6 Realizamos la transformacin.
transformer.transform(source, result);
} catch (TransformerException ex) {
System.out.println("Error! No se ha podido llevar a cabo la transformacin.");
}

Acontinuacinteadjuntamos,cortesadelacasa, unadeesas clasesantiestrs...utilizalatodolo


quequieras,conellapodrsconvertirundocumentoXMLarbolDOMyviceversadeformasencilla.
El documento XML puede estar almacenado en un archivo o en una cadena de texto (e incluso en
Internet,paraloquenecesitaselURI).LosmtodosestticosDOM2XMLtepermitirnpasarelrbol
DOMaXML,ylosmtodosString2DOMyXML2DOMtepermitirnpasarundocumentoXMLaun
rbolDOM.
Tambin contiene el mtodo crearDOMVacio que permite crear un rbol DOM vaco, til para
empezarundocumentoXMLdecero.
package javaapplication1;
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import

java.io.ByteArrayInputStream;
java.io.File;
java.io.StringWriter;
java.util.logging.Level;
java.util.logging.Logger;
javax.xml.parsers.DocumentBuilder;
javax.xml.parsers.DocumentBuilderFactory;
javax.xml.parsers.ParserConfigurationException;
javax.xml.transform.OutputKeys;
javax.xml.transform.Transformer;
javax.xml.transform.TransformerException;
javax.xml.transform.TransformerFactory;
javax.xml.transform.dom.DOMSource;
javax.xml.transform.stream.StreamResult;
org.w3c.dom.Document;

/**
* Utilidades para pasar rboles DOM a documentos XML y viceversa.
* @author Salvador Romero Villegas
*/
public class DOMUtil {
/**
* Carga un archivo con un documento XML a un rbol DOM.
* @param CaminoAArchivoXml puede ser un archivo local de tu disco duro
* o una URI de Internet (http://...).
* @return el documento DOM o null si no se ha podido cargar el documento.
*/
public static Document XML2DOM (String CaminoAArchivoXml)
{
Document doc=null;
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
doc=db.parse(CaminoAArchivoXml);
} catch (Exception ex) {

57

Aplicacindelasestructurasdealmacenamiento
Logger.getLogger(DOMUtil.class.getName()).log(Level.SEVERE, null, ex);
}
return doc;
}
/**
* Convierte una cadena que contiene un documento XML a un rbol DOM.
* @param documentoXML cadena que contiene el documento XML.
* @return El rbol DOM o null si no se ha podido convertir.
*/
public static Document String2DOM (String documentoXML)
{
ByteArrayInputStream bais=new ByteArrayInputStream(documentoXML.getBytes());
Document doc=null;
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
doc=db.parse(bais);
} catch (Exception ex) {
Logger.getLogger(DOMUtil.class.getName()).log(Level.SEVERE, null, ex);
}
return doc;
}
/**
* Convierte un rbol DOM a una cadena que contiene un documento XML.
* @param doc rbol DOM.
* @return null si no se ha podido convertir o la cadena con el documento
* en XML si se ha podido convertir.
*/
public static String DOM2XML (Document doc)
{
String xmlString=null;
try {
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
StreamResult result = new StreamResult(new StringWriter());
DOMSource source = new DOMSource(doc);
transformer.transform(source, result);
xmlString = result.getWriter().toString();
} catch (TransformerException ex) {
Logger.getLogger(DOMUtil.class.getName()).log(Level.SEVERE, null, ex);
xmlString=null;
}
return xmlString;
}
/**
* Convierte un rbol DOM a XML y lo guarda en un archivo.
* @param doc Documento a convertir en XML.
* @param CaminoAlArchivoXML Camino o path para llegar al archivo en el
* disco.
* @return true si se ha podido convertir y false en cualquier otra situacin.
*/
public static boolean DOM2XML (Document doc, String CaminoAlArchivoXML)
{
try {
File f=new File(CaminoAlArchivoXML);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
StreamResult result = new StreamResult(f);
DOMSource source = new DOMSource(doc);
transformer.transform(source, result);
return true;
} catch (TransformerException ex) {
Logger.getLogger(DOMUtil.class.getName()).log(Level.SEVERE, null, ex);
}
return false;
}
/**
* Crea un rbol DOM vaco.
* @param etiquetaRaiz Nombre de la etiqueta raz del rbol DOM, donce
* estar contenida el resto del documento.

58

DAW

DesarrollodeAplicacionesWeb

Tema8

* @return Retornar el documento creado o null si se ha producido algn


* error.
*/
public static Document crearDOMVacio(String etiquetaRaiz)
{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db;
try {
db = dbf.newDocumentBuilder();
Document d=db.newDocument();
d.appendChild(d.createElement(etiquetaRaiz));
return d;
} catch (ParserConfigurationException ex) {
Logger.getLogger(DOMUtil.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
}

12.3.ManipulacindedocumentosXML.(I)
Bien,ahorasabescargarundocumentoXMLaDOMydeDOMaXML,pero,cmosemodificael
rbolDOM?Cmoyasedijoantes,unrbolDOMesunaestructuraenrbol,jerrquicacomocabe
esperar,formadapornodosdediferentestipos.ElfuncionamientodelmodelodeobjetosDOMes
establecido por el organismo W3C, lo cual tiene una gran ventaja, el modelo es prcticamente el
mismoentodosloslenguajesdeprogramacin.
EnJava,prcticamentetodaslasclasesquevasanecesitarparamanipularunrbolDOMestnenel
paquete org.w3c.dom. Si vas a hacer un uso muy intenso de DOM es conveniente que hagas una
importacindetodaslasclasesdeestepaquete(importorg.w3c.dom.*;).
Tras convertir un documento XML a DOM lo que obtenemos es una instancia de la clase
org.w3c.dom.Document. Esta instancia ser el nodo principal que contendr en su interior toda la
jerarqua del documento XML. Dentro de un documento o rbol DOM podremos encontrar los
siguientestiposdeclases:
9 org.w3c.dom.Node (Nodo) . Todos los objetos contenidos en el rbol DOM son nodos. La clase
Document estambinuntipodenodo,consideradoelnodoprincipal.
9 org.w3c.dom.Element
(Elemento) .
Corresponde con cualquier par de etiquetas
( <pedido></pedido> )ytodosucontenido(atributos,texto,subetiquetas,etc.).
9 org.w3c.dom.Attr (Atributo) .Correspondeconcualquieratributo.
9 org.w3c.dom.Comment (Comentario) .Correspondeconuncomentario.
9 org.w3c.dom.Text (Texto) .Correspondeconeltextoqueencontramosdentrodedosetiquetas.
A qu te eran familiares? Claro que s. Estas clases tendrn diferentes mtodos para acceder y
manipular la informacin del rbol DOM. A continuacin vamos a ver las operaciones ms
importantessobreunrbolDOM.
Entodoslosejemplos,doccorrespondeconunainstanciadelaclase Document .
Obtenerelelementorazdeldocumento.
Como ya sabes, los documentos XML deben tener obligatoriamente un nico elemento
( <pedido></pedido> porejemplo),consideradoelelementoraz,dentrodelcualestelrestodela
informacin estructurada de forma jerrquica. Para obtener dicho elemento y poder manipularlo
podemosusarelmtodo getDocumentElement .
Element raiz=doc.getDocumentElement();

Buscarunelementoentodalajerarquadeldocumento.
Para realizar esta operacin se puede usar el mtodo getElementsByTagName disponible tanto en la
clase Document como en la clase Element . Dicha operacin busca un elemento por el nombre de la
etiquetayretornaunalistadenodos( NodeList )quecumplenconlacondicin.Siseusaenlaclase
Element , solo buscar entre las subetiquetas (subelementos) de dicha clase (no en todo el
documento).
NodeList nl=doc.getElementsByTagName("cliente");
Element cliente;
if (nl.getLength()==1) cliente=(Element)n2.item(0);

59

Aplicacindelasestructurasdealmacenamiento

DAW

Elmtodo getLength() delaclase NodeList ,permiteobtenerelnmerodeelementos(longituddela


lista)encontradoscuyonombredeetiquetaescoincidente.Elmtodo item permiteaccederacada
uno de los elementos encontrados, y se le pasa por argumento el ndice del elemento a obtener
(empezando por cero y acabando por longitud menos uno). Fijate que es necesario hacer una
conversindetiposdespusdeinvocarelmtodo item .Estoesporquelaclase NodeList almacena
unlistadodenodos( Node ),sindiferenciareltipo.

Dado el siguiente cdigo XML: <pedido><!--Datos


elementos DOM encontramos en el mismo.

del

pedido--></pedido>

indica que

org.w3c.dom.Element

org.w3c.dom.Node

org.w3c.dom.Text

org.w3c.dom.Comment

12.3.1.ManipulacindedocumentosXML.(II)
YqumsoperacionespuedorealizarsobreunrbolDOM?Vemoslas.
Obtenerlalistadehijosdeunelementoyprocesarla.
Setratadeobtenerunalistaconlosnodoshijodeunelementocualquiera,estospuedenserunsub
elemento (subetiqueta) o texto. Para sacar la lista de nodos hijo se puede usar el mtodo
getChildNodes :
NodeList nl=doc.getDocumentElement().getChildNodes();
for (int i=0; i<nl.getLength();i++) {
Node n=nl.item(i);
switch (n.getNodeType()){
case Node.ELEMENT_NODE: Element e=(Element)n;
System.out.println("Etiqueta:" + e.getTagName());
break;
case Node.TEXT_NODE: Text t=(Text)n;
System.out.println("Texto:" + t.getWholeText());
break;
}
}

Enelejemploanteriorseusanvariosmtodos.Elmtodo getNodeType() delaclaseNodepermite


saber de que tipo de nodo se trata, generalmente texto ( Node.TEXT_NODE ) o un subelemento
( Node.ELEMENT_NODE ). De esta forma podremos hacer la conversin de tipos adecuada y gestionar
cadaelementosegncorresponda.Tambinseusaelmtodo getTagName aplicadoaunelemento,
locualpermitirobtenerelnombredelaetiqueta,yelmtodo getWholeText aplicadoaunnodo
detipotexto( Text ),quepermiteobtenereltextocontenidoenelnodo.
Aadirunnuevoelementohijoaotroelemento.
Hemosvistocomomirar quehay dentrodeun documentoXMLperonohemosvistocomoaadir
cosasadichodocumento.ParaaadirunsubelementoountextoaunrbolDOM,primerohayque
crearlosnodoscorrespondientesydespusinsertarlosenlaposicinquequeramos.Paracrearun
nuevopardeetiquetasoelemento( Element )yunnuevonodotexto( Text ),lopodemoshacerdela
siguienteforma:
Element dirTag=doc.createElement("Direccion_entrega")
Text dirTxt=doc.createTextNode("C/Perdida S/N");

Ahoraloshemoscreado,perotodavanoloshemosinsertadoeneldocumento.Paraellopodemos
hacerlousandoelmtodo appendChild queaadirelnodo(seadeltipoquesea)alfinaldelalistade
hijosdelelementocorrespondiente:
dirTag.appendChild(dirTxt);
doc.getDocumentElement().appendChild(dirTag);

60

DesarrollodeAplicacionesWeb

Tema8

Enelejemploanterior,eltextoseaadecomohijodelaetiquetaDireccion_entrega,yasuvez,la
etiquetaDireccion_entregaseaadecomohijo,alfinaldeltodo,delaetiquetaoelementorazdel
documento. Aparte del mtodo appendChild , que siempre insertar al final, puedes utilizar los
siguientes mtodos para insertar nodos dentro de un arbol DOM (todos se usan sobre la clase
Element):
9 insertBefore (Node nuevo, Node referencia) . Insertar un nodo nuevo antes del nodo de
referencia.
9 replaceChild (Node nuevo, Node anterior) .Sustituyeunnodo(anterior)porunonuevo.

EnelsiguienteenlaceencontrarsaladocumentacindelAPIdeDOMparaJava,contodas
lasfuncionesdecadaclase.
http://docs.oracle.com/javase/1.4.2/docs/api/org/w3c/dom/packagesummary.html
12.3.2.ManipulacindedocumentosXML.(III)
SeguimosconlasoperacionessobrerbolesDOM.Sabrascmoeliminarnodosdeunrbol?No?
Vamosadescubrirlo.
Eliminarunelementohijodeotroelemento.
Paraeliminarunnodo,hayquerecurriralnodopadrededichonodo.Enelnodopadreseinvocael
mtodo removeChild ,alqueselepasalainstanciadelaclase Element conelnodoaeliminar(noel
nombre de la etiqueta, sino la instancia), lo cual implica que primero hay que buscar el nodo a
eliminar,ydespuseliminarlo.Veamosunejemplo:
NodeList nl3=doc.getElementsByTagName("Direccion_entrega");
for (int i=0;i<nl3.getLength();i++){
Element e=(Element)nl3.item(i);
Element parent=(Element)e.getParentNode();
parent.removeChild(e);
}

En el ejemplo anterior se eliminan todos las etiquetas, estn donde estn, que se llamen
Direccion_entrega. Para ello ha sido necesario buscar todos los elementos cuya etiqueta sea esa
(comoseexplicoenejemplosanteriores),recorrerlosresultadosobtenidosdelabsqueda,obtener
el nodo padre del hijo a travs del mtodo getParentNode , para as poder eliminar el nodo
correspondienteconelmtodo removeChild .
Noesobligatorioobviamenteinvocaralmtodo getParentNode sielnodopadreesconocido.Por
ejemplo,sielnodoesunhijodelelementooetiquetaraz,hubierabastadoconponerlosiguiente:
doc.getDocumentElement().removeChild(e);

Cambiarelcontenidodeunelementocuandosoloestexto.
Los mtodos getTextContent y setTextContent , aplicado a un elemento, permiten respectivamente
acceder al texto contenido dentro de un elemento o etiqueta. Tienes que tener cuidado, porque
utilizar setTextContent significa eliminar cualquier hijo (subelemento por ejemplo) que
previamentetuvieralaetiqueta.Ejemplo:
Element nuevo=doc.createElement("direccion_recogida").setTextContent("C/Del Medio S/N");
System.out.println(nuevo.getTextContent());

De los siguientes tipos de nodos, marca aquellos en los que no se pueda ejecutar dos
veces el mtodo appendChild :

Document

Element

Text

Attr

61

Aplicacindelasestructurasdealmacenamiento

DAW

12.3.3.ManipulacindedocumentosXML.(IV)
Caso prctico.
El documento XML que tiene que generar Ana tiene que seguir un formato especfico, para que la
otra aplicacin sea capaz de entenderlo. Esto significa que los nombres de las etiquetas tienen que
ser unos concretos para cada dato del pedido. Esta ha sido quizs la parte que ms complicada, ver
como encajar cada dato del mapa con su correspondiente etiqueta en XML, pero ha conseguido
resolverlo de forma elegante. De hecho, ya ha terminado su tarea, quieres ver el resultado?
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import

java.io.BufferedReader;
java.io.FileNotFoundException;
java.io.FileReader;
java.io.IOException;
java.util.ArrayList;
java.util.Collections;
java.util.HashMap;
java.util.List;
java.util.Map;
java.util.Scanner;
java.util.logging.Level;
java.util.logging.Logger;
java.util.regex.Matcher;
java.util.regex.Pattern;
org.w3c.dom.*;

/*
* Clase destinada a almacenar los datos de un artculo.
*/
class Articulo implements Comparable<Articulo>{
public String codArticulo;
public String descripcion;
public int cantidad;
@Override
public int compareTo(Articulo o) {
return codArticulo.compareTo(o.codArticulo);
}
}

/* Clase que se encarga de procesar un pedido.


* El archivo con el pedido debe estar en codificacin UTF8, sino no funciona
* bien.
* Tu sistema debe soportar de forma nativa la coficacin UTF8, sino no
* funcionar del todo bien.
*/
public class ProcesarArchivo3 {
/* Entrada contendr una instancia de la clase Scanner que permitir
leer las teclas pulsadas desde teclado */
static Scanner entrada = new Scanner(System.in);
/* Definimos las expresiones regulares que usaremos una y otra vez para
cada lnea del pedido. La expresin regular "seccion" permite detectar
si hay un comienzo o fin de pedido, y la expresin campo, permite detectar
si hay un campo con informacin del pedido. */
static Pattern seccion = Pattern.compile("^##[ ]*(FIN)?[ ]*(PEDIDO|ARTICULOS)[ ]*##$");
static Pattern campo = Pattern.compile("^(.+):.*\\{(.*)\\}$");
static Pattern articulo = Pattern.compile ("^\\{(.*)\\|(.*)\\|[ ]*([0-9]*)[ ]*\\}$");
public static void main(String[] args) {
BufferedReader lector;
ArrayList<Articulo> Articulos=new ArrayList<Articulo>();
HashMap<String,String> DatosPedido=new HashMap<String,String>();
/*
* 1er paso: cargamos el archivo para poder procesarlo lnea a lnea
* para ello nos apoyamos en la clase BufferedReader, que con el mtodo
* readLine nos permite recorrer todo el archivo lnea a lnea.
*/
if (args.length > 0) {
lector = cargarArchivo(args[0]);
} else {
lector = cargarArchivo();
}

62

DesarrollodeAplicacionesWeb

Tema8

if (lector == null) {
/* Si no se ha podido cargar el archivo, no contina con el
* procesado, simplemente termina la ejecucin. */
System.out.println("No se ha podido cargar el archivo.");
} else {
/* 2 Paso: si ha podido cargar el archivo, contina el procesado
* de lnea a lnea. */
String linea;
try {
linea = lector.readLine();
while (linea != null) {
procesarLinea(linea,DatosPedido,Articulos);
linea = lector.readLine();
}
} catch (IOException ex) {
System.out.println("Error de entrada y salida.");
}
// 3er paso: Ordenamos los artculos por cdigo.
Collections.sort(Articulos);

/* 4er Paso: Pasamos el pedido a rbol DOM. */


// Creamos un rbol DOM vacio
Document doc=DOMUtil.crearDOMVacio("pedido");
// Pasamos los datos del pedido al DOM
pasarPedidoAXML(doc, DatosPedido, Articulos);
// Guardamos el XML en un archivo:
String salida;
if (args.length>1) salida=args[1];
else {
System.out.print("Introduce el archivo de salida: ");
salida=entrada.nextLine();
}
DOMUtil.DOM2XML(doc,salida);
}
}
/**
* Procesa una lnea del archivo de pedido para detectar que es y
* extraer la informacin que contiene.
* @param linea
* @param datosPedido Mapa en el que ir metiendo la informacin del pedido.
* La llave del mapa ser el nombre del campo.
* @param articulos Lista en la que se irn metiendo los artculos del pedido.
* @return true si la lnea contiene informacin que corresponde al formato
* esperado, false en caso contrario.
*/
static boolean procesarLinea(String linea, Map<String,String> datosPedido,
List<Articulo> articulos) {
Matcher deteccionSeccion = seccion.matcher(linea);
Matcher deteccionCampo = campo.matcher(linea);
Matcher deteccionArticulo= articulo.matcher(linea);
/* Si el patrn coincide con el de un indicador de comienzo del pedido
* o de la seccin con el listado de artculos, se ejecutar este trozo
* de cdigo, pues habr encontrado el patrn. No hace nada,
* simplemente lo detecta para as no informar de algo raro.
*/
if (deteccionSeccion.matches()) {
return true;
}
/* Si el patrn coincide con el de un campo con datos del pedido
entonces meter tanto el campo como el valor en el mapa.*/
else if (deteccionCampo.matches()) {
datosPedido.put(deteccionCampo.group(1).trim().toLowerCase(),
deteccionCampo.group(2).trim());
return true;
}
/* Si el patrn coincide con el de un artculo, entonces
guardar los datos del pedido en una clase articulo y lo meter
en la lista de artculos.*/
else if (deteccionArticulo.matches())
{
Articulo n=new Articulo();
n.codArticulo=deteccionArticulo.group(1).trim();

63

Aplicacindelasestructurasdealmacenamiento

DAW

n.descripcion=deteccionArticulo.group(2).trim();
n.cantidad=Integer.parseInt(deteccionArticulo.group(3));
articulos.add(n);
return true;
}
else { System.out.println("Cuidado! Lnea no procesable: "+linea); return false; }
}
/**
* cargarArchivo crear una instancia de la clase BufferedReader que
* permitir leer lnea a lnea el archivo de texto. Si no se ha podido
* cargar el archivo retornar null.
* @param name Nombre del archivo a cargar. si el nombre del archivo no
* se ha pasado por parmetro (valor null) se pedir al usuario que lo
* introduzca.
* @return null si no ha podido cargar el archivo, o la instancia de la
* clase BufferedReader si dicho archivo se ha podido cargar.
*/
static BufferedReader cargarArchivo(String name) {
String nombreArchivo = name;
BufferedReader reader = null;
if (name == null) {
System.out.print("Introduce el nombre del archivo con el pedido: ");
nombreArchivo = entrada.nextLine();
}
try {
FileReader f =new FileReader(nombreArchivo);
reader = new BufferedReader(f);
} catch (FileNotFoundException ex) {
Logger.getLogger(ProcesarArchivo3.class.getName()).log(Level.SEVERE, null, ex);
}
return reader;
}
/**
* Igual que el mtodo BufferedReader cargarArchivo(String name), pero
* que siempre le pedir al usuario que lo introduzca.
* @return null si no ha podido cargar el archivo, y una instancia de BufferedReader
* en otro caso.
*/
static BufferedReader cargarArchivo() {
return cargarArchivo(null);
}
/**
* Funcin que pasa los datos del pedido, almacendos en un mapa y
* una lista, a un documento XML.
* @param doc Documento DOM donde se almacenar toda la informacin.
* @param datosPedido Mapa con los datos del pedido.
* @param articulos Lista con los artculos del pedido.
*/
static void pasarPedidoAXML(Document doc,
Map<String,String> datosPedido,
List<Articulo> articulos)
{
for (String key:datosPedido.keySet())
{
//Eliminamos espacios y acentos de cada llave para que no haya problemas de
chequeo
Element e=null;
String key2=key.trim().replaceAll("\\s", "_").toLowerCase();
key2=key2.replace("", "a");
key2=key2.replace("", "e");
key2=key2.replace("", "i");
key2=key2.replace("", "o");
key2=key2.replace("", "u");
if (key2.equals("nombre_del_contacto"))
e=doc.createElement("contacto");
else if (key2.equals("forma_de_pago"))
e=doc.createElement("formaPago");
else if (key2.equals("direccion_de_factura"))
e=doc.createElement("dirFacturacion");
else if (key2.equals("correo_electronico_del_contacto"))
e=doc.createElement("mail");
else if (key2.equals("codigo_del_cliente"))
e=doc.createElement("codClient");
else if (key2.equals("cliente"))

64

DesarrollodeAplicacionesWeb

Tema8

e=doc.createElement("nombreCliente");
else if (key2.equals("numero_de_pedido"))
e=doc.createElement("numPedido");
else if (key2.equals("telefono_del_contacto"))
e=doc.createElement("telefono");
else if (key2.equals("fecha_preferente_de_entrega"))
e=doc.createElement("fechaPrefEntrega");
else if (key2.equals("direccion_de_entrega"))
e=doc.createElement("dirEntrega");
if (e!=null) {
e.setTextContent(datosPedido.get(key));
doc.getDocumentElement().appendChild(e);
}
else
{
Comment c=doc.createComment("Error procesando "+ key2);
doc.getDocumentElement().appendChild(c);
}
}
Element arts=doc.createElement("listaArticulos");
for (Articulo a:articulos)
{
Element art=doc.createElement("articulo");
art.setAttribute("codArticulo", a.codArticulo);
art.setAttribute("cantidad", a.cantidad+"");
art.setTextContent(a.descripcion);
arts.appendChild(art);
}
doc.getDocumentElement().appendChild(arts);
}
}

Yyasoloquedaunacosa,descubrircomomanejarlosatributosenunrbolDOM.
Atributosdeunelemento.
Porltimo,lomsfcil.Cualquierelementopuedecontenerunoovariosatributos.Accederaellos
essencillisimo,solonecesitamostresmtodos:
setAttribute paraestablecerocrearelvalordeunatributo, getAttribute paraobtenerelvalorde
unatributoy removeAttribute paraeliminarelvalordeunatributo.Veamosunejemplo:
doc.getDocumentElement().setAttribute("urgente","no");
System.out.println(doc.getDocumentElement().getAttribute("urgente"));

En el ejemplo anterior se aade el atributo urgente al elemento raz del documento con el valor
no, despus se consulta para ver su valor. Obviamente se puede realizar en cualquier otro
elementoquenoseaelraz.Paraeliminarelatributoestansencillocomolosiguiente:
doc.getDocumentElement().removeAttribute("urgente");

65

TEMA9

INDICE
1.Relacionesentreclases......................................................................................................................4
1.1.Composicin...............................................................................................................................................5
1.2.Herencia......................................................................................................................................................6
1.3.Herenciaocomposicin?..........................................................................................................................7
2Composicin.......................................................................................................................................9
2.1.Sintaxisdelacomposicin..........................................................................................................................9
Ejercicioresuelto...............................................................................................................................................................9
2.2.Usodelacomposicin(I).Preservacindelaocultacin.........................................................................11
Ejercicioresuelto.............................................................................................................................................................12
2.2.1.Usodelacomposicin(II).Llamadasaconstructores..........................................................................................13
Ejercicioresuelto.............................................................................................................................................................14
2.3.Clasesanidadasointernas........................................................................................................................15
3.Herencia...........................................................................................................................................17
3.1.Sintaxisdelaherencia..............................................................................................................................18
Ejercicioresuelto.............................................................................................................................................................18
3.2.Accesoamiembrosheredados.................................................................................................................19
Ejercicioresuelto.............................................................................................................................................................19
3.3.Utilizacindemiembrosheredados(I).Atributos....................................................................................20
Ejercicioresuelto.............................................................................................................................................................20
3.3.1Utilizacindemiembrosheredados(II).Mtodos................................................................................................22
Ejercicioresuelto.............................................................................................................................................................23
3.4.Redefinicindemtodosheredados........................................................................................................24
Ejercicioresuelto.............................................................................................................................................................25
3.5.Ampliacindemtodosheredados..........................................................................................................26
Ejercicioresuelto.............................................................................................................................................................26
3.6.Constructoresyherencia..........................................................................................................................27
Ejercicioresuelto.............................................................................................................................................................28
3.7.Creacinyutilizacindeclasesderivadas................................................................................................28
3.8.LaclaseObjectenJava.............................................................................................................................28
3.9.Herenciamltiple......................................................................................................................................29
4.Clasesabstractas..............................................................................................................................31
4.1.Declaracindeunaclaseabstracta..........................................................................................................32
Ejercicioresuelto.............................................................................................................................................................32
4.2.Mtodosabstractos..................................................................................................................................33
Ejercicioresuelto.............................................................................................................................................................34
4.3.Clasesymtodosfinales...........................................................................................................................35
5.Interfaces.........................................................................................................................................37
5.1.Conceptodeinterfaz.................................................................................................................................38
5.1.1.Claseabstractaointerfaz?.................................................................................................................................39
5.2.Definicindeinterfaces............................................................................................................................40
Ejercicioresuelto.............................................................................................................................................................41
5.3.Implementacindeinterfaces..................................................................................................................41
Ejercicioresuelto.............................................................................................................................................................42
5.3.1.Unejemplodeimplementacindeinterfaces:lainterfazActionListener...........................................................44
5.4.Simulacindelaherenciamltiplemedianteelusodeinterfaces..........................................................47
Ejercicioresuelto.............................................................................................................................................................48
5.5.Herenciadeinterfaces..............................................................................................................................48
Ejercicioresuelto.............................................................................................................................................................49
6.Polimorfismo....................................................................................................................................50
6.1.Conceptodepolimorfismo.......................................................................................................................51
6.2.Ligaduradinmica.....................................................................................................................................52
Ejercicioresuelto.............................................................................................................................................................52
6.3.Limitacionesdelaligaduradinmica........................................................................................................53

Utilizacinavanzadadeclases

DAW

Ejercicioresuelto............................................................................................................................................................54

6.4.Interfacesypolimorfismo.........................................................................................................................55
6.5.Conversindeobjetos..............................................................................................................................56

DesarrollodeAplicacionesWeb

Tema9

UTILIZACINAVANZADADECLASES.
CASO PRCTICO.
En las ltimas semanas, Mara y Juan han avanzado muchsimo a lo largo de su recorrido por las
estructuras de almacenamiento y las interfaces grficas, pero Mara es consciente de que an
quedan cosas por ver en lo que respecta a la Programacin Orientada a Objetos. An recuerda que
cuando aprendi a escribir sus propias clases, con sus atributos (propiedad o informacin especfica contenida
en el interior de un objeto) y sus mtodos (Elementos de una clase u objeto compuestos por una serie de sentencias que
sirven para describir las acciones a realizar con esa clase u objeto), se quedaron muchos conceptos sin terminar
de aclarar y que seran estudiados ms adelante: utilizacin de la herencia (mecanismo mediante el cual
una clase puede derivar de otra (clase base, clase padre o superclase) de manera que se extiende la funcionalidad de la
primera (especializacin)), creacin de interfaces (una especie de clase especial donde todos sus mtodos son
declarados como abstract (mtodos abstractos). Es misin del programador implementar sus correspondientes mtodos),
clases abstractas (una clase que contiene al menos un mtodo abstracto. Para declarar una clase abstracta en Java se
utiliza el modificador abstract ), jerarquas de clases, etc.

Ambos saben que faltan unos cuantos conceptos por asimilar y que sin duda les van a proporcionar
ms herramientas a la hora de desarrollar sus proyectos. En realidad, muchas de estas nociones ya
las han intuido al trabajar con las bibliotecas de clases de la API (interfaz de programacin de aplicaciones o
API (del ingls Application Programming Interface) consiste en el conjunto de clases, interfaces, mtodos, funciones,
constantes, etc. que ofrece cierta biblioteca para ser utilizado por otro software como una capa de abstraccin) de Java y en

cierto modo ya las han utilizado. Parece que ha llegado el momento de formalizar algunos de estos
conocimientos para poder emplearlos en sus programas.

Utilizacinavanzadadeclases

DAW

1.Relacionesentreclases.
Cuando estudiaste el concepto de clase, sta fue descrita como una especie de mecanismo de
definicin(plantillas),enelquesebasaraelentornodeejecucinalahoradeconstruirunobjeto:
unmecanismodedefinicindeobjetos.

Portanto,alahoradedisearunconjuntodeclasesparamodelarelconjuntodeinformacincuyo
tratamientosedeseaautomatizar,esimportanteestablecerapropiadamentelasposiblesrelaciones
quepuedanexistirentreunasclasesyotras.

En algunos casos es posible que no exista relacin alguna entre unas clases y otras, pero lo ms
habitualesquesexista:unaclasepuedeserunaespecializacin(Relacinentredosclasesdondeunadeellas(la
subclase) es una versin ms especializada que la otra (la superclase), compartiendo caractersticas en comn pero aadiendo ciertas
caractersticas especficas que la especializan. El punto de vista inverso sera la generalizacin) de otra, o bien una
generalizacin(Relacinentredosclases donde una deellas(lasuperclase)es una versinmsgenrica quela otra (la subclase),
compartiendocaractersticasencomnperosinlaspropiedadesespecficasquecaracterizanalasubclase.Elpuntodevistainversoserala
especializacin), o una clase contiene en su interior objetos de otra, o una clase utiliza a otra, etc. Es
decir,queentreunasclasesyotrashabrquedefinirculessurelacin(siesqueexistealguna).

Sepuedendistinguirdiversostiposderelacionesentreclases:
9 Clientela. Cuando una clase utiliza objetos de otra clase (por ejemplo al pasarlos como
parmetrosatravsdeunmtodo).
9 Composicin.Cuandoalgunodelosatributosdeunaclaseesunobjetodeotraclase.
9 Anidamiento.Cuandosedefinenclasesenelinteriordeotraclase.
9 Herencia. Cuando una clase comparte determinadas caractersticas con otra (clase base),
aadindolealgunafuncionalidadespecfica(especializacin).

LarelacindeclientelalallevasutilizandodesdequehasempezadoaprogramarenJava,puesdesde
tu clase principal (clase con mtodo main ) has estado declarando, creando y utilizando objetos de
otras clases. Por ejemplo: si utilizas un objeto String dentro de la clase principal de tu programa,
ste ser cliente de la clase String (como suceder con prcticamente cualquier programa que se
escribaenJava).Eslarelacinfundamentalymshabitualentreclases(lautilizacindeunasclases
porpartedeotras)y,porsupuesto,laquemsvasautilizarttambin,dehecho,yalahasestado
utilizandoyloseguirshaciendo.

La relacin de composicin es posible que ya la hayas tenido en cuenta si has definido clases que
contenan (tenan como atributos) otros objetos en su interior, lo cual es bastante habitual. Por
ejemplo,siescribesunaclasedondealgunodesusatributosesunobjetodetipo String ,yaseest
produciendounarelacindetipocomposicin(tuclasetieneun String ,esdecir,estcompuesta
porunobjeto String yporalgunoselementosms).

Larelacindeanidamiento(oanidacin)esquizmenoshabitual,puesimplicadeclararunasclases
dentrodeotras(clasesinternasoanidadas).Enalgunoscasospuederesultartilparatenerunnivel
msdeencapsulamiento(ocultamientodelestadodeunobjeto(desusdatosmiembrooatributos)demaneraqueslosepuede
cambiarmediantelasoperaciones(mtodos)definidasparaeseobjeto.Cadaobjetoestaisladodelexteriordemaneraqueseprotegenlos
datoscontrasumodificacinporquiennotengaderechoaaccederaellos,eliminandoefectossecundariosycolateralesnodeseados.Este
mododeprocederpermitequeelusuariodeunaclasepuedaobviarlaimplementacindelosmtodosypropiedadesparaconcentrarse
sloencmousarlos.Porotroladoseevitaqueelusuariopuedacambiarsuestadodemaneraimprevistaeincontrolada)yocultacin

(efectoqueseconsiguegraciasalaencapsulacin:seevitalavisibilidaddedeterminadosmiembrosdeunaclasealrestodelcdigodel
programaparadeesemodocomunicarseconlosobjetosdelaclasenicamenteatravsdesuinterfaz(mtodos))deinformacin.
En el caso de la relacin de herencia tambin la has visto ya, pues seguro que has utilizado unas
clases que derivaban de otras, sobre todo, en el caso de los objetos que forman parte de las
interfacesgrficas.Lomsprobableesquehayastenidoquedeclararclasesquederivabandealgn
componentegrfico(JFrame,JDialog,etc.).

DesarrollodeAplicacionesWeb

Tema9

Podradecirsequetantolacomposicincomolaanidacinsoncasosparticularesdeclientela,pues
enrealidadentodosesoscasosunaclaseesthaciendousodeotra(alconteneratributosqueson
objetos de la otra clase, al definir clases dentro de otras clases, al utilizar objetos en el paso de
parmetros,aldeclararvariableslocalesutilizandootrasclases,etc.).

Alolargodelaunidad,irsviendodistintasposibilidadesdeimplementacindeclaseshaciendouso
de todas estas relaciones, centrndonos especialmente en el caso de la herencia, que es la que
permiteestablecerlasrelacionesmscomplejas.

Cul crees que ser la relacin entre clases ms habitual?


Clientela
Anidacinoanidamiento
Herencia
Entrelasclasesnoexistenrelaciones.Sonentidadesaisladasenelsistemaysinrelaciones
conelexterior

1.1.Composicin
Cuandoenunsistemadeinformacin,unadeterminadaentidadAcontieneaotraBcomounadesus
partes,sesueledecirqueseestproduciendounarelacindecomposicin.Esdecir,elobjetodela
claseAcontieneaunoovariosobjetosdelaclaseB.

Porejemplo,sidescribesunaentidadPascompuestaporunaseriedeatributos,entreloscualesse
encuentra una lista de comunidades autnomas, podras decir que los objetos de la clase Pas
contienen varios objetos de la clase ComunidadAutonoma. Por otro lado, los objetos de la clase
ComunidadAutonomapodrancontenercomoatributosobjetosdelaclaseProvincia,lacualasuvez
tambinpodracontenerobjetosdelaclaseMunicipio.

Comopuedesobservar,lacomposicinpuedeencadenarsetodaslasvecesqueseanecesariohasta
llegaraobjetosbsicosdellenguajeohastatiposprimitivosqueyanocontendrnotrosobjetosen
su interior. sta es la forma ms habitual de definir clases: mediante otras clases ya definidas
anteriormente.Esunamaneraeficienteysencilladegestionarlareutilizacindetodoelcdigoya
escrito. Si se definen clases que describen entidades distinguibles y con funciones claramente
definidas, podrn utilizarse cada vez que haya que representar objetos similares dentro de otras
clases.

Lacomposicinsedacuandounaclasecontienealgnatributoqueesunareferenciaaunobjeto
deotraclase.

UnaformasencilladeplanteartesilarelacinqueexisteentredosclasesAyBesdecomposicin
podrasermediantelaexpresinidiomticatieneun:laclaseAtieneunoovariosobjetosdela
claseB,ovistodeotromodo:ObjetosdelaclaseBpuedenformarpartedelaclaseA.

Algunosejemplosdecomposicinpodranser:
9 Uncochetieneunmotorytienecuatroruedas.
9 Una persona tiene un nombre, una fecha de nacimiento, una cuenta bancaria asociada para
ingresarlanmina,etc.
9 Un cocodrilo bajo investigacin cientfica que tiene un nmero de dientes determinado, una
edad,unascoordenadasdeubicacingeogrfica(medidasconGPS),etc.

Utilizacinavanzadadeclases

DAW

Recuperandoalgunosdelosejemplosdeclasesquehasutilizadoenotrasunidades:
9 Una clase Rectangulo podra contener en su interior dos objetos de la clase Punto para
almacenarlosvrticesinferiorizquierdoysuperiorderecho.
9 UnaclaseEmpleadopodracontenerensuinteriorunobjetodelaclaseDNIparaalmacenarsu
DNI/NIF,yotroobjetodelaclaseCuentaBancariaparaguardarlacuentaenlaqueserealizanlos
ingresosennmina.
9 Unaclase JFrame (javax.Swing.JFrame)delainterfazgrficacontieneensuinteriorreferenciasa
objetosdelasclases JRootPane , JMenuBar o JLayeredPane ,puescontienemens,paneles,etc.

PodradecirsequelarelacinqueexisteentrelaclaseAveylaclaseLoroesunarelacin
decomposicin?
No.Aunqueclaramenteexistealgntipoderelacinentreambas,noparecequesealade
composicin.Noparecequesecumplalaexpresintieneun:Unlorotieneunave.Se
cumpliramsbienunaexpresindeltipoesun:Unloroesunave.Algunosobjetosque
cumpliranlarelacindecomposicinpodranserPicooAlas,puesunlorotieneunpicoy
dosalas,delmismomodoqueunavetienepicoydosalas.Estetipoderelacinparece
msdeherencia(unloroesuntipodeave).

1.2.Herencia
El mecanismo que permite crear clases basndose en otras que ya existen es conocido como
herencia. Como ya has visto en unidades anteriores, Java implementa la herencia mediante la
utilizacindelapalabrareservada extends .

Elconceptodeherenciaesalgobastantesimpleysinembargomuypotente:cuandosedeseadefinir
unanuevaclaseyyaexistenclasesque,dealgunamanera,implementanpartedelafuncionalidad
que se necesita, es posible crear una nueva clase derivada de la que ya tienes. Al hacer esto se
posibilitalareutilizacindetodoslosatributosymtodosdelaclasequesehautilizadocomobase
(clasepadreosuperclase),sinlanecesidaddetenerqueescribirlosdenuevo.

Una subclase hereda todos los miembros de su clase padre (atributos, mtodos y clases internas).
Losconstructoresnoseheredan,aunquesepuedeninvocardesdelasubclase.

Algunosejemplosdeherenciapodranser:
9 Uncocheesunvehculo(heredaratributoscomolavelocidadmximaomtodoscomoparary
arrancar).
9 Unempleadoesunapersona(heredaratributoscomoelnombreolafechadenacimiento).
9 Un rectngulo es una figura geomtrica en el plano (heredar mtodos como el clculo de la
superficieodesupermetro).
9 Uncocodriloesunreptil(heredaratributoscomoporejemploelnmerodedientes).

Enestecasolaexpresinidiomticaquepuedesusarparaplanteartesieltipoderelacinentredos
clases A y B es de herencia podra ser es un: la clase A es un tipo especfico de la clase B
(especializacin),ovistodeotromodo:laclaseBesuncasogeneraldelaclaseA(generalizacin).

Recuperandoalgunosejemplosdeclasesqueyahasutilizadoenotrasunidades:
9 Unaventanaenunaaplicacingrficapuedeserunaclasequeheredede JFrame (componente
Swing: javax.swing.JFrame ),deestamaneraesaclaseserunmarcoquedispondrdetodoslos
mtodos y atributos de JFrame mas aqullos que t decidas incorporarle al rellenarlo de
componentesgrficos.

DesarrollodeAplicacionesWeb
9

Una caja de dilogo puede ser un tipo de


javax.swing.JDialog ).

Tema9
JDialog

(otro componente

Swing:

En Java, la clase Object (dentro del paquete java.lang ) define e implementa el comportamiento
comnatodaslasclases(incluidasaquellasquetescribas).Comorecordars,yasedijoqueenJava
cualquier clase deriva en ltima instancia de la
clase Object .

Todas las clases tienen una clase padre, que a


su vez tambin posee una superclase, y as
sucesivamentehastallegaralaclase Object .De
estamanera,seconstruyeloquehabitualmente
seconocecomounajerarquadeclases,queen
elcasodeJavatendraalaclase Object enlaraz.

Cuando escribas una clase en Java, puedes hacer que herede de una determinada clase
padre(medianteelusodeextends)obiennoindicarningunaherencia.Entalcasotuclase
noheredardeningunaotraclaseJava.VerdaderooFalso?
No es cierto. Aunque no indiques explcitamente ningn tipo de herencia, el compilador
asumirentoncesdemaneraimplcitaquetuclaseheredadelaclase Object ,quedefinee
implementaelcomportamientocomnatodaslasclases.

1.3.Herenciaocomposicin?
Cuandoescribastuspropiasclases,debesintentartenerclaroenqucasosutilizarlacomposiciny
cundolaherencia:

9 Composicin: cuando una clase est formada por objetos de otras clases. En estos casos se
incluyenobjetosdeesasclases,perononecesariamentesecompartencaractersticasconellos
(noseheredancaractersticasdeesosobjetos,sinoquedirectamenteseutilizarnsusatributosy
susmtodos).Esosobjetosincluidosnosonmsqueatributosmiembrosdelaclasequeseest
definiendo.
9 Herencia: cuando una clase cumple todas las caractersticas de otra. En estos casos la clase
derivada es una especializacin (o particularizacin, extensin o restriccin) de la clase base.
Desdeotropuntodevistasediraquelaclasebaseesunageneralizacindelasclasesderivadas.

Por ejemplo, imagina que dispones de una clase Punto (ya la has
utilizadoenotrasocasiones)ydecidesdefinirunanuevaclasellamada
Crculo.Dadoqueunpuntotienecomoatributossuscoordenadasen
plano(x1,y1),decidesqueesbuenaideaaprovecharesainformacin
e incorporarla en la clase Circulo que ests escribiendo. Para ello
utilizas la herencia, de manera que al derivar la clase Crculo de la
clase Punto, tendrs disponibles los atributos x1 e y1. Ahora solo
faltaraaadirlealgunosatributosymtodosmscomoporejemploel
radiodelcrculo,elclculodesureaysupermetro,etc.

En principio parece que la idea pueda funcionar pero es posible que ms adelante, si continas
construyendo una jerarqua de clases, observes que puedas llegar a conclusiones incongruentes al
suponer que un crculo es una especializacin de un punto (un tipo de punto). Todas aquellas
figurasquecontenganunoovariospuntosdeberansertiposdepunto?Ysitienesvariospuntos?
Cmoaccedesaellos?Unrectngulotambintienesentidoqueherededeunpunto?Noparece
muybuenaidea.

Utilizacinavanzadadeclases

DAW

Parece que en este caso habra resultado mejor establecer una relacin de composicin. Analzalo
detenidamente:culdeestasdossituacionestesuenamejor?
1. Uncrculoesunpunto(sucentro),yportantoheredarlascoordenadasx1ey1quetiene
todopunto.Ademstendrotrascaractersticasespecficascomoelradioomtodoscomo
elclculodelalongituddesupermetroodesurea.
2. Uncrculotieneunpunto(sucentro),juntoconalgunosatributosmscomoporejemplo
el radio. Tambin tendr mtodos para el clculo de su rea o de la longitud de su
permetro.

Parece que en este caso la composicin refleja con mayor fidelidad la relacin que existe entre
ambasclases.NormalmentesuelesersuficienteconplantearselaspreguntasAesuntipodeB?o
AcontieneelementosdetipoB?.

DesarrollodeAplicacionesWeb

Tema9

2Composicin
Caso prctico
Mara es consciente de que las relaciones que pueden existir entre dos clases pueden ser de
clientela, composicin, herencia, etc. Tambin sabe que una forma muy prctica de distinguir entre
la necesidad de una composicin de un herencia suele ser mediante las preguntas Es la clase A
un tipo de clase B? o Tiene la clase A elementos de la clase B? Normalmente, ese mtodo le
suele funcionar a la hora de decidirse por la composicin o por la herencia.
Pero, qu hay que hacer para establecer una relacin de composicin? Es necesario indicar algn
modificador al definir las clases? En tal caso, se indicara en la clase continente o en la contenida?
Afecta de alguna manera al cdigo que hay que escribir? En definitiva, cmo se indica que una
clase contiene instancias de otra clase en su interior?
Mientras Mara piensa en voz alta, Ada se acerca con una carpeta en la mano y se la entrega:
Bueno, aqu tienes algunas clases bsicas que nos hacen falta para el proyecto de la Clnica
Veterinaria. A ver qu tal os quedan.

2.1.Sintaxisdelacomposicin.
Paraindicarqueunaclasecontieneobjetosdeotraclasenoesnecesarianingunasintaxisespecial.
Cadaunodeesosobjetosnoesmsqueunatributoy,portanto,debeserdeclaradocomotal:
class <nombreClase> {
[modificadores] <NombreClase1> nombreAtributo1;
[modificadores] <NombreClase2> nombreAtributo2;

EnunidadesanterioreshastrabajadoconlaclasePunto,quedefinalascoordenadasdeunpuntoen
elplano,yconlaclaseRectangulo,quedefinaunafiguradetiporectngulotambinenelplanoa
partirdedosdesusvrtices(inferiorizquierdoysuperiorderecho).Talycomohemosformalizado
ahora los tipos de relaciones entre clases, parece bastante claro que aqu tendras un caso de
composicin:unrectngulocontienepuntos.Portanto,podrasahoraredefinirlosatributosdela
claseRectangulo(cuatronmerosreales)comodosobjetosdetipoPunto:
class Rectangulo {
private Punto vertice1;
private Punto vertice2;

Ahora los mtodos de esta clase debern tener en cuenta que ya no hay cuatro atributos de tipo
double, sino dos atributos de tipo Punto (cada uno de los cuales contendr en su interior dos
atributosdetipodouble).

Para declarar un objeto de una clase determinada, como atributo de otra clase, es
necesario especificar que existe una relacin de composicin entre ambas clases
mediante el modificador object. Verdadero o Falso?
Verdadero

Falso

No.Elhechodedeclararunatributocomodeunaclasedeterminadaestyaindicandodemaneraimplcitaqueexisteunarelacinde
composicin(unobjetoquecontieneotrosobjetosensuinterior)sinnecesidaddetenerqueindicarnadams.Adems,elmodificador
objectnoexiste.LoquesexisteeslaclaseObject,delacualderivantodaslasclasesenJava.

Ejercicioresuelto
IntentarescribirlossiguienteslosmtodosdelaclaseRectanguloteniendoencuentaahorasunueva
estructuradeatributos(dosobjetosdelaclasePunto,enlugardecuatroelementosdetipodouble):

Utilizacinavanzadadeclases

DAW

1. Mtodo calcularSuperfice, que calcula y devuelve el rea de la superficie encerrada por la


figura.
2. MtodocalcularPerimetro,quecalculaydevuelvelalongituddelpermetrodelafigura.

En ambos casos la interfaz no se ve modificada en absoluto (desde fuera su funcionamiento es el


mismo),perointernamentedeberstenerencuentaqueyanoexistenlosatributosx1,y1,x2,y2,de
tipodouble,sinolosatributosvertice1yvertice2detipoPunto.
public double calcularSuperficie () {
double area, base, altura;
// Variables locales
base= vertice2.obtenerX () - vertice1.obtenerX (); // Antes era x2 - x1
altura= vertice2.obtenerY () - vertice1.obtenerY (); // Antes era y2 - y1
area= base * altura;
return area;
}
public double CalcularPerimetro () {
double perimetro, base, altura;

// Variables locales

base= vertice2.obtenerX () - vertice1.obtenerX (); // Antes era x2 - x1


altura= vertice2.obtenerY () - vertice1.obtenerY (); // Antes era y2 - y1
perimetro= 2*base + 2*altura;
return perimetro;
}

Enlasiguientepresentacinpuedesobservardetalladamenteelprocesocompletodeelaboracinde
laclaseRectangulohaciendousodelaclasePunto:

ObjetosdetipoRectngulocompuesto
porobjetosdetipoPunto

AtributosdeunobjetoRectngulo
compuestoporobjetosdetipoPunto

10

DesarrollodeAplicacionesWeb

Tema9

ClaseRectngulo

MtodocalcularSuperficie

2.2.Usodelacomposicin(I).Preservacindelaocultacin.

Como ya has observado, la relacin de composicin no tiene ms misterio a la hora de


implementarse que simplemente declarar atributos de las clases que necesites dentro de la clase
queestsdiseando.

Ahora bien, cuando escribas clases que contienen objetos de otras clases (lo cual ser lo ms
habitual) debers tener un poco de precaucin con aquellos mtodos que devuelvan informacin
acercadelosatributosdelaclase(mtodosobtenedoresodetipoget).

Comoyavisteenlaunidaddedicadaalacreacindeclases,lonormalsueleserdeclararlosatributos
como privados (o protegidos, como veremos un poco ms adelante) para ocultarlos a los posibles
clientes de la clase (otros objetos que en el futuro harn uso de la clase). Para que otros objetos
puedanaccederalainformacincontenidaenlosatributos,oalmenosaunapartedeella,debern
hacerlo a travs de mtodos que sirvan de interfaz, de manera que slo se podr tener acceso a
aquella informacin que el creador de la clase haya considerado oportuna. Del mismo modo, los
atributos solamente sern modificados desde los mtodos de la clase, que decidirn cmo y bajo
qu circunstancias deben realizarse esas modificaciones. Con esa metodologa de acceso se tena
perfectamente separada la parte de manipulacin interna de los atributos de la interfaz con el
exterior.

Hasta ahora los mtodos de tipo get devolvan tipos primitivos, es decir, copias del contenido (a
vecesconalgntipodemodificacinodeformato)quehabaalmacenadoenlosatributos,perolos
atributosseguanasalvocomoelementosprivadosdelaclase.Pero,apartirdeestemomento,al
tener objetos dentro de las clases y no slo tipos primitivos, es posible que en un determinado
momentointeresedevolverunobjetocompleto.

11

Utilizacinavanzadadeclases

DAW

Ahora bien, cuando vayas a devolver un objeto habrs de obrar con mucha precaucin. Si en un
mtodo de la clase devuelves directamente un objeto que es un atributo, estars ofreciendo
directamente una referencia a un objeto atributo que probablemente has definido como privado.
Deestaformaestsvolviendoahacerpblicounatributoqueinicialmenteeraprivado!

Paraevitaresetipodesituaciones(ofreceralexteriorreferenciasaobjetosprivados)puedesoptar
pordiversasalternativas,procurandosiempreevitarladevolucindirectadeunatributoqueseaun
objeto:
9 Unaopcinpodraserdevolversiempretiposprimitivos.
9 Dadoqueestonosiempreesposible,ocomomnimopocoprctico,otraposibilidadescrearun
nuevo objeto que sea una copia del atributo que quieres devolver y utilizar ese objeto como
valor de retorno. Es decir, crear una copia del objeto especialmente para devolverlo. De esta
manera,elcdigoclientedeesemtodopodrmanipularasuantojoesenuevoobjeto,puesno
serunareferenciaalatributooriginal,sinounnuevoobjetoconelmismocontenido.

Porltimo,debestenerencuentaqueesposiblequeenalgunoscasosssenecesiterealmentela
referenciaalatributooriginal(algomuyhabitualenelcasodeatributosestticos).Entalescasos,no
habrproblemaendevolverdirectamenteelatributoparaqueelcdigollamante(cliente)hagael
usoqueestimeoportunodel.

Debes evitar por todos los medios la devolucin de un atributo que sea un objeto (estaras dando
directamenteunareferenciaalatributo,visibleymanipulabledesdefuera),salvoquesetratedeun
casoenelquedebaseras.

Paraentenderestassituacionesunpocomejor,podemosvolveralobjetoRectanguloyobservarsus
nuevosmtodosdetipoget.
Ejercicioresuelto
Dada la clase Rectangulo, escribe sus nuevos mtodos obtenerVertice1 y obtenerVertice2 para que
devuelvan los vrtices inferior izquierdo y superior derecho del rectngulo (objetos de tipo Punto),
teniendo en cuenta su nueva estructura de atributos (dos objetos de la clase Punto, en lugar de
cuatroelementosdetipodouble):

LosmtodosdeobtencindevrticesdevolvernobjetosdelaclasePunto:
public Punto obtenerVertice1 ()
{
return vertice1;
}
public Punto obtenerVertice2 ()
{
return vertice2;
}

Esto funcionara perfectamente, pero deberas tener cuidado con este tipo de mtodos que
devuelvendirectamenteunareferenciaaunobjetoatributoqueprobablementehasdefinidocomo
privado.Estsdealgunamanerahaciendopblicounatributoquefuedeclaradocomoprivado.

Paraevitarqueestosucedabastaraconcrearunnuevoobjetoquefueraunacopiadelatributoque
sedeseadevolver(enestecasounobjetodelaclasePunto).
Aqutienesalgunasposibilidades:

public Punto obtenerVertice1 ()


{
double x, y;
Punto p;

12

// Creacin de un nuevo punto extrayendo sus atributos

DesarrollodeAplicacionesWeb

Tema9

x= this.vertice1.obtenerX();
y= this.vertice1.obtenerY();
p= new Punto (x,y);
return p;
}
public Punto obtenerVertice1 () // Utilizando el constructor copia de Punto (si es que est
definido)
{
Punto p;
p= new Punto (this.vertice1); // Uso del constructor copia
return p;
}

Deestamanera,sedevuelveunpuntototalmentenuevoquepodrsermanipuladosinningntemor
porpartedelcdigoclientedelaclasepuesesunacopiaparal.
ParaelmtodoobtenerVertice2seraexactamenteigual.

2.2.1.Usodelacomposicin(II).Llamadasaconstructores.
Otrofactorquedebesconsiderar,alahoradeescribirclasesquecontengancomoatributosobjetos
deotrasclases,essucomportamientoalahoradeinstanciarse.Duranteelprocesodecreacinde
un objeto (constructor) de la clase contenedora habr que tener en cuenta tambin la creacin
(llamadasaconstructores)deaquellosobjetosquesoncontenidos.

Elconstructordelaclasecontenedoradebeinvocaralosconstructoresdelasclasesdelosobjetos
contenidos.

En este caso hay que tener cuidado con las referencias a objetos que se pasan como parmetros
pararellenarelcontenidodelosatributos.Esconvenientehacerunacopiadeesosobjetosyutilizar
esas copias para los atributos pues si se utiliza la referencia que se ha pasado como parmetro, el
cdigoclientedelaclasepodrateneraccesoaellasinnecesidaddepasarporlainterfazdelaclase
(volveramosadejarabiertaunapuertapblicaaalgoquequizseaprivado).

Adems,sielobjetoparmetroquesepasalconstructorformabapartedeotroobjeto,estopodra
ocasionar un desagradable efecto colateral si esos objetos son modificados en el futuro desde el
cdigo cliente de la clase, ya que no sabes de dnde provienen esos objetos, si fueron creados
especialmenteparaserusadosporelnuevoobjetocreadoosipertenecenaotroobjetoquepodra
modificarlosmstarde.Esdecir,correraselriesgodeestarcompartiendoesosobjetosconotras
partes del cdigo, sin ningn tipo de control de acceso y con las nefastas consecuencias que eso
podra tener: cualquier cambio de ese objeto afectara a partes del programa supuestamente
independientes,queentiendeneseobjetocomosuyo.

Enelfondolosobjetosnosonmsquevariablesdetiporeferenciaalazonadememoriaenlaque
seencuentratodalainformacindelobjetoensmismo.Estoes,puedestenerunnicoobjetoy
mltiplesreferenciasal.Peroslosetratadeunobjeto,ycualquiermodificacindesdeunade
susreferenciasafectaraatodaslasdems,puesestamoshablandodelmismoobjeto.

Recuerda tambin que slo se crean objetos cuando se llama a un constructor (uso de new ). Si
realizasasignacionesopasosdeparmetros,noseestncopiandoopasandocopiasdelosobjetos,
sinosimplementedelasreferencias,yportantosetratarsiempredelmismoobjeto.

Setratadeunefectosimilaralquesucedaenlosmtodosdetipo get ,peroenestecasoensentido


contrario (en lugar de que nuestra clase regale al exterior uno de sus atributos objeto mediante
unareferencia,enestaocasinseadueadeunparmetroobjetoqueprobablementepertenezca
aotroobjetoyqueesposiblequeelfuturohagausodel).

13

Utilizacinavanzadadeclases

DAW

ParaentendermejorestosposiblesefectospodemoscontinuarconelejemplodelaclaseRectangulo
quecontieneensuinteriordosobjetosdelaclasePunto.Enlosconstructoresdelrectngulohabr
que incluir todo lo necesario para crear dos instancias de la clase Punto evitando las referencias a
parmetros(haciendocopias).

Si se declaran dos variables objeto a y b de la clase X, ambas son instanciadas mediante


un constructor, y posteriormente se realiza la asignacin a=b, el contenido de b ser una
copia del contenido de a, perdindose los valores iniciales de b. Verdadero o Falso?
Verdadero

Falso

Lavariablebsehabrconvertidoenunareferenciaalmismoobjetoalqueapuntalavariablea,puesnosehahechounacopiadea.
Ahorasetendrndosvariablesreferencia(ayb)aunmismoobjeto(elquefueinicialmenteinstanciadoyasignadoalavariableb).Por
otrolado,elobjetoalqueapuntabalavariablebsehabrperdidoyelrecolectordebasuraseencargardedestruirlo(salvoque
existieranotrasreferenciasal).

Ejercicioresuelto
Intenta rescribir los constructores de la clase Rectangulo teniendo en cuenta ahora su nueva
estructuradeatributos(dosobjetosdelaclasePunto,enlugardecuatroelementosdetipodouble):
1. Un constructor sin parmetros (para sustituir al constructor por defecto) que haga que los
valoresinicialesdelasesquinasdelrectngulosean(0,0)y(1,1).
2. Unconstructorconcuatroparmetros,x1,y1,x2,y2,quecreeunrectnguloconlosvrtices
(x1,y1)y(x2,y2).
3. Un constructor con dos parmetros, punto1, punto2, que rellene los valores iniciales de los
atributosdelrectnguloconlosvaloresproporcionadosatravsdelosparmetros.
4. Un constructor con dos parmetros, base y altura, que cree un rectngulo donde el vrtice
inferior derecho est ubicado en la posicin (0,0) y que tenga una base y una altura tal y
comoindicanlosdosparmetrosproporcionados.
5. Unconstructorcopia.

POSIBLESOLUCIN
Durante el proceso de creacin de un objeto (constructor) de la clase contenedora (en este caso
Rectangulo) hay que tener en cuenta tambin la creacin (llamada a constructores) de aquellos
objetosquesoncontenidos(enestecasoobjetosdelaclasePunto).
En el caso del primer constructor, habr que crear dos puntos con las coordenadas (0,0) y (1,1) y
asignarlosalosatributoscorrespondientes(vertice1yvertice2):
public Rectangulo ()
{
this.vertice1= new Punto (0,0);
this.vertice2= new Punto (1,1);
}

Paraelsegundoconstructorhabrquecreardospuntosconlascoordenadasx1,y1,x2,y2quehan
sidopasadascomoparmetros:
public Rectangulo (double x1, double y1, double x2, double y2)
{
this.vertice1= new Punto (x1, y1);
this.vertice2= new Punto (x2, y2);
}

En el caso del tercer constructor puedes utilizar directamente los dos puntos que se pasan como
parmetrosparaconstruirlosvrticesdelrectngulo:
Ahorabien,estopodraocasionarunefectocolateralnodeseadosiesosobjetosdetipoPuntoson
modificados en el futuro desde el cdigo cliente del constructor (no sabes si esos puntos fueron

14

DesarrollodeAplicacionesWeb

Tema9

creadosespecialmente paraserusadosporelrectnguloosipertenecenaotroobjetoquepodra
modificarlosmstarde).

Portanto,paraestecasoquizfuerarecomendablecreardosnuevospuntosaimagenysemejanza
delospuntosquesehanpasadocomoparmetros.Paraellotendrasdosopciones:
1. LlamaralconstructordelaclasePuntoconlosvaloresdelosatributos(x,y).
2. LlamaralconstructorcopiadelaclasePunto,siesquesedisponedel.

Aqutieneslasdosposiblesversiones:
Constructorqueextraelosatributosdelosparmetrosycreanuevosobjetos:
public Rectangulo (Punto vertice1, Punto vertice2)
{
this.vertice1= vertice1;
this.vertice2= vertice2;
}

Constructorquecrealosnuevosobjetosmedianteelconstructorcopiadelosparmetros:
public Rectangulo (Punto vertice1, Punto vertice2)
{
this.vertice1= new Punto (vertice1.obtenerX(), vertice1.obtenerY() );
this.vertice2= new Punto (vertice2.obtenerX(), vertice2.obtenerY() );
}

Enestesegundocasopuedesobservarlautilidad delosconstructoresdecopiaalahoradetener
queclonarobjetos(algomuyhabitualenlasinicializaciones).
Paraelcasodelconstructorquerecibecomoparmetroslabaseylaaltura,habrquecrearsendos
vrticesconvalores(0,0)y(0+base,0+altura),oloqueeslomismo:(0,0)y(base,altura).
public Rectangulo (Punto vertice1, Punto vertice2)
{
this.vertice1= new Punto (vertice1 );
this.vertice2= new Punto (vertice2 );
}

Quedarafinalmenteporimplementarelconstructorcopia:
// Constructor copia
public Rectangulo (Rectangulo r) {
this.vertice1= new Punto (r.obtenerVertice1() );
this.vertice2= new Punto (r.obtenerVertice2() );
}

Enestecasonuevamentevolvemosaclonarlosatributosvertice1yvertice2delobjetorqueseha
pasadocomoparmetroparaevitartenerquecompartiresosatributosenlosdosrectngulos.

2.3.Clasesanidadasointernas.

En algunos lenguajes, es posible definir una clase


dentrodeotraclase(clasesinternas):
class claseContenedora {
// Cuerpo de la clase

class claseInterna {
// Cuerpo de la clase interna

}
}

Sepuedendistinguirvariostiposdeclasesinternas:
9 Clases internas estticas (o clases anidadas),
declaradasconelmodificadorstatic.

15

Utilizacinavanzadadeclases

DAW

Clasesinternasmiembro,conocidashabitualmentecomoclasesinternas.Declaradasalmximo
niveldelaclasecontenedoraynoestticas.
9 Clases internas locales, que se declaran en el interior de un bloque de cdigo (normalmente
dentrodeunmtodo).
9 Clasesannimas,similaresalasinternaslocales,perosinnombre(sloexistirunobjetodeellas
y,alnotenernombre,notendrnconstructores).Sesuelenusarenlagestindeeventosenlos
interfacesgrficos.
Aqutienesalgunosejemplos:
class claseContenedora {

static class claseAnidadaEstatica {

}
class claseInterna {

Lasclasesanidadas,comomiembrosdeunaclasequeson(miembrosdeclaseExterna),puedenser
declaradas con los modificadores public, protected, private o de paquete, como el resto de
miembros.

Lasclasesinternas(noestticas)tienenaccesoaotrosmiembrosdelaclasedentrodelaqueest
definidaaunqueseanprivados(setrataencierto mododeun miembro msdelaclase),mientras
quelasanidadas(estticas)no.

Lasclasesinternasseutilizanenalgunoscasospara:
9 Agruparclasesqueslotienesentidoqueexistanenelentorno delaclaseenlaquehansido
definidas,demaneraqueseocultasuexistenciaalrestodelcdigo.
9 Incrementarelniveldeencapsulacinyocultamiento.
9 Proporcionaruncdigofuentemslegibleyfcildemantener(elcdigodelasclasesinternasy
anidadasestmscercadedondeesusado).

EnJavaesposibledefinirclasesinternasyanidadas,permitiendotodasesasposibilidades.Aunque
paraloejemplosconlosquevasatrabajarnolasvasanecesitarporahora.

Si quieres ampliar un poco ms sobre las clases internas, puedes echar un vistazo a la
siguientepresentacin:
http://www.fdi.ucm.es/profesor/balta/traspasjava/clases%20internas.pdf
Tambin puedes consultar el siguiente artculo sobre clases de alto nivel, clases miembro,
clasesinternasyclasesanidadas(eningls):
http://blogs.oracle.com/darcy/entry/nested_inner_member_and_top

16

DesarrollodeAplicacionesWeb

Tema9

3.Herencia.
Caso prctico
Mara ha estado desarrollando junto con Juan algunas clases para el proyecto de la Clnica
Veterinaria. Hasta el momento todo ha ido bien. Han tenido que crear clases que contenan en su
interior instancias de otras clases (atributos que eran objetos). Han tenido cuidado con los
constructores y las referencias a los atributos internos y parece que, por ahora, todo funciona
perfectamente. Pero ahora necesitan aprovechar algunas de las caractersticas que tienen algunas de
las clases que ya han escrito, y no quieren tener que volver a escribir todos esos mtodos en las
nuevas clases. Mara sabe que es una ocasin perfecta para utilizar el concepto de herencia:
- Si la clase A tiene caractersticas en comn (atributos y mtodos) con la clase B aportando algunas
caractersticas nuevas, puede decirse que la clase A es una especializacin de la clase B, no es
as?.
Le pregunta Mara a Juan.
- As es. Es un caso claro de herencia. La clase A hereda de la clase B. Contesta Juan.
- De acuerdo. Pues vamos manos a la obra. Cmo indicbamos que una clase heredaba de otra?
Creo recordar que se usaba la palabra reservada extends. Haba que hacer algo ms? Dice
Mara con entusiasmo.
- Parece que ha llegado el momento de repasar la sintaxis de la herencia en Java.

Comoyahasestudiado,laherenciaeselmecanismoquepermitedefinirunanuevaclaseapartirde
otra,pudiendoaadirnuevascaractersticas,sintenerquevolveraescribirtodoelcdigodelaclase
base.
La clase de la que se hereda suele ser llamada clase base,
clasepadreosuperclase(delaqueheredaotraclase.Seheredarntodas
aquellas caractersticas que la clase padre permita).Alaclasequehereda
se le suele llamar clase hija, clase derivada o subclase (que
hereda de otra clase. Se heredan todas aquellas caractersticas que la clase padre
permita).
Unaclasederivadapuedeserasuvezclasepadre deotraque herededeellayassucesivamente
dando lugar a una jerarqua de clases, excepto aquellas que estn en la parte de arriba de la
jerarqua(slosernclasespadre)oenlapartedeabajo(slosernclaseshijas).

Una clase hija no tiene acceso a los miembros privados de su clase padre, tan solo a los pblicos
(como cualquier parte del cdigo tendra) y los protegidos (a los que slo tienen acceso las clases
derivadasylasdelmismopaquete).Aquellosmiembrosqueseanprivadosenlaclasebasetambin
habrn sido heredados, pero el acceso a ellos estar restringido al propio funcionamiento de la
superclase y slo se podr acceder a ellos si la superclase ha dejado algn medio indirecto para
hacerlo(porejemploatravsdealgnmtodo).

Todoslosmiembrosdelasuperclase,tantoatributoscomomtodos,sonheredadosporlasubclase.
Algunosdeestosmiembrosheredadospodrnserredefinidososobrescritos(overriden)ytambin
podrnaadirsenuevosmiembros.Dealgunamanerapodradecirsequeestsampliandolaclase
baseconcaractersticasadicionalesomodificandoalgunasdeellas(procesodeespecializacin).

Una clase derivada extiende la funcionalidad de la clase base sin tener que volver a escribir el
cdigodelaclasebase.

Una clase derivada hereda todos los miembros de su clase base, pudiendo acceder a
cualquiera de ellos en cualquier momento. Verdadero o Falso?
Verdadero

Falso

Noesdeltodocierto.Seheredantodoslosmiembros,perolaclasederivadanotendrunaccesodirectoaaquellosmiembrosdelaclase
basequeseanprivados.

17

Utilizacinavanzadadeclases

DAW

3.1.Sintaxisdelaherencia.
EnJavalaherenciaseindicamediantelapalabrareservada extends :
[modificador] class ClasePadre {
// Cuerpo de la clase

}
[modificador] class ClaseHija extends ClasePadre {
// Cuerpo de la clase

Imagina que tienes una clase Persona que contiene atributos como nombre, apellidos y fecha de
nacimiento:
public class Persona {
String nombre;
String apellidos;
GregorianCalendar fechaNacim;

Es posible que, ms adelante, necesites una clase Alumno que compartir esos
atributos(dadoquetodoalumnoesunapersona,peroconalgunascaractersticas
especficas que lo especializan). En tal caso tendras la posibilidad de crear una
clase Alumno que repitiera todos esos atributos o bien heredar de la clase
Persona:
public class Alumno extends Persona {
String grupo;
double notaMedia;

Apartirdeahora,unobjetodelaclaseAlumnocontendrlosatributosgrupoynotaMedia(propios
de la clase Alumno), pero tambin nombre, apellidos y fechaNacim (propios de su clase base
Personayqueportantohaheredado).

En Java la herencia se indica mediante la palabra reservada inherits. Verdadero o


Falso?
..

Verdadero

Falso

Ejercicioresuelto
Imagina que tambin necesitas una clase Profesor, que contar con atributos como nombre,
apellidos,fechadenacimiento,salarioyespecialidad.Cmocrearasesanuevaclaseyquatributos
leaadiras?

Est claro que un Profesor es otra especializacin de Persona, al igual que lo era Alumno, as que
podras crear otra clase derivada de Persona y as aprovechar los atributos genricos (nombre,
apellidos,fechadenacimiento)queposeetodoobjetodetipoPersona.Tansolofaltaraaadirlesus
atributosespecficos(salarioyespecialidad):
public class Profesor extends Persona {
String especialidad;
double salario;

18

DesarrollodeAplicacionesWeb

Tema9

3.2.Accesoamiembrosheredados.
Como ya has visto anteriormente, no es posible acceder a miembros privados de una superclase.
Para poder acceder a ellos podras pensar en hacerlos pblicos, pero entonces estaras dando la
opcindeaccederaellosacualquierobjetoexternoyesprobablequetampocoseaesolodeseable.
Para ello se invent el modificador protected (protegido) que permite el acceso desde clases
heredadas, pero no desde fuera de las clases (estrictamente hablando, desde fuera del paquete),
queserancomomiembrosprivados.

En la unidad dedicada a la utilizacin de clases ya estudiaste los posibles modificadores de acceso


que poda tener un miembro: sin modificador (acceso de paquete), pblico, privado o protegido.
Aqutienesdenuevoelresumen:
Cuadrodenivelesaccesibilidadalosatributosdeunaclase

Mismaclase Subclase Mismopaquete Otropaquete

Sinmodificador(paquete)
X
X
X
public
X
X
X
X
private
X
protected
X
X
X

SienelejemploanteriordelaclasePersonasehubierandefinidosusatributoscomoprivate:
public class Persona {
private String nombre;
private String apellidos;

Al definir la clase Alumno como heredera de Persona, no habras tenido acceso a esos atributos,
pudiendo ocasionar un grave problema de operatividad al intentar manipular esa informacin. Por
tanto, en estos casos lo ms recomendable habra sido declarar esos atributos como protected o
biensinmodificador(paraquetambintenganaccesoaellosotrasclasesdelmismopaquete,sies
queseconsideraoportuno):
public class Persona {
protected String nombre;
protected String apellidos;

Sloenaquelloscasosenlosquesedeseaexplcitamentequeunmiembrodeunaclasenopueda
ser accesible desde una clase derivada debera utilizarse el modificador private. En el resto de
casos es recomendable utilizar protected, o bien no indicar modificador (acceso a nivel de
paquete).
Ejercicioresuelto
Rescribe las clases Alumno y Profesor utilizando el modificador protected para sus atributos del
mismomodoquesehahechoparasusuperclasePersona
1. ClaseAlumno.
Setratasimplementedeaadirelmodificadordeaccesoprotectedalosnuevosatributosqueaade
laclase.
public class Alumno extends Persona {
protected String grupo;
protected double notaMedia;

2. ClaseProfesor.
ExactamenteigualqueenlaclaseAlumno.

19

Utilizacinavanzadadeclases

DAW

public class Profesor extends Persona {


protected String especialidad;
protected double salario;

3.3.Utilizacindemiembrosheredados(I).Atributos.
Los atributos heredados por una clase son, a efectos prcticos, iguales que aquellos que sean
definidosespecficamenteenlanuevaclasederivada.

EnelejemploanteriorlaclasePersonadisponadetresatributosylaclaseAlumno,queheredabade
ella, aada dos atributos ms. Desde un punto de vista funcional podras considerar que la clase
Alumnotienecincoatributos:tresporserPersona(nombre,apellidos,fechadenacimiento)yotros
dosmsporserAlumno(grupoynotamedia).
Ejercicioresuelto
DadaslasclasesAlumnoyProfesorquehasutilizadoanteriormente,implementamtodosgetyset
en las clases Alumno y Profesor para trabajar con sus cinco atributos (tres heredados ms dos
especficos).

POSIBLESOLUCIN
1. ClaseAlumno.
SetratadeheredardelaclasePersonayportantoutilizarconnormalidadsusatributosheredados
comosipertenecieranalapropiaclase(dehechosepuedeconsiderarquelepertenecen,dadoque
loshaheredado).
public class Alumno extends Persona {
protected String grupo;
protected double notaMedia;
// Mtodo getNombre
public String getNombre (){
return nombre;
}
// Mtodo getApellidos
public String getApellidos (){
return apellidos;
}
// Mtodo getFechaNacim
public GregorianCalendar getFechaNacim (){
return this.fechaNacim;
}
// Mtodo getGrupo
public String getGrupo (){
return grupo;
}
// Mtodo getNotaMedia
public double getNotaMedia (){
return notaMedia;
}
// Mtodo setNombre
public void setNombre (String nombre){
this.nombre= nombre;
}
// Mtodo setApellidos
public void setApellidos (String apellidos){
this.apellidos= apellidos;
}
// Mtodo setFechaNacim
public void setFechaNacim (GregorianCalendar fechaNacim){
this.fechaNacim= fechaNacim;

20

DesarrollodeAplicacionesWeb

Tema9

}
// Mtodo setGrupo
public void setGrupo (String grupo){
this.grupo= grupo;
}
// Mtodo setNotaMedia
public void setNotaMedia (double notaMedia){
this.notaMedia= notaMedia;
}
}

Si te fijas, puedes utilizar sin problema la referencia this a la propia clase con esos atributos
heredados,puespertenecenalaclase:this.nombre,this.apellidos,etc.

2. ClaseProfesor.
SeguimosexactamenteelmismoprocedimientoqueconlaclaseAlumno.
public class Profesor extends Profesor {
String especialidad;
double salario;
// Mtodo getNombre
public String getNombre (){
return nombre;
}
// Mtodo getApellidos
public String getApellidos (){
return apellidos;
}
// Mtodo getFechaNacim
public GregorianCalendar getFechaNacim (){
return this.fechaNacim;
}
// Mtodo getEspecialidad
public String getEspecialidad (){
return especialidad;
}
// Mtodo getSalario
public double getSalario (){
return salario;
}
// Mtodo setNombre
public void setNombre (String nombre){
this.nombre= nombre;
}
// Mtodo setApellidos
public void setApellidos (String apellidos){
this.apellidos= apellidos;
}
// Mtodo setFechaNacim
public void setFechaNacim (GregorianCalendar fechaNacim){
this.fechaNacim= fechaNacim;
}
// Mtodo setSalario
public void setSalario (double salario){
this.salario= salario;
}
// Mtodo setESpecialidad
public void setESpecialidad (String especialidad){
this.especialidad= especialidad;
}
}

21

Utilizacinavanzadadeclases

DAW

Unaconclusinquepuedesextraerdeestecdigoesquehastenidoqueescribirlosmtodosgety
set para los tres atributos heredados, pero no habra sido posible definir esos seis mtodos en la
clasebaseyasestasdosclasesderivadashubierantambinheredadoesosmtodos?Larespuesta
esafirmativaydehechoescomolovasahacerapartirdeahora.Deesamaneratehabrasevitado
tener que escribir seis mtodos en la clase Alumno y otros seis en la clase Profesor. As que
recuerda:sepuedenheredartantolosatributoscomolosmtodos.

AqutienesunejemplodecmopodrashaberdefinidolaclasePersonaparaqueluegosehubieran
podidoheredardeellasusmtodos(ynoslosusatributos):
public class Persona {
protected String nombre;
protected String apellidos;
protected GregorianCalendar fechaNacim;
// Mtodo getNombre
public String getNombre (){
return nombre;
}
// Mtodo getApellidos
public String getApellidos (){
return apellidos;
}
// Mtodo getFechaNacim
public GregorianCalendar getFechaNacim (){
return this.fechaNacim;
}
// Mtodo setNombre
public void setNombre (String nombre){
this.nombre= nombre;
}
// Mtodo setApellidos
public void setApellidos (String apellidos){
this.apellidos= apellidos;
}
// Mtodo setFechaNacim
public void setFechaNacim (GregorianCalendar fechaNacim){
this.fechaNacim= fechaNacim;
}
}

3.3.1Utilizacindemiembrosheredados(II).Mtodos.
Delmismomodoqueseheredanlosatributos,tambinseheredanlosmtodos,convirtindosea
partir de ese momento en otros mtodos ms de la clase derivada, junto a los que hayan sido
definidosespecficamente.

EnelejemplodelaclasePersona,sidispusiramosdemtodosgetysetparacadaunodesustres
atributos(nombre,apellidos,fechaNacim),tendrasseismtodosquepodranserheredadosporsus
clases derivadas. Podras decir entonces que la clase Alumno, derivada de Persona, tiene diez
mtodos:
9 Seis por ser Persona (getNombre, getApellidos, getFechaNacim, setNombre, setApellidos,
setFechaNacim).
9 Oros cuatro ms por ser Alumno (getGrupo,
setGrupo,getNotaMedia,setNotaMedia).

22

DesarrollodeAplicacionesWeb

Tema9

Sinembargo,slotendrasquedefiniresoscuatroltimos(losespecficos)pueslosgenricosyalos
hasheredadodelasuperclase.

En Java los mtodos heredados de una superclase deben volver a ser definidos en las
subclases. Verdadero o Falso?
Verdadero

Falso

Losmtodosheredadosdelasuperclaseestndisponiblesenlasubclasesintenerquehacernadaespecial,aunqueescierto,comovers
msadelante,quepuedenserredefinidosoampliados(peronoesobligatorio)

Ejercicioresuelto
DadaslasclasesPersona,AlumnoyProfesorquehasutilizadoanteriormente,implementamtodos
getysetenlaclasePersonaparatrabajarconsus tresatributosyenlasclasesAlumnoy Profesor
paramanipularsuscincoatributos(tresheredadosmsdosespecficos),teniendoencuentaquelos
mtodosqueyahayasdefinidoparaPersonavanaserheredadosenAlumnoyenProfesor.

POSIBLESOLUCIN
1. ClasePersona.
public class Persona {
protected String nombre;
protected String apellidos;
protected GregorianCalendar fechaNacim;
// Mtodo getNombre
public String getNombre (){
return nombre;
}
// Mtodo getApellidos
public String getApellidos (){
return apellidos;
}
// Mtodo getFechaNacim
public GregorianCalendar getFechaNacim (){
return this.fechaNacim;
}
// Mtodo setNombre
public void setNombre (String nombre){
this.nombre= nombre;
}
// Mtodo setApellidos
public void setApellidos (String apellidos){
this.apellidos= apellidos;
}
// Mtodo setFechaNacim
public void setFechaNacim (GregorianCalendar fechaNacim){
this.fechaNacim= fechaNacim;
}

2. ClaseAlumno.
Al heredar de la clase Persona tan solo es necesario escribir mtodos para los nuevos atributos
(mtodosespecializadosdeaccesoalosatributosespecializados),pueslosmtodosgenricos(de
accesoalosatributosgenricos)yaformanpartedelaclasealhaberlosheredado.
public class Alumno extends Persona {
protected String grupo;
protected double notaMedia;
// Mtodo getGrupo
public String getGrupo (){
return grupo;
}
// Mtodo getNotaMedia

23

Utilizacinavanzadadeclases

DAW

public double getNotaMedia (){


return notaMedia;
}
// Mtodo setGrupo
public void setGrupo (String grupo){
this.grupo= grupo;
}
// Mtodo setNotaMedia
public void setNotaMedia (double notaMedia){
this.notaMedia= notaMedia;
}
}

Aqu tienes una demostracin prctica de cmo la herencia permite una reutilizacin eficiente del
cdigo,evitandotenerquerepetiratributosymtodos.Slohastenidoqueescribircuatromtodos
enlugardediez.
3. ClaseProfesor.
SeguimosexactamenteelmismoprocedimientoqueconlaclaseAlumno.
public class Profesor extends Persona {
String especialidad;
double salario;
// Mtodo getEspecialidad
public String getEspecialidad (){
return especialidad;
}
// Mtodo getSalario
public double getSalario (){
return salario;
}
// Mtodo setSalario
public void setSalario (double salario){
this.salario= salario;
}
// Mtodo setEspecialidad
public void setESpecialidad (String especialidad){
this.especialidad= especialidad;
}
}

3.4.Redefinicindemtodosheredados.

Unaclasepuederedefiniralgunosdelosmtodosquehaheredadodesuclasebase.Entalcaso,el
nuevomtodo(especializado)sustituyealheredado.Esteprocedimientotambinesconocidocomo
desobrescriturademtodos.

En cualquier caso, aunque un mtodo sea sobrescrito o redefinido, an es posible acceder a l a


travs de la referencia super, aunque slo se podr acceder a mtodos de la clase padre y no a
mtodosdeclasessuperioresenlajerarquadeherencia.

Losmtodosredefinidospuedenampliarsuaccesibilidadconrespectoalaqueofrezcaelmtodo
original de la superclase, pero nunca restringirla. Por ejemplo, si un mtodo es declarado como
protectedodepaqueteenlaclasebase,podraserredefinidocomopublicenunaclasederivada.
Los mtodos estticos o de clase no pueden ser sobrescritos. Los originales de la clase base
permaneceninalterablesatravsdetodalajerarquadeherencia.

24

DesarrollodeAplicacionesWeb

Tema9

En el ejemplo de la clase Alumno, podran redefinirse algunos de los mtodos heredados. Por
ejemplo,imaginaqueelmtodogetApellidosdevuelvalacadenaAlumno:juntoconlosapellidos
delalumno.Entalcasohabraquerescribiresemtodopararealizaraesamodificacin:
public String getApellidos () {
return Alumno: + apellidos;
}

Cuando sobrescribas un mtodo heredado en Java puedes incluir la anotacin @Override. Esto
indicaralcompiladorquetuintencinessobrescribirelmtododelaclasepadre.Deestemodo,si
te equivocas (por ejemplo, al escribir el nombre del mtodo) y no lo ests realmente
sobrescribiendo, el compilador producir un error y as podrs darte cuenta del fallo. En cualquier
caso,noesnecesarioindicar@Override,peropuederesultardeayudaalahoradelocalizarestetipo
de errores (crees que has sobrescrito un mtodo heredado y al confundirte en una letra ests
realmentecreandounnuevomtododiferente).Enelcasodelejemploanteriorquedara:
@Override
public String getApellidos ()

Dado que el mtodo finalize() de la clase Object es protected, el mtodo finalize() de


cualquier clase que t escribas podr ser public, private o protected.

Verdadero

Falso

SabemosqueenJavatodaclaseacabasiemprederivandodelaclaseObject ytambinsabemosquecuandoseredefineunmtodopuede
ampliarsesuaccesibilidad,peronuncarestringirse.Deestemodo,sielmtodooriginal(eldelaclaseenlaquesedefini)esprotected,
podrampliarsesuaccesibilidadapublicodejarsecomoprotected,peronuncarestringirsems.

Ejercicioresuelto
Dadas las clases Persona, Alumno y Profesor que has utilizado anteriormente, redefine el mtodo
getNombreparaquedevuelvalacadenaAlumno:,juntoconelnombredelalumno,sisetratade
unobjetodelaclaseAlumnoobienProfesor,juntoconelnombredelprofesor,sisetratadeun
objetodelaclaseProfesor.

1. ClaseAlumno.
Al heredar de la clase Persona tan solo es necesario escribir mtodos para los nuevos atributos
(mtodosespecializadosdeaccesoalosatributosespecializados),pueslosmtodosgenricos(de
acceso a los atributos genricos) ya forman parte de la clase al haberlos heredado. Esos son los
mtodosqueseimplementaronenelejercicioanterior(getGrupo,setGrupo,etc.).

Ahorabien,hayqueescribirotromtodoms,puestienesqueredefinirelmtodogetNombrepara
que tenga un comportamiento un poco diferente al getNombre que se hereda de la clase base
Persona:
// Mtodo getNombre
@Override
public String getNombre (){
return Alumno: + this.nombre;
}

En este caso podra decirse que se renuncia al mtodo heredado para redefinirlo con un
comportamientomsespecializadoyacordeconlaclasederivada.

2. ClaseProfesor.
Seguimos exactamente el mismo procedimiento que con la clase Alumno (redefinicin del mtodo
getNombre).
// Mtodo getNombre
@Override
public String getNombre (){
return Profesor: + this.nombre;

25

Utilizacinavanzadadeclases

DAW

3.5.Ampliacindemtodosheredados.

Hastaahora,hasvistoquepararedefinirosustituirunmtododeunasuperclaseessuficientecon
crear otro mtodo en la subclase que tenga el mismo nombre que el mtodo que se desea
sobrescribir.Pero,enotrasocasiones,puedequeloquenecesitesnoseasustituircompletamenteel
comportamientodelmtododelasuperclase,sinosimplementeampliarlo.

Parapoderhacerestonecesitaspoderpreservarelcomportamientoantiguo(eldelasuperclase)y
aadir el nuevo (el de la subclase). Para ello, puedes invocar desde el mtodo ampliador de la
clase derivada al mtodo ampliado de la clase superior (teniendo ambos mtodos el mismo
nombre).Cmosepuedeconseguireso?Puedeshacerlomedianteelusodelareferenciasuper.
Lapalabrareservadasuperesunareferenciaalaclasepadredelaclaseenlaqueteencuentresen
cada momento (es algo similar a this, que representaba una referencia a la clase actual). De esta
manera,podrasinvocaracualquiermtododetusuperclase(siesquesetieneaccesoal).

Porejemplo,imaginaquelaclasePersonadisponedeunmtodoquepermitemostrarelcontenido
dealgunosdatospersonalesdelosobjetosdeestetipo(nombre,apellidos,etc.).Porotrolado,la
clase Alumno tambin necesita un mtodo similar, pero que muestre tambin su informacin
especializada(grupo,notamedia,etc.).Cmopodrasaprovecharelmtododelasuperclasepara
notenerquevolveraescribirsucontenidoenlasubclase?

Podrahacersedeunamaneratansencillacomolasiguiente:
public void mostrar () {
super.mostrar ();
// Llamada al mtodo mostrar de la superclase
// A continuacin mostramos la informacin especializada de esta subclase
System.out.printf ("Grupo: %s\n", this.grupo);
System.out.printf ("Nota media: %5.2f\n", this.notaMedia);
}

Estetipodeampliacionesdemtodosresultanespecialmentetilesporejemploenelcasodelos
constructores, donde se podra ir llamando a los constructores de cada superclase
encadenadamentehastaelconstructordelaclaseenlacspidedelajerarqua(elconstructordela
claseObject).
Ejercicioresuelto
DadaslasclasesPersona,AlumnoyProfesor,defineunmtodomostrarparalaclasePersona,que
muestre el contenido de los atributos (datos personales) de un objeto de la clase Persona. A
continuacin, define sendos mtodos mostrar especializados para las clases Alumno y Profesor que
amplenlafuncionalidaddelmtodomostraroriginaldelaclasePersona.

1. MtodomostrardelaclasePersona.
public void mostrar () {
SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
String Stringfecha= formatoFecha.format(this.fechaNacim.getTime());
System.out.printf ("Nombre: %s\n", this.nombre);
System.out.printf ("Apellidos: %s\n", this.apellidos);
System.out.printf ("Fecha de nacimiento: %s\n", Stringfecha);
}

2. MtodomostrardelaclaseProfesor.
Llamamos al mtodo mostrar de su clase padre (Persona) y luego aadimos la funcionalidad
especficaparalasubclaseProfesor:

26

DesarrollodeAplicacionesWeb

Tema9

public void mostrar () {


super.mostrar ();
// Llamada al mtodo mostrar de la superclase
// A continuacin mostramos la informacin especializada de esta subclase
System.out.printf ("Especialidad: %s\n", this.especialidad);
System.out.printf ("Salario: %7.2f euros\n", this.salario);
}

3. MtodomostrardelaclaseAlumno.
Llamamos al mtodo mostrar de su clase padre (Persona) y luego aadimos la funcionalidad
especficaparalasubclaseAlumno:
public void mostrar () {
super.mostrar ();
// A continuacin mostramos la informacin especializada de esta subclase
System.out.printf ("Grupo: %s\n", this.grupo);
System.out.printf ("Nota media: %5.2f\n", this.notaMedia);
}

3.6.Constructoresyherencia.

Recuerda que cuando estudiaste los constructores viste que un constructor de una clase puede
llamaraotroconstructordelamismaclase,previamentedefinido,atravsdelareferenciathis.En
estoscasos,lautilizacindethisslopodahacerseenlaprimeralneadecdigodelconstructor.

Comoyahasvisto,unconstructordeunaclasederivadapuedehaceralgoparecidoparallamaral
constructordesuclasebasemedianteelusodelapalabrasuper.Deestamanera,elconstructorde
una clase derivada puede llamar primero al constructor de su superclase para que inicialice los
atributos heredados y posteriormente se inicializarn los atributos especficos de la clase: los no
heredados. Nuevamente, esta llamada tambin debe ser la primera sentencia de un constructor
(conlanicaexcepcindequeexistaunallamadaaotroconstructordelaclasemediantethis).

Si no se incluye una llamada a super() dentro del constructor, el compilador incluye


automticamenteunallamadaalconstructorpordefectodeclasebase(llamadaasuper()).Estoda
lugaraunallamadaencadenadeconstructoresdesuperclasehastallegaralaclasemsaltadela
jerarqua(queenJavaeslaclaseObject).

En el caso del constructor por defecto (el que crea el compilador si el programador no ha escrito
ninguno), el compilador aade lo primero de todo, antes de la inicializacin de los atributos a sus
valorespordefecto,unallamadaalconstructordelaclasebasemediantelareferenciasuper.

Alahoradedestruirunobjeto(mtodofinalize)esimportantellamaralosfinalizadoresenelorden
inverso a como fueron llamados los constructores (primero se liberan los recursos de la clase
derivadaydespuslosdelaclasebasemediantelallamadasuper.finalize()).

SilaclasePersonatuvieraunconstructordeestetipo:
public Persona (String nombre, String apellidos, GregorianCalendar fechaNacim) {
this.nombe= nombre;
this.apellidos= apellidos;
this.fechaNacim= new GregorianCalendar (fechaNacim);
}

Podras llamarlo desde un constructor de una clase derivada (por ejemplo Alumno) de la siguiente
forma:
public Alumno (String nombre, String apellidos, GregorianCalendar fechaNacim, String grupo,
double notaMedia) {

27

Utilizacinavanzadadeclases

DAW

super (nombre, apellidos, fechaNacim);


this.grupo= grupo;
this.notaMedia= notaMedia;
}

Enrealidadsetratadeotrorecursomsparaoptimizarlareutilizacindecdigo,enestecasoeldel
constructor,queaunquenoesheredado,spuedesinvocarloparanotenerquerescribirlo.

Puede invocarse al constructor de una superclase mediante el uso de la referencia this.


Verdadero o Falso?
Verdadero

Falso

Lapalabrareservadathisesunareferenciaalapropiaclase.Parahacerreferenciaalasuperclaseseutilizalapalabrareservadasuper.

Ejercicioresuelto
EscribeunconstructorparalaclaseProfesorquerealiceunallamadaalconstructordesuclasebase
para inicializar sus atributos heredados. Los atributos especficos (no heredados) s debern ser
inicializadosenelpropioconstructordelaclaseProfesor.

public Profesor (String nombre, String apellidos,


especialidad, double salario) {
super (nombre, apellidos, fechaNacim);
this.especialidad= especialidad;
this.salario= salario;
}

GregorianCalendar

fechaNacim,

String

3.7.Creacinyutilizacindeclasesderivadas.

Yahasvistocmocrearunaclasederivada,cmoaccederalosmiembrosheredadosdelasclases
superiores,cmoredefiniralgunosdeelloseinclusocmoinvocaraunconstructordelasuperclase.
Ahora se trata de poner en prctica todo lo que has aprendido para que puedas crear tus propias
jerarquasdeclases,obasarteenclasesqueyaexistanenJavaparaheredardeellas,ylasutilicesde
maneraadecuadaparaquetusaplicacionesseanmsfcilesdeescribirymantener.

La idea de la herencia no es complicar los programas, sino todo lo contrario: simplificarlos al


mximo. Procurar que haya que escribir la menor cantidad posible de cdigo repetitivo e intentar
facilitarenloposiblelarealizacindecambios(bienparacorregirerroresbienparaincrementarla
funcionalidad).

3.8.LaclaseObjectenJava.

TodaslasclasesenJavasondescendentes(directosoindirectos)delaclaseObject.Estaclasedefine
los estados y comportamientos bsicos que deben tener todos los objetos. Entre estos
comportamientos,seencuentran:
9 Laposibilidaddecompararse.
9 Lacapacidaddeconvertirseacadenas.
9 Lahabilidaddedevolverlaclasedelobjeto.
Entre los mtodos que incorpora la clase Object y que por tanto hereda cualquier clase en Java
tienes:
PrincipalesmtodosdelaclaseObject
Mtodo
Descripcin
Object()
Constructor.

28

DesarrollodeAplicacionesWeb

clone()
booleanequals(Objectobj)
voidfinalize()

Tema9

Mtodoclonador:creaydevuelveunacopiadelobjeto("clona"el
objeto).
Indicasielobjetopasadocomoparmetroesigualaesteobjeto.
Mtodollamadoporelrecolectordebasuracuandosteconsidera
quenoquedaningunareferenciaaesteobjetoenelentornode
ejecucin.
Devuelveuncdigohashparaelobjeto.
DevuelveunarepresentacindelobjetoenformadeString.

inthashCode()
toString()

LaclaseObjectrepresentalasuperclasequeseencuentraenlacspidedelajerarquadeherencia
enJava.Cualquierclase(inclusolasquetimplementes)acabanheredandodeella.
Object

Vector
Enumerator

BitSet
Dictionary

Vector
Hashtable
Entry

Hashtable
Enumerator

Hashtable

Observable

Stack

ObserverList

Properties

ParaobtenermsinformacinsobrelaclaseObject,susmtodosypropiedades,puedes
consultarladocumentacindelaAPIdeJavaenelsitiowebdeOracle.
http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html

Toda clase Java tiene un mtodo toString y un mtodo finalize. Verdadero o Falso?

Verdadero

Falso

DadoquelaclaseObjecttieneesosmtodosypuestoquecualquierclaseJavatienecomosuperclase(msomenosdirecta)alaclase
Object,cualquierclaseJavaheredaresosmtodos.

3.9.Herenciamltiple.

Endeterminadoscasospodrasconsiderarlaposibilidaddequesenecesiteheredardemsdeuna
clase,paraasdisponerdelosmiembrosdedos(oms)clasesdisjuntas(quenoderivanunadela
otra). La herencia mltiple permite hacer eso: recoger las distintas caractersticas (atributos y
mtodos)declasesdiferentesformandounanuevaclasederivadadevariasclasesbase.

El problema en estos casos es la posibilidad que existe de que se produzcan ambigedades, as, si
tuviramos miembros con el mismo identificador en clases base diferentes, en tal caso, qu

29

Utilizacinavanzadadeclases

DAW

miembro se hereda? Para evitar esto, los compiladores suelen solicitar que ante casos de
ambigedad,seespecifiquedemaneraexplcitalaclasedelacualsequiereutilizarundeterminado
miembroquepuedaserambiguo.

Ahora bien, la posibilidad de herencia mltiple no est disponible en todos


los lenguajes orientados a objetos, lo estar en Java? La respuesta es
negativa.

EnJavanoexistelaherenciamltipledeclases.

30

DesarrollodeAplicacionesWeb

Tema9

4.Clasesabstractas.
Caso prctico
Mara est desarrollando nuevas clases para el proyecto de la Clnica Veterinaria y se ha dado
cuenta de que, para aprovechar toda la potencia de la herencia, le vendra bien definir algunas
clases que, sin embargo, nunca va a llegar a instanciar: Qu raro! Estoy definiendo una clase de
la que nunca voy a tener objetos. Voy a instanciar a sus subclases, pero nunca a la superclase.
Piensa Mara en voz alta.
No te preocupes! En realidad no es tan raro. Le contesta Juan, que acaba de llegar.
Ah no? T crees?.
Totalmente. Es ms habitual de lo que piensas. Son las clases abstractas. Y si has llegado t
misma a la conclusin de que las necesitas, mejor todava, pues vas a entender con ms facilidad su
funcionamiento..
Genial! Cuntame ms.

Endeterminadasocasiones,esposiblequenecesitesdefinirunaclasequerepresenteunconceptolo
suficientementeabstractocomoparaquenuncavayanaexistirinstanciasdeella(objetos).Tendra
esosentido?Quutilidadpodratener?

Imagina una aplicacin para un centro educativo que utilice las clases de ejemplo Alumno y
Profesor, ambas subclases de Persona. Es ms que probable que esa aplicacin nunca llegue a
necesitar objetos de la clase Persona, pues seran demasiado genricos como para poder ser
utilizados(nocontendransuficienteinformacinespecfica).Podrasllegarentoncesalaconclusin
de que la clase Persona ha resultado de utilidad como clase base para construir otras clases que
heredendeella,peronocomounaclaseinstanciabledelacualvayanaexistirobjetos.Aestetipode
clasesselesllamaclasesabstractas.

En algunos casos puede resultar til disponer de clases que nunca sern instanciadas, sino que
proporcionan un marco o modelo a seguir por sus clases derivadas dentro de una jerarqua de
herencia.Sonlasclasesabstractas.

Laposibilidaddedeclararclasesabstractasesunadelascaractersticasmstilesdeloslenguajes
orientadosaobjetos,puespermitendarunaslneasgeneralesdecmoesunaclasesintenerque
implementar todos sus mtodos o implementando solamente algunos de ellos. Esto resulta
especialmente til cuando las distintas clases derivadas deban proporcionar los mismos mtodos
indicadosenlaclasebaseabstracta,perosuimplementacinseaespecficaparacadasubclase.

Imagina que ests trabajando en un entorno de manipulacin de objetos grficos y necesitas


trabajarconlneas,crculos,rectngulos,etc.Estosobjetostendrnencomnalgunosatributosque
representensuestado(ubicacin,colordelcontorno,colorderelleno,etc.)yalgunosmtodosque
modelensucomportamiento(dibujar,rellenarconuncolor,escalar,desplazar,rotar,etc.).Algunos
de ellos sern comunes para todos ellos (por ejemplo la ubicacin o el desplazamiento) y sin
embargootros(comoporejemplodibujar)necesitarnunaimplementacinespecficadependiendo
del tipo de objeto. Pero, en cualquier caso, todos ellos necesitan esos mtodos (tanto un crculo
comounrectngulonecesitanelmtododibujar,aunquesellevenacabodemaneradiferente).En
estecasoresultaramuytildisponerdeunaclaseabstractaobjetogrficodondesedefiniranlas
lneas generales (algunos atributos concretos comunes, algunos mtodos concretos comunes
implementados y algunos mtodos genricos comunes sin implementar)
de un objeto grfico y ms adelante, segn se vayan definiendo clases
especializadas(lneas,crculos,rectngulos),seirnconcretandoencada
subclase aquellos mtodos que se dejaron sin implementar en la clase
abstracta.

31

Utilizacinavanzadadeclases

DAW

Una clase abstracta no podr ser nunca instanciada. Verdadero o Falso?


Verdadero

Falso

Pordefinicinunaclaseabstractaesunaclasequenosepuedeinstanciar.Nuncapodrnexistirobjetosdeunaclaseabstracta.Laidea
esproporcionarunmarcogenricoparaotrassubclasesmsespecializadasquederivendeella.Peroporsmismanocontiene
suficienteinformacincomoparaqueexistaninstanciasdeella.

4.1.Declaracindeunaclaseabstracta.
Ya has visto que una clase abstracta es una clase que no se puede instanciar, es decir, que no se
pueden crear objetos a partir de ella. La idea es permitir que otras clases deriven de ella,
proporcionandounmodelogenricoyalgunosmtodosdeutilidadgeneral.

Lasclasesabstractassedeclaranmedianteelmodificadorabstract:
[modificador_acceso] abstract class nombreClase

[herencia] [interfaces] {

Unaclasepuedecontenerensuinteriormtodosdeclaradoscomoabstract(mtodosparaloscuales
sloseindicalacabecera,peronoseproporcionasuimplementacin).En talcaso,laclasetendr
que ser necesariamente tambin abstract. Esos mtodos tendrn que ser posteriormente
implementadosensusclasesderivadas.

Por otro lado, una clase tambin puede contener mtodos totalmente implementados (no
abstractos),loscualessernheredadosporsusclasesderivadasypodrnserutilizadossinnecesidad
dedefinirlos(puesyaestnimplementados).

Cuandotrabajesconclasesabstractasdebestenerencuenta:
9 Unaclaseabstractaslopuedeusarseparacrearnuevasclasesderivadas.Nosepuedehacerun
newdeunaclaseabstracta.Seproduciraunerrordecompilacin.
9 Unaclaseabstractapuedecontenermtodostotalmentedefinidos(noabstractos)ymtodos
sindefinir(mtodosabstractos).

Puede llamarse al constructor de una clase abstracta mediante el operador new.


Verdadero o Falso?
Verdadero

Falso

Unaclaseabstractanopuedeserinstanciadayportantonopuedellamarseasuconstructormedianteelusodenewparacrearun
nuevoobjetobasadoenella(esenciertomodounaclasesinterminar).Seproduciraunerrordecompilacin.

Ejercicioresuelto
Basndoteenlajerarquadeclasesdeejemplo(Persona,Alumno,Profesor),queyahasutilizadoen
otras ocasiones, modifica lo que consideres oportuno para que Persona sea, a partir de ahora, una
claseabstracta(noinstanciable)ylasotrasdosclasessigansiendoclasesderivadasdeella,peros
instanciables.

EnestecasolonicoquehabraquehaceresaadirelmodificadorabstractalaclasePersona.El
restodelaclasepermaneceraigualylasclasesAlumnoyProfesornotendranporqusufrirninguna
modificacin.
public abstract class Persona {
protected String nombre;
protected String apellidos;
protected GregorianCalendar fechaNacim;
...
}

ApartirdeahoranopodrnexistirobjetosdelaclasePersona.Elcompiladorgeneraraunerror.

32

DesarrollodeAplicacionesWeb

Tema9

LocalizaenlaAPIdeJavaalgnejemplodeclaseabstracta.

ExistenunagrancantidaddeclasesabstractasenlaAPIdeJava.Aqutienesunpardeejemplos:
9 Laclasejava.awt.Component:
public abstract class Component extends Object
implements ImageObserver, MenuContainer, Serializable

9 Laclasejavax.swing.AbstractButton:
public abstract class AbstractButton extends JComponent
implements ItemSelectable, SwingConstants

4.2.Mtodosabstractos.
Un mtodo abstracto (mtodo declarado en una clase para el cual esa clase no proporciona la implementacin. Si una clase
disponedealmenosunmtodoabstractosedicequeesunaclaseabstracta.Todaclasequeherede(seasubclase)deunaclaseabstracta
debeimplementartodoslosmtodosabstractosdesusuperclaseobienvolverlosadeclararcomoabstractos(yportantotambinsera
abstracta).ParadeclararunmtodoabstractoenJavaseutilizaelmodificadorabstract)esunmtodocuyaimplementacin
no se define, sino que se declara nicamente su interfaz (cabecera) para que su cuerpo sea
implementadomsadelanteenunaclasederivada.

Unmtodosedeclaracomoabstractomedianteelusodelmodificadorabstract(comoenlasclases
abstractas):
[modificador_acceso] abstract

<tipo> <nombreMetodo> ([parmetros]) [excepciones];

Estosmtodostendrnqueserobligatoriamenteredefinidos(enrealidaddefinidos,puesanno
tienencontenido)enlasclasesderivadas.Sienunaclasederivadasedejaalgnmtodoabstracto
sinimplementar,esaclasederivadasertambinunaclaseabstracta.

Cuando una clase contiene un mtodo abstracto tiene que declararse como abstracta
obligatoriamente.

ImaginaquetienesunaclaseEmpleadogenricaparadiversos
tipos de empleado y tres clases derivadas: EmpleadoFijo
(tiene un salario fijo ms ciertos complementos),
EmpleadoTemporal (salario fijo ms otros complementos
diferentes) y EmpleadoComercial (una parte de salario fijo y
unas comisiones por cada operacin). La clase Empleado
podra contener un mtodo abstracto calcularNomina, pues sabes que se mtodo ser necesario
paracualquiertipodeempleado(todoempleadocobraunanmina).Sinembargoelclculoensde
la nmina ser diferente si se trata de un empleado fijo, un empleado temporal o un empleado
comercial, y ser dentro de las clases especializadas de Empleado (EmpleadoFijo
EmpleadoTemporal,EmpleadoComercial)dondeseimplementendemaneraespecficaelclculode
lasmismas.

Debestenerencuentaaltrabajarconmtodosabstractos:
9 Unmtodoabstractoimplicaquelaclasealaquepertenecetienequeserabstracta,peroeso
nosignificaquetodoslosmtodosdeesaclasetenganqueserabstractos.
9 Un mtodo abstracto no puede ser privado (no se podra implementar, dado que las clases
derivadasnotendranaccesoal).
9 Los mtodos abstractos no pueden ser estticos, pues los mtodos estticos no pueden ser
redefinidos(ylosmtodosabstractosnecesitanserredefinidos).

33

Utilizacinavanzadadeclases

DAW

Puedes echar un vistazo a este vdeo en el se explica el funcionamiento de las clases


abstractasysemuestraunejemplodecreacinyutilizacin:
http://www.youtube.com/watch?v=1gYSk9VfUHM&feature=player_embedded
Vdeo que en el que se explica el concepto de clase abstracta a travs de algunas definiciones (clase abstracta y mtodo abstracto) y
ejemplos(claseabstractaFigurayclasesconcretasTringuloyCuadrado),ascomolasreglasquedebencumplirse:unaclaseabstractano
puedeserinstanciada;unaclasecon unmtodo abstractotienequeserobligatoriamenteabstracta;notodoslosmtodos deuna clase
abstractatienenqueserabstractos;siunaclase hereda deunaclaseabstracta, debeimplementartodossusmtodossisedeseapoder
implementarla.Porltimosecreaunejemplodeunaclaseabstractaydeunaclaseconcretaqueheredadeellaparafinalmenteutilizarlas
enunpequeoprogramadeejemplo(claseaplicacin),mostrandocmoelcompiladornosdaraunerrorsiseintentainstanciarunaclase
abstracta.

Los mtodos de una clase abstracta tienen que ser tambin abstractos. Verdadero o
Falso?
Verdadero

Falso

Unaclaseabstractapuedecontenermtodosabstractos,perotambinmtodosqueestncompletamentedefinidos(noabstractos).Lo
quesesciertoesquesiunaclasecontienealgnmtodoabstracto,entoncestendrqueserobligatoriamenteunaclaseabstracta.

Ejercicioresuelto
Basndote en la jerarqua de clases Persona, Alumno, Profesor, crea un mtodo abstracto llamado
mostrar para la clase Persona. Dependiendo del tipo de persona (alumno o profesor) el mtodo
mostrar tendr que mostrar unos u otros datos personales (habr que hacer implementaciones
especficasencadaclasederivada).
Unavezhechoesto,implementacompletamentelastresclases(contodossusatributosymtodos)y
utilzalas en un pequeo programa de ejemplo que cree un objeto de tipo Alumno y otro de tipo
Profesor,los relleneconinformaciny muestre esa informacin enlapantallaa travsdelmtodo
mostrar.

Dado que el mtodo mostrar no va a ser implementado en la clase Persona, ser declarado como
abstractoynoseincluirsuimplementacin:
protectedabstractvoidmostrar();

RecuerdaqueelsimplehechodequelaclasePersonacontengaunmtodoabstractohacequesea
claseseaabstracta(ydeberindicarsecomotalensudeclaracin):publicabstractclassPersona.

EnelcasodelaclaseAlumnohabrquehacerunaimplementacinespecficadelmtodomostrary
lomismoparaelcasodelaclaseProfesor.

1. MtodomostrarparalaclaseAlumno.
// Redefinicin del mtodo abstracto mostrar en la clase Alumno
public void mostrar () {
SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
String Stringfecha= formatoFecha.format(this.fechaNacim.getTime());
System.out.printf
System.out.printf
System.out.printf
System.out.printf
System.out.printf

("Nombre: %s\n", this.nombre);


("Apellidos: %s\n", this.apellidos);
("Fecha de nacimiento: %s\n", Stringfecha);
("Grupo: %s\n", this.grupo);
("Grupo: %5.2f\n", this.notaMedia);

2. MtodomostrarparalaclaseProfesor.
// Redefinicin del mtodo abstracto mostrar en la clase Profesor
public void mostrar () {
SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
String Stringfecha= formatoFecha.format(this.fechaNacim.getTime());

34

DesarrollodeAplicacionesWeb
System.out.printf
System.out.printf
System.out.printf
System.out.printf
System.out.printf

Tema9

("Nombre: %s\n", this.nombre);


("Apellidos: %s\n", this.apellidos);
("Fecha de nacimiento: %s\n", Stringfecha);
("Especialidad: %s\n", this.especialidad);
("Salario: %7.2f euros\n", this.salario);

3. Programadeejemplodeuso.
Unpequeoprogramadeejemplodeusodelmtodomostrarenestasdosclasespodraser:
// Declaracin de objetos
Alumno alumno;
Profesor profe;
// Creacin de objetos (llamada a constructores)
alumno= new Alumno ("Juan", "Torres", new GregorianCalendar (1990, 10, 6), "1DAM-B",
7.5);
profe= new
"Mates", 2000);

Profesor

("Antonio",

"Campos",

new

GregorianCalendar

(1970,

8,

15),

// Utilizacin del mtodo mostrar


alumno.mostrar();
profesor.mostrar();

4.3.Clasesymtodosfinales.

En unidades anteriores has visto el modificador final, aunque slo lo has utilizado por ahora para
atributos y variables (por ejemplo para declarar atributos constantes, que una vez que toman un
valoryanopuedensermodificados).Peroestemodificadortambinpuedeserutilizadoconclasesy
con mtodos (con un comportamiento que no es exactamente igual, aunque puede encontrarse
ciertaanaloga:nosepermiteheredaronosepermiteredefinir).

Unaclasedeclaradacomofinalnopuedeserheredada,esdecir,nopuedetenerclasesderivadas.
Lajerarquadeclasesalaqueperteneceacabaenella(notendrclaseshijas):
[modificador_acceso] final class nombreClase

[herencia] [interfaces]

Un mtodo tambin puede ser declarado como final, en tal caso, ese mtodo no podr ser
redefinidoenunaclasederivada:
[modificador_acceso] final <tipo> <nombreMetodo> ([parmetros]) [excepciones]

Siintentasredefinirunmtodofinalenunasubclaseseproducirunerrordecompilacin.

Los modificadores final y abstract son excluyentes en la declaracin de un mtodo.


Verdadero o Falso?
Verdadero

Falso

Nosepuedeseralavezfinalyabstract,puessiunmtodoabstract necesitaserredefinido,unmtodofinalnopermiteserlo.Serauna
contradiccin.

Adems de en la declaracin de atributos, clases y mtodos, el modificador final tambin podra


apareceracompaandoaunmtododeunparmetro.Entalcasonosepodrmodificarelvalordel
parmetrodentrodelcdigodelmtodo.Porejemplo:publicfinalmetodoEscribir(intpar1,finalint
par2).

Dadalagrancantidaddecontextosdiferentesenlosquesepuedeencontrarelmodificador
final, vale la pena que hagas un repaso de todos los lugares donde puede aparecer y cul
serasufuncinencadauno:

35

Utilizacinavanzadadeclases

DAW

Distintoscontextosenlosquepuedeaparecerelmodificadorfinal
Lugar
Funcin
Comomodificadorde
Laclasenopuedetenersubclases.
clase.
Comomodificadorde Elatributonopodrsermodificadounavezquetomeunvalor.Sirvepara
atributo.
definirconstantes.
Comomodificadoral
Elmtodonopodrserredefinidoenunaclasederivada.
declararunmtodo
Unavezquelavariabletomeunvalorreferencia(unobjeto),nosepodr
Comomodificadoral
cambiar.Lavariablesiempreapuntaralmismoobjeto,locualnoquiere
declararunavariable
decirqueeseobjetonopuedasermodificadointernamenteatravsdesus
referencia.
mtodos.Perolavariablenopodrapuntaraotroobjetodiferente.
Comomodificadoren
Elvalordelparmetro(yaseauntipoprimitivoounareferencia)nopodr
unparmetrodeun
modificarsedentrodelcdigodelmtodo.
mtodo.

Veamosunejemplodecadaposibilidad:
1. Modificadordeunaclase.
public final class ClaseSinDescendencia {

// Clase no heredable

2. Modificadordeunatributo.
public class ClaseEjemplo {
// Valor constante conocido en tiempo de compilacin
final double PI= 3.14159265;
// Valor constante conocido solamente en tiempo de ejecucin
final int SEMILLA= (int) Math.random()*10+1;

3. Modificadordeunmtodo.
public final metodoNoRedefinible (int parametro1) {

// Mtodo no redefinible

4. Modificadorenunavariablereferencia.
// Referencia constante: siempre se apuntar al mismo objeto Alumno recin creado,
// aunque este objeto pueda sufrir modificaciones.
final Alumno PRIMER_ALUMNO= new Alumno (Pepe, Torres, 9.55);
// Ref. constante
// Si la variable no es una referencia (tipo primitivo), sera una constante ms
// (como un atributo constante).
final int NUMERO_DIEZ= 10;
// Valor constante (dentro del mbito de vida de la variable)

5. Modificadorenunparmetrodeunmtodo.
void metodoConParametrosFijos (final int par1, final int par2) {
// Los parmetros par1 y par2 no podrn sufrir modificaciones aqu dentro

36

DesarrollodeAplicacionesWeb

Tema9

5.Interfaces.
Caso prctico
Mara y Juan continan con su tarea de desarrollo de clases para el proyecto de la Clnica
Veterinaria. Ya han utilizado la herencia en diversas ocasiones e incluso han escrito alguna clase
abstracta para luego generar clases especializadas basadas en ella.
Pero ahora se les ha planteado un nuevo problema: tienen pensadas algunas clases entre las que no
existe ninguna relacin de herencia, cada una hereda de unos ancestros diferentes que no tienen
nada que ver, pero, sin embargo, s podran compartir una buena parte de sus comportamientos
(mtodos). No es posible hacer que las dos hereden de la misma clase base porque hemos dicho
que no se parecen en nada a ese respecto (cada una tiene su clase base, sin relacin entre ellas), y
tampoco pueden heredar de una nueva clase abstracta que contenga la interfaz de ese
comportamiento, pues la herencia mltiple no est permitida en Java:
- "Qu hacemos entonces?, repetimos la misma interfaz en las dos jerarquas de clases? No me
cuadra tener que hacer eso...". - Le pregunta Mara a Juan.
- "A m tampoco. No me suena muy bien". - Le contesta Juan.
- "As es. Tiene que haber una solucin ms elegante que no nos haga tener que repetir ese cdigo
una y otra vez. Alguna idea?".
- "Quiz exista una forma de resolver el problema. Recuerdas que Ada nos habl el otro da de las
interfaces?".

Hasvistocmolaherenciapermitedefinirespecializaciones(oextensiones)deunaclasebaseque
yaexistesintenerquevolverarepetirdetodoelcdigodesta.Estemecanismodalaoportunidad
de que la nueva clase especializada (o extendida) disponga de toda la interfaz que tiene su clase
base.

Tambinhasestudiadocmolosmtodosabstractospermitenestablecerunainterfazparamarcar
laslneasgeneralesdeuncomportamientocomndesuperclasequedeberancompartirdetodas
lassubclases.

Sillevamosallmiteestaideadeinterfaz,podrasllegaratenerunaclaseabstractadondetodossus
mtodosfueranabstractos.Deestemodoestarasdandonicamenteelmarcodecomportamiento,
sinningnmtodoimplementado,delasposiblessubclasesqueheredarndeesaclaseabstracta.La
idea de una interfaz (o interface) es precisamente sa: disponer de un mecanismo que permita
especificarculdebeserelcomportamientoquedebentenertodoslosobjetosqueformenparte
deunadeterminadaclasificacin(nonecesariamentejerrquica).

Unainterfazconsisteprincipalmenteenunalistadedeclaracionesdemtodossinimplementar,que
caracterizanundeterminadocomportamiento.Sisedeseaqueunaclasetengaesecomportamiento,
tendrqueimplementaresosmtodosestablecidosenlainterfaz.Enestecasonosetratadeuna
relacindeherencia(laclaseAesunaespecializacindelaclaseB,olasubclaseAesdeltipodela
superclase B), sino ms bien una relacin "de implementacin de comportamientos" (la clase A
implementa los mtodos establecidos en la interfaz B, o los comportamientos indicados por B son
llevadosacaboporA;peronoqueAseadeclaseB).

Imaginaqueestsdiseandounaaplicacinquetrabajaconclasesquerepresentandistintostiposde
animales.Algunasdelasaccionesquequieresquellevenacaboestnrelacionadasconelhechode
quealgunosanimalesseandepredadores(porejemplo:observarunapresa,perseguirla,comrsela,
etc.) o sean presas (observar, huir, esconderse, etc.). Si creas la clase Len, esta clase podra
implementar una interfaz Depredador,
mientras que otras clases como Gacela
implementaran las acciones de la
interfaz Presa. Por otro lado, podras
tener tambin el caso de la clase Rana,
que implementara las acciones de la

37

Utilizacinavanzadadeclases

DAW

interfazDepredador(puesescazadordepequeosinsectos),perotambinladePresa(puespuede
sercazadoynecesitalasaccionesnecesariasparaprotegerse).

5.1.Conceptodeinterfaz.

Una interfaz en Java consiste esencialmente en una lista de declaraciones de mtodos sin
implementar,juntoconunconjuntodeconstantes.

Estos mtodos sin implementar indican un comportamiento, un tipo de conducta, aunque no


especifican cmo ser ese comportamiento (implementacin), pues eso depender de las
caractersticasespecficasdecadaclasequedecidaimplementaresainterfaz.Podradecirsequeuna
interfazseencargadeestablecerqucomportamientoshayquetener(qumtodos),peronodice
nada de cmo deben llevarse a cabo esos comportamientos (implementacin). Se indica slo la
forma,nolaimplementacin.
En cierto modo podras imaginar el concepto de interfaz como un guin que dice: "ste es el
protocolodecomunicacinquedebenpresentartodaslasclasesqueimplementenestainterfaz".Se
proporcionaunalistademtodospblicosy,siquieresdotaratuclasedeesainterfaz,tendrsque
definirtodosycadaunodeesosmtodospblicos.

En conclusin: una interfaz se encarga de establecer unas lneas generales sobre los
comportamientos (mtodos) que deberan tener los objetos de toda clase que implemente esa
interfaz,esdecir,quenoindicanloqueelobjetoes(deesoseencargalaclaseysussuperclases),
sinoacciones(capacidades)queelobjetodeberasercapazderealizar.Esporestoqueelnombre
de muchas interfaces en Java termina con sufijos del tipo "able", "or", "ente" y cosas del estilo,
quesignificanalgoascomocapacidadohabilidadparahaceroserreceptoresdealgo(configurable,
serializable,modificable,clonable,ejecutable,administrador,servidor,buscador,etc.),dandoasla
idea de que se tiene la capacidad de llevar a cabo el conjunto de acciones especificadas en la
interfaz.

Imagnate por ejemplo la clase Coche, subclase de Vehculo. Los coches son vehculos a motor, lo
cual implica una serie de acciones como, por ejemplo, arrancar el motor o detener el motor. Esa
accin no la puedes heredar de Vehculo, pues no todos los vehculos tienen porqu ser a motor
(piensaporejemploenunaclaseBicicleta),ynopuedesheredardeotraclasepuesyaheredasde
Vehculo. Una solucin podra ser crear una interfaz Arrancable, que proporcione los mtodos
tpicos de un objeto a motor (no necesariamente vehculos). De este modo la clase Coche sigue
siendo subclase de Vehculo, pero tambin implementara los comportamientos de la interfaz
Arrancable, los cuales podran ser tambin implementados por otras clases, hereden o no de
Vehculo (por ejemplo una clase Motocicleta o bien una clase Motosierra). La clase Coche
implementar su mtodo arrancar de una manera, la clase Motocicleta lo har de otra (aunque
bastante parecida) y la clase Motosierra de otra forma probablemente muy diferente, pero todos
tendrnsupropiaversindelmtodoarrancarcomopartedelainterfazArrancable.

Segnestaconcepcin,podrashacertelasiguientepregunta:podrunaclaseimplementarvarias
interfaces?Larespuestaenestecasosesafirmativa.

Una clase puede adoptar distintos modelos de comportamiento establecidos en diferentes


interfaces.Esdecirunaclasepuedeimplementarvariasinterfaces.

Una interfaz en Java no puede contener la implementacin de un mtodo mientras que


una clase abstracta s. Verdadero o Falso?

38

DesarrollodeAplicacionesWeb

Verdadero

Tema9
Falso

Unainterfaznopuededefinirmtodos(noimplementasucontenido),tansololosdeclara.Sinembargoenunaclaseabstractase
puedendejaralgunosmtodossinimplementar(mtodosabstractos)eimplementarotros.

5.1.1.Claseabstractaointerfaz?

Observando el concepto de interfaz que se acaba de proponer, podra caerse en la tentacin de


pensarqueesprcticamentelomismoqueunaclaseabstractaenlaquetodossusmtodossean
abstractos.

Esciertoqueenesesentidoexisteungranparecidoformalentreunaclaseabstractayunainterfaz,
pudindoseenocasionesutilizarindistintamenteunauotraparaobtenerunmismofin.Pero,apesar
deesegranparecido,existenalgunasdiferencias,nosloformales,sinotambinconceptuales,muy
importantes:
9 Una clase no puede heredar de varias clases, aunque sean abstractas (herencia mltiple). Sin
embargospuedeimplementarunaovariasinterfacesyademsseguirheredandodeunaclase.
9 Una interfaz no puede definir mtodos (no implementa su contenido), tan solo los declara o
enumera.
9 Una interfaz puede hacer que dos clases tengan un mismo comportamiento
independientementedesusubicacionesenunadeterminadajerarquadeclases(notienenque
heredar las dos de una misma superclase, pues no siempre es posible segn la naturaleza y
propiedadesdecadaclase).
9 Unainterfazpermiteestableceruncomportamientodeclasesinapenasdardetalles,puesesos
detallesannosonconocidos(dependerndelmodoenquecadaclasedecidaimplementarla
interfaz).
9 Lasinterfacestienensupropiajerarqua,diferenteeindependientedelajerarquadeclases.

Detodoestopuedededucirsequeunaclaseabstractaproporcionaunainterfazdisponibleslo a
travs de la herencia. Slo quien herede de esa clase abstracta dispondr de esa interfaz. Si una
clase no pertenece a esa misma jerarqua (no hereda de ella) no podr tener esa interfaz. Eso
significaqueparapoderdisponerdelainterfazpodras:

1. Volveraescribirlaparaesajerarquadeclases.Locualnopareceunabuenasolucin.
2. Hacer que la clase herede de la superclase que proporciona la interfaz que te interesa,
sacndola de su jerarqua original y convirtindola en clase derivada de algo de lo que
conceptualmente no debera ser una subclase. Es decir, estaras forzando una relacin "es
un" cuando en realidad lo ms probable es que esa relacin no exista. Tampoco parece la
mejorformaderesolverelproblema.

Sinembargo,unainterfazspuedeserimplementadaporcualquierclase,permitiendoqueclases
que no tengan ninguna relacin entre s (pertenecen a distintas jerarquas) puedan compartir un
determinado comportamiento (una interfaz) sin tener que forzar una relacin de herencia que no
existeentreellas.

A partir de ahora podemos hablar de otra posible relacin entre clases: la de compartir un
determinado comportamiento (interfaz). Dos clases podran tener en comn un determinado
conjuntodecomportamientossinquenecesariamenteexistaunarelacinjerrquicaentreellas.Tan
solocuandohayarealmenteunarelacindetipo"esun"seproducirherencia.

Sislovasaproporcionarunalistademtodosabstractos(interfaz),sindefinicionesdemtodos
ni atributos de objeto, suele ser recomendable definir una interfaz antes que clase abstracta. Es

39

Utilizacinavanzadadeclases

DAW

ms,cuandovayasadefinirunasupuestaclasebase,puedescomenzardeclarndolacomointerfaz
y slo cuando veas que necesitas definir mtodos o variables miembro, puedes entonces
convertirlaenclaseabstracta(noinstanciable)oinclusoenunaclaseinstanciable.

En Java una clase no puede heredar de ms de una clase abstracta ni implementar ms


de una interfaz. Verdadero o Falso?
Verdadero

Falso

Aunqueesciertoquesolamentesepuedeheredardeunaclase(seaabstractaono),unaclaseJavas puedeimplementarvarias
interfaces(tantascomosequiera).

5.2.Definicindeinterfaces.
LadeclaracindeunainterfazenJavaessimilaraladeclaracindeunaclase,aunqueconalgunas
variaciones:
9 Seutilizalapalabrareservadainterfaceenlugardeclass.
9 Puedeutilizarseelmodificadorpublic.Siincluyeestemodificadorlainterfazdebetenerelmismo
nombre que el archivo .java en el que se encuentra (exactamente igual que suceda con las
clases).Sinoseindicaelmodificadorpublic,elaccesoserporomisino"depaquete"(como
sucedaconlasclases).
9 Todoslosmiembrosdelainterfaz(atributosymtodos)sonpublicdemaneraimplcita.Noes
necesarioindicarelmodificadorpublic,aunquepuedehacerse.
9 Todos los atributos son de tipo final y public (tampoco es necesario especificarlo), es decir,
constantesypblicos.Hayquedarlesunvalorinicial.
9 Todoslosmtodossonabstractostambindemaneraimplcita(tampocohayqueindicarlo).No
tienencuerpo,tansololacabecera.

Como puedes observar, una interfaz consiste esencialmente en una lista de atributos finales
(constantes)ymtodosabstractos(sinimplementar).Susintaxisquedaraentonces:
[public] interface <NombreInterfaz> {
[public] [final] <tipo1> <atributo1>=
[public] [final] <tipo2> <atributo2>=
...
[public] [abstract] <tipo_devuelto1>
[public] [abstract] <tipo_devuelto2>
...
}

40

<valor1>;
<valor2>;
<nombreMetodo1> ([lista_parmetros]);
<nombreMetodo2> ([lista_parmetros]);

DesarrollodeAplicacionesWeb

Tema9

Sitefijas,ladeclaracindelosmtodosterminaenpuntoycoma,puesnotienencuerpo,aligual
quesucedeconlosmtodosabstractosdelasclasesabstractas.

ElejemplodelainterfazDepredadorquehemosvistoantespodraquedarentoncesas:
public interface Depredador {
void localizar (Animal presa);
void cazar (Animal presa);
...
}

Sernlasclasesqueimplementenestainterfaz(Len,Leopardo,Cocodrilo,Rana,Lagarto,Hombre,
etc.)lasquedefinancadaunodelosmtodospordentro.

Los mtodos de una interfaz en Java tienen que ser obligatoriamente declarados como
public y abstract. Si no se indica as, se producir un error de compilacin. Verdadero
o Falso?
Verdadero

Falso

Noesnecesariohacerlo.Todoslosmtodosdeunainterfazsernsiemprepublicyabstractaunquenoseindique.Elcompiladorlo
considerarasdeformaimplcita.Loquesproduciraunerrordecompilacinseralacolocacindeunmodificadordeaccesodiferente
apublic(porejemploprivateoprotected)oelempleodelmodificadorstatic.Perosinoseindicanada,elmtodoserpublicyabstract.

Ejercicioresuelto
CreaunainterfazenJavacuyonombreseaImprimibleyquecontengaalgunosmtodostilespara
mostrarelcontenidodeunaclase:
1. Mtodo devolverContenidoString, que crea un String con una representacin de todo el
contenido pblico (o que se decida que deba ser mostrado) del objeto y lo devuelve. El
formato ser una lista de pares "nombre=valor" de cada atributo separado por comas y la
lista completa encerrada entre llaves: "{<nombre_atributo_1>=<valor_atributo_1>, ...,
<nombre_atributo_n>=<valor__atributo_n>}".
2. MtododevolverContenidoArrayList,quecreaunArrayListdeStringconunarepresentacin
de todo el contenido pblico (o que se decida que deba ser mostrado) del objeto y lo
devuelve.
3. Mtodo devolverContenidoHashtable, similar al anterior, pero en lugar devolver en un
ArrayList los valores de los atributos, se devuelve en una Hashtable en forma de pares
(nombre,valor).

Setratasimplementededeclararlainterfazeincluirensuinterioresostresmtodos:

public interface Imprimible {


String devolverContenidoString ();
ArrayList devolverContenidoArrayList ();
HashTable devolverContenidoHashtable ();
}

Elcmoseimplementarncadaunodeesosmtodosdependerexclusivamentedecadaclaseque
decidaimplementarestainterfaz.

5.3.Implementacindeinterfaces.
Como ya has visto, todas las clases que implementan una determinada interfaz estn obligadas a
proporcionarunadefinicin(implementacin)delosmtodosdeesainterfaz,adoptandoelmodelo
decomportamientopropuestoporsta.

41

Utilizacinavanzadadeclases

DAW

Dada una interfaz, cualquier clase puede especificar dicha interfaz mediante el mecanismo
denominadoimplementacindeinterfaces.Paraelloseutilizalapalabrareservadaimplements:
class NombreClase implements NombreInterfaz {

De esta manera, la clase est diciendo algo as como "la interfaz indica los mtodos que debo
implementar,perovoyaseryo(laclase)quienlosimplemente".

Esposibleindicarvariosnombresdeinterfacesseparndolosporcomas:
class NombreClase implements NombreInterfaz1, NombreInterfaz2,... {

Cuandounaclaseimplementaunainterfaz,tienequeredefinirsusmtodosnuevamenteconacceso
pblico. Con otro tipo de acceso se producir un error de compilacin. Es decir, que del mismo
modo que no se podan restringir permisos de acceso en la herencia de clases, tampoco se puede
hacerenlaimplementacindeinterfaces.

Unavezimplementadaunainterfazenunaclase,losmtodosdeesainterfaztienenexactamenteel
mismo tratamiento que cualquier otro mtodo, sin ninguna diferencia, pudiendo ser invocados,
heredados,redefinidos,etc.

En el ejemplo de los depredadores, al definir la clase Len, habra que indicar que implementa la
interfazDepredador:
class Leon implements Depredador {

Yensuinteriorhabraqueimplementaraquellosmtodosquecontengalainterfaz:
void localizar (Animal presa) {
// Implementacin del mtodo localizar para un len
...
}

EnelcasodeclasesquepudieranseralavezDepredadoryPresa,tendranqueimplementarambas
interfaces,comopodrasucederconlaclaseRana:
class Rana implements Depredador, Presa {

Y en su interior habra que implementar aquellos mtodos que contengan ambas interfaces, tanto
lasdeDepredador(localizar,cazar,etc.)comolasdePresa(observar,huir,etc.).

Qu palabra reservada se utiliza en Java para indicar que una clase va a definir los
mtodos indicados por una interfaz?
implements
uses
extends
Losmtodosindicadosporunainterfaznosedefinenenlasclasespuesslosepueden
utilizardesdelapropiainterfaz

Ejercicioresuelto
Haz que las clases Alumno y Profesor implementen la interfaz Imprimible que se ha escrito en el
ejercicioanterior.

La primera opcin que se te puede ocurrir es pensar que en ambas clases habr que indicar que
implementan la interfaz Imprimible y por tanto definir los mtodos que sta incluye:
devolverContenidoString,devolverContenidoHashtableydevolverContenidoArrayList.

42

DesarrollodeAplicacionesWeb

Tema9

SilasclasesAlumnoyProfesornoheredarandelamismaclasehabraquehacerloobligatoriamente
as,puesnocompartensuperclaseyprecisamenteparaesosirvenlasinterfaces:paraimplementar
determinadoscomportamientosquenopertenecenalaestructurajerrquicadeherenciaenlaque
seencuentraunaclase(deestamanera,clasesquenotienenningunarelacindeherenciapodran
compartirinterfaz).

Peroenestecasopodramosaprovecharqueambasclasesssonsubclasesdeunamismasuperclase
(heredan de la misma) y hacer que la interfaz Imprimible sea implementada directamente por la
superclase (Persona) y de este modo ahorrarnos bastante cdigo. As no hara falta indicar
explcitamentequeAlumnoyProfesorimplementanlainterfazImprimible,puesloestarnhaciendo
de forma implcita al heredar de una clase que ya ha implementado esa interfaz (la clase Persona,
queespadredeambas).

UnavezquelosmtodosdelainterfazestnimplementadosenlaclasePersona,tansolohabrque
redefinir o ampliar los mtodos de la interfaz para que se adapten a cada clase hija especfica
(AlumnooProfesor),ahorrndonostenerqueescribirvariasveceslapartedecdigoqueobtienelos
atributosgenricosdelaclasePersona.

1. ClasePersona.
IndicamosquesevaaimplementarlainterfazImprimible:
public abstract class Persona implements
...

Imprimible {

Definimos el mtodo devolverContenidoHashtable a la manera de como debe ser implementado


paralaclasePersona.Podraquedar,porejemplo,as:
public Hashtable devolverContenidoHashtable () {
// Creamos la Hashtable que va a ser devuelta
Hashtable contenido= new Hashtable ();
// Aadimos los atributos de la clase
SimpleDateFormat formatoFecha = new SimpleDateFormat("dd/MM/yyyy");
String stringFecha= formatoFecha.format(this.fechaNacim.getTime());
contenido.put ("nombre", this.nombre);
contenido.put ("apellidos", this.apellidos);
contenido.put ("fechaNacim", stringFecha);
// Devolvemos la Hashtable
return contenido;
}

Delmismomodo,definimostambinelmtododevolverContenidoArrayList:
public ArrayList devolverContenidoArrayList () { ... }

YporltimoelmtododevolverContenidoString:
public String devolverContenidoString () { ... }

2. ClaseAlumno.
EstaclaseheredadelaclasePersona,demaneraqueheredarlostresmtodosanteriores.Tansolo
habr que redefinirlos para que, aprovechando el cdigo ya escrito en la superclase, se aada la
funcionalidadespecficaqueaportaestasubclase.

public class Alumno extends Persona {


...

43

Utilizacinavanzadadeclases

DAW

Como puedes observar no ha sido necesario incluir el implements Imprimible, pues el extends
PersonalollevaimplcitodadoquePersonayaimplementabaeseinterfaz.Loqueharemosentonces
serllamaralmtodoqueestamosredefiniendoutilizandolareferenciaalasuperclasesuper.

ElmtododevolverContenidoHashtablepodraquedar,porejemplo,as:
public Hashtable devolverContenidoHashtable () {
// Llamada al mtodo de la superclase
Hashtable contenido= super.devolverContenidoHashtable();
// Aadimos los atributos especficos de la clase
contenido.put ("grupo", this.salario);
contenido.put ("notaMedia", this.especialidad);
// Devolvemos la Hashtable rellena
return contenido;
}

3. ClaseProfesor.
En este caso habra que proceder exactamente de la misma manera que con la clase Alumno:
redefiniendo los mtodos de la interfaz Imprimible para aadir la funcionalidad especfica que
aportaestasubclase.

Desdeelsiguienteenlacepuedesdescargarunejemplocompletoenelqueseimplementalainterfaz
ImprimibleenlaclasePersonaycmosussubclasesAlumnoyProfesorredefinenlosmtodosdeesa
interfazheredadadePersona.

5.3.1.Unejemplodeimplementacindeinterfaces:lainterfazActionListener.

EltrabajoconinterfacesesalgohabitualeneldesarrollodeaplicacionesenJava.Esportantomuy
importante comprender correctamente su funcionamiento y la interaccin con las distintas
bibliotecas(paquetesdeclaseseinterfaces)queproporcionanlasAPIs.Estasclaseseinterfacesson
fundamentales para la creacin de aplicaciones y tendrs que utilizarlas en multitud de ocasiones
(adems,porsupuesto,delasquetengasquedesarrollarportimismo).

Cloneable

Object

Cloneable

Enumeration

Vector
Enumerator

BitSet
Dictionary

Vector
Hashtable
Entry

Hashtable
Enumerator

Hashtable

Stack
Cloneable

Properties

44

Observable

Enumeration

ObserverList

DesarrollodeAplicacionesWeb

Tema9

Vamos a ver un ejemplo de una interfaz proporcionada por la API de Java que puede ser
implementadaporalgunaclasecreadaportidentrodeunapequeaaplicacin.Hemosescogidola
interfazActionListener.

LainterfazActionListeneryalahasutilizadoenlaunidaddedicadaalasinterfacesgrficas.Lasclases
quequieranrealizarunadeterminadaaccincadavezqueseproduzcaciertoeventoenelsistema
debenimplementarestainterfaz.EstetipodeinterfacesseencuentrandentrodelosEventListeners
u "oyentes de eventos" y son tiles para detectar que se ha producido un determinado evento
asncrono durante la ejecucin de tu aplicacin (pulsacin de una tecla, clic de ratn, etc.). Son
intensivamenteutilizadaseneldesarrollodelasinterfacesgrficasdeusuario.

Esinteresantequerepaseslosconceptosvistosenelmodelodegestindeeventosexplicadoenla
unidaddedicadalasinterfacesgrficas:evento,oyente,gestindeeventos,etc.

SideseasprofundizaralgomseneltemadelosEventListenerspuedesecharunvistazoa
los tutoriales de iniciacin de Java en el sitio web de Oracle (en ingls) en el que se
explicandetalladamenteejemplossencillosascomootrosbastantemscomplejos:
http://docs.oracle.com/javase/tutorial/uiswing/events/intro.html

Vamosaverunejemplolomssencilloposible:setratadedesarrollarunapequeaaplicacinde
escritorio (utilizando la API de Swing) con una ventana que contenga un par de botones y que al
pulsaralgunodeesosbotones(evento),laaplicacinseacapazdedetectarquesehaproducidoese
evento y por tanto realizar una determinada accin (por ejemplo generar un sonido o mostrar un
determinadotexto).

Paraelloesnecesarioquelaclasequevayaagestionareleventoseaun"oyente"deeseevento,es
decir,queseacapazdeenterarsedequesehaproducidoeseevento.Esacapacidadohabilidadla
proporciona la API de Java a travs de las interfaces de tipo "oyente". En concreto vamos a
implementarlainterfazActionListener.

LainterfaceActionListenercontieneunnico
mtodo:actionPerformed.Toda clase Wque
implemente esta interfaz tendr que definir
ese mtodo. Si incrustamos un determinado
objeto grfico G en una ventana W y
asociamos a ese objeto grfico la clase W,
indicando que es su oyente y gestor de
eventos, cuando se produzca algn evento
sobre G se ejecutar el mtodo
actionPerformedimplementadoporW.

Ennuestroejemplopodramoshacerlosiguiente:
9 Definir una ventana principal, por ejemplo una
clasebasadaeneltipomarcooframe(subclasede
JFrame)queimplementelainterfazActionListener.
9 Definir uno o varios botones (objetos de la clase
JButton)dentrodelaventana.
9 Asociarcomooyentealosobjetosdetipobotnla
propia ventana principal (frame), pues va a ser
capazdegestionareventos(implementaelmtodo

45

Utilizacinavanzadadeclases

DAW

actionPerformed).
9 ImplementarelmtodoactionPerformedcomounmtododelaventanaprincipal(frame)para
reaccionar de algn modo cuando se produzca algn
evento desencadenado por un botn (pues se ha
establecidoalaventanaprincipalcomooyenteygestora
deloseventosdelbotn).

Ejemplo de implementacin de la interfaz ActionListener


CreamosunnuevoproyectoJavadetipo
AplicacindeescritorioJava
Creamosunaclaseprincipalqueherede
deJFrameeincluimoslasbibliotecasde
laintefazgrfica

Incrustamosalgunoscomponentes
grficosenelframequeacabamosde
crear

Asignamosoyentesaloscomponentes
grficos

Implementamoselmtodo
actionPerformed

Implementamoselmtodomain

46

DesarrollodeAplicacionesWeb

Tema9

5.4.Simulacindelaherenciamltiplemedianteelusodeinterfaces.
Unainterfaznotieneespaciodealmacenamientoasociado(nosevanadeclararobjetosdeuntipo
deinterfaz),esdecir,notieneimplementacin.

Enalgunasocasionesesposiblequeintereserepresentarlasituacindeque"unaclaseXesdetipo
A,detipoB,ydetipoC",siendoA,B,Cclasesdisjuntas(noheredanunasdeotras).Hemosvistoque
serauncasodeherenciamltiplequeJavanopermite.

Parapodersimularalgoas,podrasdefinirtresinterfacesA,B,Cqueindiquenloscomportamientos
(mtodos) que se deberan tener segn se pertenezca a una supuesta clase A, B, o C, pero sin
implementarningnmtodoconcretoniatributosdeobjeto(slointerfaz).

DeestamaneralaclaseXpodraalavez:
1. Implementar las interfaces A, B, C, que la dotaran de
loscomportamientosquedeseabaheredardelasclases
A,B,C.
2. Heredar de otra clase Y, que le proporcionara determinadas caractersticas dentro de su
taxonomaojerarquadeobjeto(atributos,mtodosimplementadosymtodosabstractos).

EnelejemploquehemosvistodelasinterfacesDepredadoryPresa,tendrasunejemplodeesto:la
clase Rana, que es subclase de Anfibio, implementa una serie de comportamientos propios de un
Depredador y, a la vez, otros ms propios de una Presa. Esos comportamientos (mtodos) no
formanpartedelasuperclaseAnfibio,sinodelasinterfaces.SisedecidequelaclaseRanadebede
llevaracaboalgunosotroscomportamientosadicionales,podranaadirseaunanuevainterfazyla
claseRanaimplementaraunatercerainterfaz.

De este modo, con el mecanismo "una herencia pero varias interfaces", podran conseguirse
resultadossimilaresalosobtenidosconlaherenciamltiple.

Ahorabien,delmismomodoquesucedaconlaherenciamltiple,puededarseelproblemadela
colisin de nombres al implementar dos interfaces que tengan un mtodo con el mismo
identificador.Entalcasopuedesucederlosiguiente:
9 Si los dos mtodos tienen diferentes parmetros no habr problema aunque tengan el mismo
nombrepuesserealizaunasobrecargademtodos.
9 Si los dos mtodos tienen un valor de retorno de un tipo diferente, se producir un error de
compilacin(aligualquesucedeenlasobrecargacuandolanicadiferenciaentredosmtodos
essa).

Silosdosmtodossonexactamenteigualesenidentificador,parmetrosytipodevuelto,entonces
solamentesepodrimplementarunodelosdosmtodos.Enrealidadsetratadeunsolomtodo
pues ambos tienen la misma interfaz (mismo identificador, mismos parmetros y mismo tipo
devuelto).

La utilizacin de nombres idnticos en diferentes interfaces que pueden ser implementadas a la


vez por una misma clase puede causar, adems del problema de la colisin de nombres,
dificultades de legibilidad en el cdigo, pudiendo dar lugar a confusiones. Si es posible intenta
evitarqueseproduzcanestetipodesituaciones.

Dada una clase Java que implementa dos interfaces diferentes que contienen un mtodo
con el mismo nombre, indicar cul de las siguientes afirmaciones es correcta.

Silosdosmtodostienenunvalorderetornodeuntipodiferente,seproducirunerror

47

Utilizacinavanzadadeclases

DAW

decompilacin.
Silosdosmtodostienenunvalorderetornodeuntipodiferente,seimplementarndos

mtodos.
Silosdosmtodossonexactamenteigualesenidentificador,parmetrosytipodevuelto,

seproducirunerrordecompilacin.
Silosdosmtodostienendiferentesparmetrosseproducirunerrordecompilacin.

Seproduceunerrordecompilacin puesenlasobrecarga seutilizanlosparmetrosparadistinguirunosmtodosdeotros,peronoel


valorderetorno.

Ejercicioresuelto
LocalizaenlaAPIdeJavaalgnejemplodeclasequeimplementevariasinterfacesdiferentes(puedes
consultarladocumentacindereferenciadelaAPIdeJava).

Existen una gran cantidad de clases en la API de Java que implementan mltiples interfaces. Aqu
tienesunpardeejemplos:
9 La clase javax.swing.JFrame, que implementa las interfaces WindowConstants, Accessible y
RootPaneContainer:
publicclassJFrameextendsFrame
implementsWindowConstants,Accessible,RootPaneContainer
9 La clase java.awt.omponent, que implementa las interfaces ImageObserver, MenuContainer y
Serializable:
publicabstractclassComponentextendsObject
implementsImageObserver,MenuContainer,Serializable

5.5.Herenciadeinterfaces.
Las interfaces, al igual que las clases, tambin permiten la herencia. Para indicar que una interfaz
hereda de otra se indica nuevamente con la palabra reservada extends. Pero en este caso s se
permitelaherenciamltipledeinterfaces.Siseheredademsdeunainterfazseindicaconlalista
deinterfacesseparadasporcomas.

Porejemplo,dadaslasinterfacesInterfazUnoeInterfazDos:
public interface InterfazUno {
// Mtodos y constantes de la interfaz Uno
}

public interface InterfazDos {


// Mtodos y constantes de la interfaz Dos
}

Podradefinirseunanuevainterfazqueheredaradeambas:
public interface InterfazCompleja extends InterfazUno, InterfazDos {
// Mtodos y constantes de la interfaz compleja
}

En Java no est permitida la herencia mltiple ni para clases ni para interfaces.


Verdadero o Falso?

48

Verdadero

Falso

DesarrollodeAplicacionesWeb

Tema9

Ejercicioresuelto
Localiza enlaAPIde Javaalgn ejemplodeinterfazqueheredede unaovariasinterfaces (puedes
consultarladocumentacindereferenciadelaAPIdeJava).

Existen una gran cantidad de interfaces en la API de Java que heredan de otras interfaces. Aqu
tienesunpardeejemplos:

9 Lainterfazjava.awt.event.ActionListener,queheredadejava.util.EventListener:
public interface ActionListener extends EventListener

La interfaz org.omg.CORBA.Policy, que hereda de org.omg.CORBA.PolicyOperations,


org.omg.CORBA.Objectyorg.omg.CORBOA.portable.IDLEntity:

public interface Policy extends PolicyOperations, Object, IDLEntity.

49

Utilizacinavanzadadeclases

DAW

6.Polimorfismo.

Caso prctico
Mara est desarrollando algunas clases que representan categoras de animales para el proyecto de
la Clnica Veterinaria. En algunos casos declara objetos de un tipo de animal y en ciertas ocasiones
de otros, segn las necesidades que tenga en cada momento. La clase Animal es demasiado
genrica como para poder utilizarla en determinados casos y necesita clases ms especficas para
poder trabajar pues tendr que usar unas u otras versiones de sus mtodos. Juan tambin est
haciendo algo parecido y ambos intuyen que el cdigo que estn escribiendo podra ser mucho ms
sencillo y flexible si pudieran declarar inicialmente objetos de la clase Animal y ms tarde, durante la
ejecucin de la aplicacin, utilizar objetos de tipo Animal, pero de clases ms especializadas
(subclases de Animal) en funcin de lo que suceda en cada momento. Sera muy interesante poder
hacer algo as. Ada lleva algunos minutos escuchndolos y decide intervenir:
- "Veo que habis llegado a la conclusin de que necesitis trabajar con objetos cuya clase an no
est clara en tiempo de compilacin, no?". - Les pregunta a ambos.
- "As es. Pero eso no se puede hacer, el compilador no nos lo va a permitir". - Le responden casi al
unsono.
- "Bueno, es lgico que el compilador tenga que saber a qu clase pertenece un objeto para poder
analizar si se est accediendo a los miembros correctos y con la sintaxis apropiada, no crees?". Les vuelve a preguntar.
- "Totalmente de acuerdo.". - Le contesta Mara.
- "Pero si declaramos un objeto de una clase que sea superclase de otras, quiz podramos ms
tarde intentar para ese objeto instanciar una subclase ms especfica. Al fin y al cabo, una clase de
tipo MascotaDomstica sigue siendo tambin Animal, pues ha heredado de ella, no es as?".
- "Quieres decir que podramos utilizar en el programa objetos de clases cuyos mtodos llamados no
sabemos exactamente cules van a ser porque depender de la subclase concreta que se instancie
en tiempo de ejecucin?". - Le responde Mara muy interesada.
- "Parece que ha llegado el momento de que empecis a trabajar con el polimorfismo y la ligadura
dinmica (la vinculacin que se produce en la llamada a un mtodo con la clase a la que pertenece ese mtodo se
realiza en tiempo de ejecucin. Es decir, que al generar el cdigo ejecutable no se conoce exactamente el mtodo (a qu
clase pertenece) que ser llamado. Slo se sabr cuando el programa est en ejecucin.)". - Les contesta satisfecha.

ElpolimorfismoesotrodelosgrandespilaressobrelosquesesustentalaProgramacinOrientadaa
Objetos (junto con la encapsulacin y la herencia). Se trata nuevamente de otra forma ms de
establecerdiferenciasentreinterfazeimplementacin,esdecir,entreelquyelcmo.

Laencapsulacintehapermitidoagruparcaractersticas(atributos)ycomportamientos(mtodos)
dentrodeunamismaunidad(clase),pudiendodarlesunmayoromenorcomponentedevisibilidad,
ypermitiendosepararalmximoposiblelainterfazdelaimplementacin.Porotroladolaherencia
te ha proporcionado la posibilidad de tratar a los objetos como pertenecientes a una jerarqua de
clases.Estacapacidadvaaserfundamentalalahoradepodermanipularmuchosposiblesobjetosde
clasesdiferentescomosifuerandelamismaclase(polimorfismo).

El polimorfismo te va a permitir mejorar la organizacin y la legibilidad del cdigo as como la


posibilidaddedesarrollaraplicacionesqueseanmsfcilesdeampliaralahoradeincorporarnuevas
funcionalidades.Silaimplementacin ylautilizacindelasclaseseslosuficientemente genricay
extensiblesermssencillopodervolveraestecdigoparaincluirnuevosrequerimientos.

Cul de las siguientes caractersticas diras que no es una de las que se suelen
considerar como uno de los tres grandes pilares de la Programacin Orientada a
Objetos?
Recursividad
Herencia
Polimorfismo

50

DesarrollodeAplicacionesWeb

Tema9

Encapsulacin

6.1.Conceptodepolimorfismo.

El polimorfismo consiste en la capacidad de poder utilizar una referencia a un objeto de una


determinadaclasecomosifueradeotraclase(enconcretounasubclase).Esunamaneradedecir
queunaclasepodratenervarias(poli)formas(morfismo).

Un mtodo "polimrfico" ofrece la posibilidad de ser distinguido (saber a qu clase pertenece) en


tiempodeejecucinenlugardeentiempodecompilacin.Parapoderhaceralgoasesnecesario
utilizar mtodos que pertenecen a una superclase y que en cada subclase se implementan de una
formaenparticular.Entiempodecompilacinseinvocaralmtodosinsaberexactamentesiser
eldeunasubclaseuotra(puesseestinvocandoaldelasuperclase).Sloentiempodeejecucin
(unavezinstanciadaunauotrasubclase)seconocerrealmentequmtodo(dequsubclase)esel
quefinalmentevaaserinvocado.

Esta forma de trabajar te va a permitir hasta cierto punto "desentenderte" del tipo de objeto
especfico(subclase)paracentrarteeneltipodeobjetogenrico(superclase).Deestemodopodrs
manipularobjetoshastaciertopunto"desconocidos"entiempodecompilacinyqueslodurantela
ejecucindelprogramasesabrexactamentedequtipodeobjeto(subclase)setrata.

Elpolimorfismoofrecelaposibilidaddequetodareferenciaaunobjetodeunasuperclasepueda
tomarlaformadeunareferenciaaunobjetodeunadesussubclases.Estotevaapermitirescribir
programasqueprocesenobjetosdeclasesqueformenpartedelamismajerarquacomositodos
fueranobjetosdesussuperclases.

Elpolimorfismopuedellevarseacabotantoconsuperclases(abstractasono)comoconinterfaces.

Dada una superclase X, con un mtodo m, y dos subclases A y B, que redefinen ese mtodo m,
podrasdeclararunobjetoOdetipoXqueendurantelaejecucinpodrserdetipoAodetipoB
(algo desconocido en tiempo de compilacin). Esto significa que al invocarse el mtodo m de X
(superclase),seestarenrealidadinvocandoalmtodomdeAodeB(algunadesussubclases).Por
ejemplo:

// Declaracin de una referencia a un objeto de tipo X


ClaseX obj; // Objeto de tipo X (superclase)
...
// Zona del programa donde se instancia un objeto de tipo A (subclase) y se le asigna a la
referencia obj.
// La variable obj adquiere la forma de la subclase A.
obj = ClaseA ();
...
// Otra zona del programa.
// Aqu se instancia un objeto de tipo B (subclase) y se le asigna a la referencia obj.
// La variable obj adquiere la forma de la subclase B.
obj = ClaseB ();
...
// Zona donde se utiliza el mtodo m sin saber realmente qu subclase se est utilizando.
// (Slo se sabr durante la ejecucin del programa)

51

Utilizacinavanzadadeclases
obj.m ()
...

DAW

// Llamada al mtodo m (sin saber si ser el mtodo m de A o de B).

ImaginaqueeststrabajandoconlasclasesAlumnoyProfesoryqueendeterminadazonadelcdigo
podrastenerobjetos,tantodeuntipocomodeotro,peroesoslosesabrsegnvayadiscurriendo
laejecucindelprograma.Enalgunoscasos,esposiblequeundeterminadoobjetopudieraserdela
clase Alumno y en otros de la clase Profesor, pero en cualquier caso sern objetos de la clase
Persona. Eso significa que la llamada a un mtodo de la clase Persona (por ejemplo
devolverContenidoString)enrealidadserenunoscasosaunmtodo(conelmismonombre)dela
claseAlumnoy,enotros,aunmtodo(conelmismonombretambin)delaclaseProfesor.Estoser
posiblehacerlograciasalaligaduradinmica.

El polimorfismo ofrece la posibilidad de que toda referencia a un objeto de una clase A


pueda tomar la forma de una referencia a un objeto de cualquier otra clase B.
Verdadero o Falso?
Verdadero

Falso

ParaqueesopuedasucederlaclaseBdebesersubclasedeA.Encualquierotrocasonofuncionara.

6.2.Ligaduradinmica.

Laconexinquetienelugarduranteunallamadaaunmtodosueleserllamadaligadura(conexin o
vinculacinquetienelugarduranteunallamadaaunmtodoparasaberqucdigodebeserejecutado.Puedeserestticaodinmica),
vinculacin o enlace (en ingls binding). Si esta vinculacin se lleva a cabo durante el proceso de
compilacin,selesuelellamarligaduraesttica(lavinculacinqueseproduceenlallamadaaunmtodoconlaclasea
la que pertenece ese mtodo se realiza en tiempo de compilacin. Es decir, que antes de generar el cdigo ejecutable se conoce
exactamenteelmtodo(aquclasepertenece)queserllamado.Tambinconocidocomovinculacintemprana).Enloslenguajes
tradicionales, no orientados a objetos, sta es la nica forma de poder resolver la ligadura (en
tiempodecompilacin).Sinembargo,enloslenguajesorientadosaobjetosexisteotraposibilidad:
laligaduradinmica(la vinculacin que se produce en la llamada a un mtodo con la clase a la que pertenece ese mtodo se
realizaentiempodeejecucin.Esdecir,quealgenerarelcdigoejecutablenoseconoceexactamenteelmtodo(aquclasepertenece)
queserllamado.Slosesabrcuandoelprogramaestenejecucin.Tambinconocidacomovinculacintarda, enlacetardoolate
binding).

La ligadura dinmica hace posible que sea el tipo de objeto instanciado (obtenido mediante el
constructorfinalmenteutilizadoparacrearelobjeto)ynoeltipodelareferencia(eltipoindicadoen
ladeclaracindelavariablequeapuntaralobjeto)loquedeterminequversindelmtodovaa
serinvocada.Eltipodeobjetoalqueapuntalavariabledetiporeferenciaslopodrserconocido
durantelaejecucindelprogramayporesoelpolimorfismonecesitalaligaduradinmica.

En el ejemplo anterior de la clase X y sus subclases A y B, la llamada al mtodo m slo puede


resolverse mediante ligadura dinmica, pues es imposible saber en tiempo de compilacin si el
mtodomquedebeserinvocadosereldefinidoenlasubclaseAoeldefinidoenlasubclaseB:

// Llamada al mtodo m (sin saber si ser el mtodo m de A o de B).


obj.m () // Esta llamada ser resuelta en tiempo de ejecucin (ligadura dinmica)

Ejercicioresuelto
Imagnate una clase que represente a instrumento musical genrico (Instrumento) y dos subclases
que representen tipos de instrumentos especficos (por ejemplo Flauta y Piano). Todas las clases
tendrnunmtodotocarNota,queserespecficoparacadasubclase.
HazunpequeoprogramadeejemploenJavaqueutiliceelpolimorfismo(referenciasalasuperclase
que se convierten en instancias especficas de subclases) y la ligadura dinmica (llamadas a un
mtodo que an no estn resueltas en tiempo de compilacin) con estas clases que representan
52

DesarrollodeAplicacionesWeb

Tema9

instrumentos musicales. Puedes implementar el mtodo tocarNota mediante la escritura de un


mensajeenpantalla.

LaclaseInstrumentopodratenerunnicomtodo(tocarNota):

public abstract class Instrumento {


public void tocarNota (String nota) {
System.out.printf ("Instrumento: tocar nota %s.\n", nota);
}
}

EnelcasodelasclasesPianoyFlautapuedesersimilar,heredandodeInstrumentoyredefiniendoel
mtodotocarNota:

public class Flauta extends Instrumento {


@Override
public void tocarNota (String nota) {
System.out.printf ("Flauta: tocar nota %s.\n", nota);
}
}

public class Piano extends Instrumento {


@Override
public void tocarNota (String nota) {
System.out.printf ("Piano: tocar nota %s.\n", nota);
}
}

A la hora de declarar una referencia a un objeto de tipo instrumento, utilizamos la superclase


(Instrumento):

Instrumento instrumento1; // Ejemplo de objeto polimrfico (podr ser Piano o Flauta)

Sinembargo,alahoradeinstanciarelobjeto,utilizamoselconstructordealgunadesussubclases
(Piano,Flauta,etc.):

if (<condicin>) {
// Ejemplo de objeto polimrfico (en este caso va adquirir forma de Piano)
instrumento1= new Piano ();
}
else if (<condicin>) {
// Ejemplo de objeto polimrfico (en este caso va adquirir forma de Flauta)
instrumento1= new Flauta ();
} else {
...
}

Finalmente,alahoradeinvocarelmtodotocarNota,nosabremosaquversin(dequsubclase)
de tocarNota se estar llamando, pues depender del tipo de objeto (subclase) que se haya
instanciado.Seestarutilizandoportantolaligaduradinmica:

// Interpretamos una nota con el objeto instrumento1


// No sabemos si se ejecutar el mtodo tocarNota de Piano o de Flauta
// (depender de la ejecucin)
instrumento1.tocarNota ("do");
// Ejemplo de ligadura dinmica (tiempo de ejecucin)

6.3.Limitacionesdelaligaduradinmica.
Comohaspodidocomprobar,elpolimorfismosebasaenlautilizacindereferenciasdeuntipoms
"amplio"(superclases)quelosobjetosalosqueluegorealmentevanaapuntar(subclases).Ahora

53

Utilizacinavanzadadeclases

DAW

bien,existeunaimportanterestriccinenelusodeestacapacidad,pueseltipodereferencialimita
culessonlosmtodosquesepuedenutilizarylosatributosalosquesepuedenacceder.

Nosepuedeaccederalosmiembrosespecficosdeunasubclaseatravsdeunareferenciaauna
superclase.Slosepuedenutilizarlosmiembrosdeclaradosenlasuperclase,aunqueladefinicin
quefinalmenteseutiliceensuejecucinsealadelasubclase.

Veamosunejemplo:sidisponesdeunaclaseAqueessubclasedeBydeclarasunavariablecomo
referenciaunobjetodetipoB.AunquemstardeesavariablehagareferenciaaunobjetodetipoA
(subclase),losmiembrosalosquepodrsaccedersinqueelcompiladorproduzcaunerrorsernlos
miembros de A que hayan sido heredados de B (superclase). De este modo, se garantiza que los
mtodosqueseintentenllamarvanaexistircualquieraquesealasubclasedeBalaqueseapunte
desdeesareferencia.

En el ejemplo de las clases Persona, Profesor y Alumno, el polimorfismo nos permitira declarar
variables de tipo Persona y ms tarde hacer con ellas referencia a objetos de tipo Profesor o
Alumno,peronodeberamosintentaraccederconesavariableamtodosqueseanespecficosdela
clase Profesor o de la clase Alumno, tan solo a mtodos que sabemos que van a existir seguro en
ambostiposdeobjetos(mtodosdelasuperclasePersona).

Ejercicioresuelto
Haz un pequeo programa en Java en el que se declare una variable de tipo Persona, se pidan
algunosdatossobre esa persona (nombre,apellidosysiesalumnoosiesprofesor),yse muestren
nuevamente esos datos en pantalla, teniendo en cuenta que esa variable no puede ser instanciada
comounobjetodetipoPersona(esunaclaseabstracta)yquetendrsqueinstanciarlacomoAlumno
ocomoProfesor.Recuerdaqueparapoderrecuperarsusdatosnecesitarshacerusodelaligadura
dinmicayquetansolodeberasaccederamtodosqueseandelasuperclase.

SituviramosdiferentesvariablesreferenciaaobjetosdelasclasesAlumnoyProfesortendrasalgo
as:

Alumno obj1;
Profesor obj2;
...
// Si se dan ciertas condiciones el objeto ser de tipo Alumno y lo tendrs en obj1
System.out.printf ("Nombre: %s\n", obj1.getNombre());
// Si se dan otras condiciones el objeto ser de tipo Profesor y lo tendrs en obj2
System.out.printf ("Nombre: %s\n", obj2.getNombre());

Perosipudierastratardeunamaneramsgenricalasituacin,podrasintentaralgoas:

Persona obj;
// Si se dan ciertas condiciones el objeto ser de tipo Alumno y por tanto lo instanciars
como tal
obj = new Alumno (<parmetros>);
// Si se otras condiciones el objeto ser de tipo Profesor y por tanto lo instanciars como
tal
obj = new Profesor (<parmetros>);

De esta manera la variable obj obj podra contener una referencia a un objeto de la superclase
PersonadesubclaseAlumnoobiendesubclaseProfesor(polimorfismo).

Esto significa que independientemente del tipo de subclase que sea (Alumno o Profesor), podrs
invocaramtodosdelasuperclasePersonaydurantelaejecucinseresolverncomomtodosde
algunadesussubclases:

54

DesarrollodeAplicacionesWeb

Tema9

//En tiempo de compilacin no se sabr de qu subclase de Persona ser obj.


//Habr que esperar la ejecucin para que el entorno lo sepa e invoque al mtodo adecuado.
System.out.printf ("Contenido del objeto usuario: %s\n", stringContenidoUsuario);

PorltimorecuerdaquedebesdeproporcionarconstructoresalassubclasesAlumnoyProfesorque
sean"compatibles"conalgunosdelosconstructoresdelasuperclasePersona,puesalllamaraun
constructordeunasubclase,suformatodebecoincidirconeldealgnconstructordelasuperclase
(como debe suceder en general con cualquier mtodo que sea invocado utilizando la ligadura
dinmica).

6.4.Interfacesypolimorfismo.

Es posible tambin llevar a cabo el polimorfismo mediante el uso de interfaces. Un objeto puede
tenerunareferenciacuyotiposeaunainterfaz,peroparaqueelcompiladortelopermita,laclase
cuyoconstructorseutiliceparacrearelobjetodeberimplementaresainterfaz(bienporsimismao
bienporque laimplementealgunasuperclase).Unobjetocuyareferenciaseadetipointerfazslo
puede utilizar aquellos mtodos definidos en la interfaz, es decir, que no podrn utilizarse los
atributosymtodosespecficosdesuclase,tansololosdelainterfaz.

Las referencias de tipo interfaz permiten unificar de una manera bastante estricta la forma de
utilizarsedeobjetosquepertenezcanaclasesmuydiferentes(peroquetodasellasimplementanla
mismainterfaz).Deestemodopodrashacerreferenciaadiferentesobjetosquenotienenninguna
relacin jerrquica entre s utilizando la misma variable (referencia a la interfaz). Lo nico que los
distintosobjetostendranencomnesqueimplementanlamismainterfaz.Enestecasoslopodrs
llamaralosmtodosdelainterfazynoalosespecficosdelasclases.

Por ejemplo, si tenas una variable de tipo referencia a la interfaz Arrancable, podras instanciar
objetos de tipo Coche o Motosierra y asignarlos a esa referencia (teniendo en cuenta que ambas
clases no tienen una relacin de herencia). Sin embargo, tan solo podrs usar en ambos casos los
mtodosylosatributosdelainterfazArrancable(porejemploarrancar)ynolosdeCocheolosde
Motosierra(slolosgenricos,nuncalosespecficos).

EnelcasodelasclasesPersona,AlumnoyProfesor,podrasdeclarar,porejemplo,variablesdeltipo
Imprimible:

Imprimible obj;

// Imprimible es una interfaz y no una clase

Con este tipo de referencia podras luego apuntar a objetos tanto de tipo Profesor como de tipo
Alumno,puesambosimplementanlainterfazImprimible:

// En algunas circunstancias podra suceder esto:


obj= new Alumno (nombre, apellidos, fecha, grupo, nota); // Polimorfismo con interfaces
...
// En otras circunstancias podra suceder esto:
obj= new
Profesor (nombre, apellidos, fecha, especialidad, salario); // Polimorfismo con
interfaces
...

Ymsadelantehacerusodelaligaduradinmica:

// Llamadas slo a mtodos de la interfaz


String contenido;
contenido= obj.devolverContenidoString();

// Ligadura dinmica con interfaces

55

Utilizacinavanzadadeclases

DAW

El polimorfismo puede hacerse con referencias de superclases abstractas, superclases no


abstractas o con interfaces. Verdadero o Falso?
Verdadero

Falso

Puedendeclararsevariablesdeuntiposuperclase(abstracta ono)ymstardeinstanciarseobjetossubclase,obiendeclararsevariables
deuntipointerfazyposteriormenteinstanciarseobjetosdeclasesqueimplementenesainterfaz.

6.5.Conversindeobjetos.

Comoyahasvisto,enprincipionosepuedeaccederalosmiembrosespecficosdeunasubclasea
travsde unareferencia aunasuperclase.Sideseasteneraccesoatodoslosmtodosy atributos
especficosdelobjetosubclasetendrsquerealizarunaconversinexplcita(casting)queconvierta
lareferenciamsgeneral(superclase)enladeltipoespecficodelobjeto(subclase).

Paraquepuedasrealizarconversionesentredistintasclasesesobligatorioqueexistaunarelacinde
herenciaentreellas(unadebeserclasederivadadelaotra).Serealizarunaconversinimplcitao
automtica de subclase a superclase siempre que sea necesario, pues un objeto de tipo subclase
siemprecontendrtodalainformacinnecesariaparaserconsideradounobjetodelasuperclase.

Ahora bien, la conversin en sentido contrario (de superclase a subclase) debe hacerse de forma
explcitaysegnelcasopodradarlugaraerroresporfaltadeinformacin(atributos)odemtodos.
EntalescasosseproduceunaexcepcindetipoClassCastException.

Porejemplo,imaginaquetienesunaclaseAyunaclaseB,subclasedeA:

class ClaseA {
public int atrib1;
}
class ClaseB extends ClaseA {
public int atrib2;
}

AcontinuacindeclarasunavariablereferenciaalaclaseA(superclase)perosinembargoleasignas
unareferenciaaunobjetodelaclaseB(subclase)haciendousodelpolimorfismo:

A obj; // Referencia a objetos de la clase A


obj= new B (); // Referencia a objetos clase A, pero apunta realmente a objeto clase B
(polimorfismo)

ElobjetoqueacabasdecrearcomoinstanciadelaclaseB(subclasedeA)contienemsinformacin
quelaquelareferenciaobjtepermiteenprincipioaccedersinqueelcompiladorgenereunerror
(puesesdeclaseA).EnconcretolosobjetosdelaclaseBdisponendeatrib1yatrib2,mientrasque
los objetos de la clase A slo de atrib1. Para acceder a esa informacin adicional de la clase
especializada(atrib2)tendrsquerealizarunaconversinexplcita(casting):

// Casting del tipo A al tipo B (funcionar bien porque el objeto es realmente del tipo B)
System.out.printf ("obj.atrib2=%d\n", ((B) obj).atrib2);

Sin embargo si se hubiera tratado de una instancia de la clase A y hubieras intentado acceder al
miembroatrib2,sehabraproducidounaexcepcindetipoClassCastException:

A obj; // Referencia a objetos de la clase A


obj= new A (); // Referencia a objetos de la clase A, y apunta realmente a un objeto de la
clase A

56

DesarrollodeAplicacionesWeb

Tema9

// Casting del tipo A al tipo B (puede dar problemas porque el objeto es realmente del tipo
A):
// Funciona (la clase A tiene atrib1)
System.out.printf ("obj.atrib2=%d\n", ((B) obj).atrib1);
// Error en ejecucin! (la clase A no tiene atrib2). Producir una ClassCastException.
System.out.printf ("obj.atrib2=%d\n", ((B) obj).atrib2);

57

TEMA10

INDICE

1.IntroduccinalasBDOO....................................................................................................................2
1.1.QusonlasBDOO?(I)...............................................................................................................................3
1.1.1.QusonlasBDOO?(II).........................................................................................................................................4
1.2.CaractersticasdelasBDOO.(I)..................................................................................................................5
1.2.1.CaractersticasdelasBDOO.(II).............................................................................................................................6
1.3.Almacenamientodelainformacin............................................................................................................7
2.InstalacindeunSGDBOO.................................................................................................................9
3.PrimerospasosconelSGDBOO.(I)..................................................................................................11
4.Creacindelabasededatos...........................................................................................................15
5.Esquemadelabasededatos...........................................................................................................20
5.1.Ellenguajededefinicindeobjetos.(I)....................................................................................................26
5.1.1.Ellenguajededefinicindeobjetos.(II)................................................................................................27
5.2.Tipodedatosbsicosyestructurados.(I)................................................................................................28
5.2.1.Tipodedatosbsicosyestructurados.(II)...........................................................................................................29
5.3.Tiposdedatosobjeto.(I)..........................................................................................................................31
5.3.1.Tiposdedatosobjeto.(II).....................................................................................................................................32
5.3.2.Tiposdedatosobjeto.(III)....................................................................................................................................33
5.4.Atributos.(I)..............................................................................................................................................34
5.4.1.Atributos.(II)........................................................................................................................................................35
5.4.2.Atributos.(III).......................................................................................................................................................37
5.5.Mtodos.(I)..............................................................................................................................................38
ResumendelasintaxisdeObjectScript...........................................................................................................................................39
5.5.1.Mtodos.(II).........................................................................................................................................................44
5.6.Herencia.(I)...............................................................................................................................................45
5.6.1.Herencia.(II).........................................................................................................................................................46
5.7.Constructores............................................................................................................................................48
5.8.Tipodedatoscoleccin.(I).......................................................................................................................49
5.8.1.Tipodedatoscoleccin.(II)..................................................................................................................................57
5.8.2.Tipodedatoscoleccin.(III).................................................................................................................................58
6.Mecanismosdeconsultayaccesoalabasededatos.....................................................................60
7.Almacenandoobjetosenlabasededatos......................................................................................62
7.1.Preparandonuestroproyectoparaalmacenarobjetos............................................................................75
7.2.Conectandoconlabasededatos.............................................................................................................76
7.3.Proyecciones.............................................................................................................................................80
7.4.Sentenciasdeinsercindedatosenlabasededatos..............................................................................81
7.5.AlmacenandoobjetosatravsdeJDBC.(I)..............................................................................................82
7.5.1.AlmacenandoobjetosatravsdeJDBC.(II).........................................................................................................83
7.5.2.AlmacenandoobjetosatravsdeJDBC.(III)........................................................................................................84
CACH.InsercindedatosenlascoleccionesusandoProyecciones...............................................................................................85
ORACLE.InsercindedatosenlascoleccionesusandoJDBC..........................................................................................................87
8.Manipulandolosobjetosalmacenados...........................................................................................91
8.1.Recuperacindelosobjetosalmacenados.(I).........................................................................................92
8.1.2.Recuperacindelosobjetosalmacenados.(III)...................................................................................................95
8.1.3.Recuperacindelosobjetosalmacenados.(IV)...................................................................................................96
8.2.Modificacindelosobjetosalmacenados................................................................................................97
8.3.Borradodelosobjetosalmacenados........................................................................................................99
8.4.BorrarymodificarobjetosdesdeJDBCyproyecciones..........................................................................100

[PROGRAMACIN]
JosLuisComesaaCabeza2011/2012
ProgramacindelcursodeDesarrollodeAplicacionesWeb

DesarrollodeAplicacionesWeb

Tema10

Mantenimientodelapersistenciadelos
objetos
CASO PRCTICO
Antonio esta maana est muy contento, y todo es porque una aplicacin que estaba haciendo, le ha
funcionado. Es una aplicacin sencilla que le ha pedido Juan, destinada a organizar la lista de
clientes de un pequeo taller mecnico. La aplicacin permite introducir los datos de los conductores
y las conductoras que acuden al taller, recopilando sus direcciones de correo electrnico y sus
telfonos.
De momento la aplicacin no hace nada ms, de hecho, el cliente no necesita ninguna funcionalidad
extra, aunque deja la puerta abierta a que en el futuro se pueda aadir ms informacin (como por
ejemplo las matriculas de los coches de cada conductor o conductora). Hoy va a ensearle a Juan la
aplicacin:
Hola Juan. Hoy he trado la aplicacin del taller que te dije, para que me des tu opinin dice
Antonio.
Muy bien -contesta Juan-, seguro que ser una aplicacin estupenda.
Bueno, todava me falta mucho por hacer, pero ya se puede utilizar. Mira aqu est!
Despus de un rato, en el que Antonio le ensea cmo funciona la aplicacin, Juan hace un
comentario inesperado:
Est muy bien la verdad, ya solamente te queda hacer los datos persistentes dice Juan.
S, supongo que s contesta Antonio.
Antonio responde que s, pero realmente no sabe muy bien a qu se refiere con lo de datos
persistentes, por lo que se queda un poco desconcertado.

Utilizaras un procesador de textos que no te da la opcin de guardar el documento que ests


editando? Como es obvio, a nadie se le ocurre hacer un programa as. De hecho, casi todos los
programashoydatienenlaopcindeguardarlosdatos,seanonoprocesadoresdetexto.
Hasta ahora, ya conoces como abrir un archivo y utilizarlo como almacn para los datos que
maneja tu aplicacin. Utilizar un archivo para almacenar datos es la forma ms sencilla de
persistencia,porqueendefinitiva,lapersistenciaeshacerquelosdatosperdureneneltiempo.
Hay muchas formas de hacer los datos de una aplicacin persistentes, y muchos niveles de
persistencia.Cuandolosdatosdelaaplicacinsoloestndisponiblesmientraslaaplicacinseesta
ejecutando,tenemosunniveldepersistenciamuybajo,yeseeraelcasodeAntonio:suaplicacinno
almacenabalosdatosenningnlado,yenposterioresejecucioneslosdatosnopodanserutilizados,
puessoloestabandisponiblesmientrasnocerraraslaaplicacin.
Lodeseableesquelosdatosdenuestraaplicacintenganunniveldepersistencialomayorposible.
Tendremosunmayorniveldepersistenciasilosdatossobrevivenvariasejecuciones,oloqueeslo
mismo,sinuestrosdatosseguardanyluegosonreutilizablesconposterioridad.Tendremosunnivel
todavamayorsisobrevivenvariasversionesdelaaplicacin, esdecir,siguardolosdatosconla
versin1.0delaaplicacinyluegopuedoutilizarloscuandoestedisponiblelaversin2.0.
Peroloverdaderamenteinteresantedeestaunidad,eslaformadehacerpersistenteslosdatos.En
estaunidadtevamosaproponerunenfoquetotalmentediferenteaalmacenarlosdatosenmeros
archivos:vamosautilizarbasesdedatosorientadasaobjetosparahacerlosdatosdetuaplicacin
persistentes.
Peroparahaceresto,primerotienesqueaprenderqusonlasbasesdedatosorientadasaobjetos,
enadelantellamadasBDOO,yaprenderausarlasentuaplicacin.ComprobarsqueconlasBDOO
hacerlosdatospersistentesesmsfcilyprcticodeloqueimaginabas.

DAW

Mantenimientodelapersistenciadelosobjetos

1.IntroduccinalasBDOO.
Caso prctico
Antonio est un poco desconcertado, pensando a qu se puede referir Juan con eso de hacer
persistentes los datos. Despus de un rato, Antonio se cruza con Ana y le pregunta sin dudarlo:
Oye, t sabes en qu consiste la persistencia de datos? pregunta Antonio.
Claro, la persistencia de datos es simplemente almacenar los datos de forma que luego puedan
volverse a utilizar despus, por ejemplo, usando una base de datos. Por qu lo preguntas?
Por nada, ya lo entiendo, o sea, que se refiere a usar bases de datos.
Bueno, en realidad es algo ms que eso, existen multitud de mecanismos para realizar la
persistencia de datos. Si buscas por Internet encontrars cientos de pginas con informacin al
respecto.

Hoyenda,unodelosretosmsinteresantesdelmundodelainformtica,essimplificarlagestin
dedatos.Seguroqueestarsdeacuerdoenqueesimprescindibleguardarlosdatosdelaaplicacin,
pero hay que reconocer que es una de las tareas ms engorrosas, sobre todo si se trata de ir
guardandolosdatosenarchivos.
Lastcnicasdepersistenciapersiguen,bsicamente,unobjetivomuynoble:hacerlavidamsfcilal
programadoroalaprogramadora,simplificandoparaellolosmecanismosparaguardarlosdatos.A
continuacin vamos a revisar algunas de las tcnicas existentes para realizar la persistencia,
valorandocomosimplificanelaccesoalosdatos:
9

Almacenamientodirectoenarchivos.Almacenarlosdatosdirectamenteenarchivoses,como
ya sabes, una de las tcnicas de persistencia ms usada, pero no es sencilla de implementar.
Implementarlapersistenciaenarchivossuelesercostosoydedifcilmantenimiento.

Sistema gestor de bases datos (SGDB). Usar un sistema SGDB es una de las soluciones ms
recurridas. Los datos son gestionados por el SGDB, garantizando consistencia y seguridad en
losmismos.DesdelaaplicacinseaccedealosdatosusandounaAPI(Conjuntodeclases,agrupadasen
mododelibrera,destinadasalautilizacindeundeterminadoserviciosoftware.Lasbasesdedatosproporcionanunconjuntode
funciones y clases para acceder a los datos almacenados. El trmino API significa: interfaz de programacin de aplicaciones)

especfica,comoJDBC,yusandounlenguajedeconsultadedatos,comoSQL.AunquelosSGDB
facilitanlagestindedatos,todavasebuscansolucionesdeprogramacinmscmodas.
9

Mapeado de objetos. El mapeado de objetos simplifica bastante la utilizacin de las bases de


datos. Se trata bsicamente de tcnicas que permiten almacenar objetos de un lenguaje de
programacin,comoJava,directamenteenlabasededatos.Generalmente,necesitandeloque
denominamosmotordepersistencia(Softwareencargadodefacilitarelalmacenamientotransparentededatosen
unabasededatos.Lasbasesdedatosusanrepresentacionesdelainformacinytiposdedatosdiferentesalosusadosporlos
lenguajesdeprogramacin,lamisindelmotordepersistenciaesfacilitarlacomunicacinentrelaaplicacinylabasededatos,
escondiendolarepresentacindelainformacinusadaporlabasededatos).

Extensionesdelenguajesdeprogramacintradicionalesparafacilitarelaccesoadatos.Este
tipodetcnicasamplanlafuncionalidaddeloslenguajesdeprogramacintradicionales,como
Cobol,C,C++,C#oJava,parahacermssencilloelaccesoalosdatos.SQLJoPRO*Csonalgunos
ejemplos de extensiones de los lenguaje Java y C respectivamente. Algunas de estas
extensiones,comoLINQ,estnpensadasparavarioslenguajesdeprogramacin.

Parasaberms
EnelsiguienteenlaceencontrarsmsinformacinacercadeLINQ.
http://msdn.microsoft.com/eses/netframework/aa904594.aspx
Cul de las siguientes opciones es una extensin de un lenguaje de programacin
tradicional que facilita el uso de bases de datos?
SQL

DesarrollodeAplicacionesWeb

SQLJ

Tema10

Mapeadodeobjetos

1.1.QusonlasBDOO?(I)
Despusdetantasunidadesdeprogramacinvistas,queenestaunidadtehablendeobjetostevaa
resultarunpocorepetitivo,verdad?Noobstante,vamosahacerunpequeorecordatoriosobrelo
que entendemos por objeto: un objeto en programacin es una entidad que contiene datos y
operacionessobredichosdatos.
Seguroqueelconceptodeobjetoyalosabas,ahoralapreguntaes,quentendemosporBDOO?
LasBDOOsonbasesdedatosquealmacenanobjetos,asdesimple.Yaligualquelosobjetosque
utilizasenJava,losobjetosalmacenadosenunaBDOOencapsulanigualmentedatosyoperaciones
en una misma entidad. Como ya sabrs, los datos de un objeto los llamamos atributos y las
operacionessobredichosdatoslasdenominamosmtodos.
Una BDOO es solamente un almacn de objetos. Al software que proporciona la facilidad de
almacenarobjetosenesealmacnloconocemoscomoSistemaGestordeBasesdeDatosOrientadas
aObjetos(SGBDOO).EnmuchoslibroslosllamanSistemasGestoresdeBasesdeObjetos(SGBO),lo
cualesequivalente.
DesdenuestraaplicacinsolicitaremosalSGBDOOquealmaceneunobjeto,oquelobusquedentro
detodoslosquetienealmacenados,deestaforma,lograremoshacerlosdatosdenuestraaplicacin
persistentes, aunque a partir de ahora podremos decir que vamos a hacer los objetos de nuestra
aplicacinpersistentes.
Cabe decir que las BDOO no son las ms utilizadas hoy da. El modelo relacional, usado por los
Sistemas Gestores de Bases de Datos Relacionales (SGBDR), es el modelo de base de datos ms
utilizado.LosSGBDRalmacenanlainformacinenrelacionesotablas,formadasporunconjuntode
filas y columnas. A pesar de que los SGBDR son los ms usados, en esta unidad se abordan los
SGBDOOporquetienencaractersticasqueloshacenmsflexibles.
Adems de los SGBDR y los SGBDOO, existe lo que denominamos Sistemas Gestores de Bases de
Datos ObjetoRelacionales (SGBDOR). La mayor parte de los SGDB comerciales son de tipo Objeto
Relacional, y son bases de datos que implementan el modelo relacional, y que adems incorporan
conceptos de orientacin a objetos. Algunas bases de datos de este tipo solo incorporan algunos
conceptosdeorientacinaobjetos,comolaherencia.Otrasimplementanmuchosmsconceptosde
orientacinaobjetos,convirtindoseensistemasverdaderamenteflexibles.

En ingles las bases de datos relacionales se denominan RDBMS (Relational Database


Management System) y las orientadas a objetos ODBMS (Object Database Management
System). Como podrs deducir, a las bases de datos objetorelacionales se las denomina
ORDBMS(ObjectRelationalDatabaseManagementSystem).
Acontinuacin,semuestraunapequearelacindeSGBDclasificadosportipo(haymuchosms):
9

Orientados a objetos: DB4O, Versant Object Database, InterSystems Cach, ObjectStore,


ObjetivityDB,MATTISE,etc.

Objetorelacionales:Oracle,IBMDB2,yPostgreSQL,etc.

Relacionales:MySQL,MicrosoftSQLServer,MicrosoftAccess,InterbaseSMP,etc.

DAW

Mante
enimientodeelapersisten
nciadelosob
bjetos

1.1.1.QusonlasBD
DOO?(II)
Al igual que ocurre en
n Java, para poder usar un objeto cualquiera, primero tien
nes que deffinirlo,
creandola clasepertinente.Definirr un objeto consisteen hacer unad
descripcind
decmova aser,
indicandoq
quatributossymtodosvanatenerttodoslosobjetosdeunm
mismotipo.
Tanto en laas bases dee datos relacionales,
como en las BDOO, es
e necesario
o definir
cmovanaaserloselem
mentosque sevana
almacenar. En la imaagen de la derecha
tienes un ejemplo
e
grffico de defin
nicin de
elementosp
paraamboscasos.
Obviamenteeenlasbaseesdedatosrrelacionales,loquehayquedefinireescmosonlastablas,q
quees
dondesealmacenarn losdatos.D
Deformaequivalente,en
nlasBDOO hayquedeffinircmoso
onlos
namboscaso
os,seutilizarunlenguaajepropiodeelabasede datos
objetosqueesevanaalmacenar.En
(loscualesssuelenserbaastantediferrentesalosllenguajesde
eprogramacindeusogeeneral).Usan
ndoel
lenguaje dee la base dee datos espeecificaremos qu atributtos van a teener todos los objetos de
d un
determinad
dotipoyqumtodosim
mplementan.
Unavezqueeyahemosd
definidocm
movanaserlosobjetosaaalmacenar,podremosintroducirob
bjetos
enlabased
dedatos.Estodalugaraqueenlabaasededatostengamos:
9

Ladefiinicindelosobjetosaaalmacenar.D
Dichadedefiinicinsesueledenomin
narclaseo
otipo
dedatoobjeto,dependiendo
odelabased
dedatos.No
ormalmente,laexpresin
nclaseseutiliza
enSGB
BDOOylaexxpresintipo
odedatoob
bjetoenSGB
BDOR.
9 Yunco
onjuntodein
nstancias.Unainstanciaesunobjeto
ocondatosreales,esdeecir,sedaun
nvalor
real a cada atribu
uto de la claase. A una instancia taambin se lee suele llam
mar ejemplaar, o
simplementeobjeeto.
mosaquportantoloqueeesladefiniicindeobje
eto,deloque
Diferenciam
sera un ob
bjeto concretto, es decir, su instanciaa o ejemplarr. El SGBDOO
O
proveer de
d mecanism
mos tanto para
p
definir los objetoss, como parra
insertar,buscar,modificcaryborrarobjetosdelaabasededatos.
DefinicindeEmple
eado
des imaginarr,
Adems de lo anterior,, como pued
OylosSGBDORpermiten
nlaejecucin
losSGBDOO
de mtodos. Piensa en
n el ejemplo expuesto en
las imgen
nes anteriorres, en el que hay un
conjunto de
d instanciass de una clase
c
llamada
Empleado. Endichasinstancias,elm
mtodoEdad
calculara laa edad del empleado
e
paartiendo de su
InstanciasdelaclaseEmpleado
fecha de nacimiento.
n
En estas baases de dattos
podramos buscaruna instanciaconcretadentrodetodas lasinstanciaas,partiendo
oporejemp
plodel
DNIdelemp
pleado,ydespusejecuttarelmtodoEdadparalainstanciabuscada.
Una de las cosas que ms
m trabajo cuesta comp
prender es saber
s
dndee se almacen
nan y ejecutaan los
mtodos.Tienesqueteenerclaroqu
uelosmtod
dossealmace
enanenelSGBDynoen
nlaaplicaci
nque
usalosdato
os.EselSGBDelqueseeencargardeeejecutarlosmtodos,aapeticindeelaaplicaci
nque
haceusodeelosobjetosalmacenado
os.
Los mtodo
os se prograaman en len
nguajes de alto
a
nivel. Algunos
A
ejem
mplos de esttos lenguaje
es son
PL/SQL,usaadogeneralm
menteenlossSGBDOR,JavauObjectScript.Nottodaslasbassesdedatossusan
losmismoslenguajes.

DesarrollodeAplicacionesWeb

Tema10

En el siguiente enlace, perteneciente a la organizacin ODBMS, podrs encontrar ms


informacin sobre las bases de datos orientadas a objetos y sobre otras tecnologas
denominadasbasesdedatosNoSQL.
http://www.odbms.org/

Cul de las siguientes frases es verdadera?

Enlossistemasgestoresdebasesdedatosrelacionalesnosepuedendefinirobjetos
LosobjetosenlosSGBDOOsedefinenenlenguajesdeusogeneralcomoJava

1.2.CaractersticasdelasBDOO.(I)
Las caractersticas de las BDOO son muchas y difciles de resumir, por lo que aqu solo vamos a
destacaralgunasdelascaractersticasmsimportantes.Sabesculeslaprincipalcaracterstica?La
primeracaractersticaquetienesquerecordaresquelasBDOOsonsistemasorientadosaobjetos,y
todoslossistemasorientadosaobjetostienencaractersticascomunesentres.
En este apartado vamos a abordar las caractersticas que tienen las BDOO, por el hecho de ser
sistemasorientadosaobjetos.Seguroquemuchosdeestosconceptosyatesuenan:
9

Encapsulamientoyocultacin.Encapsularatributosymtodosenlamismaentidad,ocultando
detalles de implementacin. A los objetos almacenados los llamamos instancias, ejemplares o
simplemente objetos, y al molde que siguen todos los objetos del mismo tipo lo llamamos
clase (SGBDOO) o tipo de datos objeto (SGBDOR). De ahora en adelante utilizaremos el
trminoclaseparareferirnosacualquieradelosdoscasosanteriores.

Clasesytablasdeobjetos.EnlosSGBDOO,decaraalaprogramacin,unaclaseestambinun
contenedor que almacena todos los objetos del mismo tipo, es decir, es un contenedor para
todas las instancias o ejemplares que siguen el mismo molde. En los SGBDOR se le suele
denominartabladeobjetosyalmacenaejemplaresdeuntipodedatoobjeto.

Estado.Elestadodeunainstanciaoejemplarestaformadoporelvalordesusatributos.

Identidad nica e inmutable de los objetos (OID). En los SGBDOO, todos los objetos suelen
tenerasociadounidentificadordeobjeto,llamadoIDO(eningls,OID),quepermitediferenciar
a dos instancias aunque tengan el mismo estado, es decir, aunque tengan todos los atributos
conelmismovalor.DecimosquedosobjetossonidnticossitienenelmismoOIDysoniguales
sitienenelmismoestado.

Relacionesentreobjetos.EnlosSGBDOOlosobjetospuedenrelacionarseendiversasformas.
Unadeesasformasesatravsderelacionesdeherencia,dondeunobjetoseconstruyeapartir
deotroobjetoyaexistente(ampliando,limitandooconcretandolafuncionalidaddelprimero).
Otrasformasderelacinentreobjetossonlasasociaciones(cuandounobjetoAestvinculadoconunobjeto
B,pero sinunadependenciafuerte,es decir, elobjetoApuede existir sinelobjetoB,yviceversa.Eselcasodelarelacin que
puedentenerunmdicoounamdica,conunpaciente,porejemplo),agregaciones(cuandounobjetoAformapartedeotro
objetoB,siendoBunobjetoformadopordiferentespartes.Porejemplo,unramodefloresestcompuestodediferentestiposde
flores,siquitamosunarosa,seguimosteniendounramodeflores.Enlasagregaciones,ladesaparicindeunadelaspartesno
hacequeelobjetoBdesaparezca)ycomposiciones(cuandounobjetoAformapartedeotroobjetoB,siendoBunobjeto
formado por diferentes partes de las que depende fuertemente. Por ejemplo, un coche est formado por ruedas, cuatro
exactamente,unacarrocera,unmotor,etc.Sialcochelequitamosunarueda,dejaradeseruncoche),dondeunobjeto

tieneunadependenciadealgntiposobreotrosobjetos.
9

Extensibilidad.Losatributosdeunobjetopuedenserdedostipos:tiposdedatospredefinidoso
simples(comonmerosenteros,cadenasdetexto,etc.)otiposdedatoscreadospornosotros.
Lostiposde datoscreadospornosotrossonasuvezclasesnuevasdenuestrabasededatos,
pudiendousardichasclasescomotipoparalosatributos.

DAW
9

Mantenimientodelapersistenciadelosobjetos

Sobrecargayanulacin(polimorfismo).AligualqueocurreenJava,enmuchasBDOOesposible
hacer que un mismo mtodo tenga comportamientos diferentes dependiendo del contexto.
Existendostiposdepolimorfismos:deanulacin(Alcrearunasubclasedeunaclaseyaexistente,sidefinimosde
nuevounmtodoyaexistenteenlaclasepadre,haciendoqueenlaclasehijatengauncomportamientodiferente,entoncesel
polimorfismoesdeanulacin)ydesobrecarga(Sidentrodeunamismaclase,hacemosunmtodoconelmismonombre
queotroyaexistente,cambiandosoloelnmerooeltipodelosargumentos,entoncessetratadeunpolimorfismodesobrecarga.
Hacemos que el mtodo tenga un comportamiento diferente dependiendo de los argumentos. No todas las bases de datos
soportanelpolimorfismodesobrecarga).

Cul de las siguientes afirmaciones sobre BDOO es falsa?


SidosejemplarestienenelmismoOIDsoniguales
Losatributosdeunobjetopuedentiposdedatossimplesoclasesdefinidaspornosotros
Unatabladeobjetosesunlugardondesealmacenanejemplaresdeunmismotipode
objeto
Larelacindeherenciapermiteconstruirobjetosapartirdeunoyaexistente

SidosejemplarestienenelmismoOIDentoncesdecimosquesonidnticos,perositienenelmismoestadodecimosquesoniguales.

1.2.1.CaractersticasdelasBDOO.(II)
En el apartado anterior se analizaron las caractersticas de las BDOO desde la perspectiva de los
sistemasorientadosaobjetos,yenesteapartado,sevanaanalizarlascaractersticasdelasBDOO
comobasesdedatosqueson.LoprimeroquetienesquetenerencuentaesquelasBDOOsonbases
dedatos,ycomotales,tambintienencaractersticascomunesatodaslasbasesdedatos.Algunas
deestascaractersticasson:
9

Persistencia de los datos. El concepto de persistencia ya fue abordado antes, y como


recordars, cuando se habla de persistencia la idea es hacer que los datos estn disponibles
despus de cerrar la aplicacin o de apagar el ordenador. Las bases de datos son sistemas
dondelosdatossonpersistentesysoloseborrarncuandoselepidaalabasededatosque
losborre.
9 Reducenlaimpedanciapordesajustedemodelos(eningls,impedancemismatch).Laforma
enlaquesemanejanlosdatosenlaaplicacinylaformaenlaquesemanejanlosdatosenla
base de datos son, por lo general, bastante diferentes. Cuando una aplicacin necesita
almacenar datos, debe ajustar sus
datos para que puedan ser
almacenadosenlabasededatos.Si
utilizamos un lenguaje orientado a
objetos, como es Java, y una base
de datos con un modelo muy
diferente, como pueden ser el
relacional, la impedancia ser alta,
pues habr que adaptar los datos
del lenguaje orientado a objetos al
modelorelacional.Encambio,sien
vez de usar una base de datos
relacional,usamosunabasededatosorientadaaobjetos,laimpedanciasermenor,porqueen
ambaspartesseutilizarelmodeloorientadoaobjetos.
9 Lenguajes de consulta declarativos. Prcticamente todos los SGBD, incluidos los SGBDOO,
permiten manipular la informacin almacenada usando un lenguaje declarativo (La diferencia
fundamentalentreunlenguajeimperativocomoJavayunodeclarativocomoSQLesqueenelprimerosedescribe,pasoporpaso,
lasecuenciadeaccionesarealizarparaalcanzarunasolucin,mientrasqueenelsegundosedescribeelproblemaaresolver,lo
mejorposible,yelSGBDinfiereodeducelasolucin).

DesarrollodeAplicacionesWeb

Tema10

9 Acceso concurrente y fiable a los datos. El acceso concurrente y fiable permite que varias
aplicaciones puedan acceder simultneamente a la base de datos, sin que ello provoque
incongruenciasenlosdatos.Notodaslasbasesdedatospermitenaccesosconcurrentes,perosi
lagranmayora.
9 Gestin del almacenamiento secundario. Gestionar dnde y cmo se almacenan los datos de
forma fsica (en disco u otro soporte), cmo se organizan para dar un mejor rendimiento o
permitir que existan varias replicas de la informacin, son capacidades tpicas de las bases de
datosactuales.
9 Seguridad.Losdatosdeunabasededatossoninformacinimportantequehayquepreservar
tanto de fisgones, como de modificaciones no autorizadas. Casi todos los SGBD actuales
permitenconfigurardiferentesnivelesdeacceso,conproteccindeusuarioycontrasea.
9 Interfacesdeprogramacindeaplicaciones(API).AtravsdelaAPI,lasaplicacionesdeusuario
puedenaccederalabasededatosparaguardarorescatarlosdatos.TodoslosSGBDtienenuna
APIquepermitehacerprogramasqueusanlabasededatos.
9 Utilidades de mantenimiento y optimizacin. Casi todos los SGBD actuales incluyen
herramientas de mantenimiento y optimizacin que facilitan el trabajo de los administradores
debasesde datos.Imagnateque tienesquehaceruna copiadeseguridad delosdatos detu
basededatos,puesparafacilitaresatarea,yotrasdelestilo,losSGBDsuelenincluirutilidades
demantenimiento.

Seala, de las siguientes caractersticas, cuales crees que son imprescindibles para que
un SGBDOO pueda ser utilizado en una aplicacin realizada por ti:
Debealmacenarlosdatosdeformapersistente
Debepermitirelaccesoconcurrentealosdatos
DebetenerunAPIparalaprogramacindeaplicaciones
Debetenerunlenguajedeconsultadeclarativo

LasdoscaractersticasimprescindiblessonquelosdatossealmacenendeformapersistenteyqueseproporcioneunAPIparaaccedera
losdatos,lasotrascaractersticasvienenbienperonosonobligatorias

Enelsiguienteenlacepodrsencontrarmsinformacinsobreloslenguajesdeclarativos:
http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_declarativo

1.3.Almacenamientodelainformacin.
DndeycmosealmacenalainformacinenunSGBD?Laformadealmacenarlainformacines
similar (pero no igual) entre los diferentes SGBD. Normalmente los modelos objetorelacionales y
orientadosaobjetosutilizantcnicasmscomplejasquelosrelacionales.
ElaspectomsvisibledelalmacenamientodedatosenunSGBDesloquesedenominaGestindel
AlmacenamientoSecundario.Elalmacenamientoprimarioseralamemoriaprincipaldelsistema(la
cual se borra al apagar el ordenador), y el secundario correspondera a dispositivos de
almacenamientopersistentes(discoduro,porejemplo).VeamosalgunascaractersticasdelosSGBD
enloqueagestindelalmacenamientosecundarioserefiere:
9

SGBD Local. Cuando tenemos un SGDB local, los datos se almacenan en el mismo ordenador
dondeseejecutalaaplicacin.
9 SGBD Remoto. Cuando tenemos un SGDB remoto, los datos se almacenan en un ordenador
diferentealordenadordondeseejecutalaaplicacin.Al
sistema donde se ejecuta el SGBD se le denomina
servidor.
9 Gestindendices.Algunavezhasconsultadoelndice
de un libro? Los ndices permiten acceder a la

DAW

Mantenimientodelapersistenciadelosobjetos

informacindeformarpidasintenerquerevisartodaslaspginasdellibrounatrasotra.En
una base de datos los ndices actan de forma similar, son estructuras complementarias de la
base de datos que facilitan la bsqueda de datos concretos dentro de la base de datos. La
utilizacin de ndices mejora el rendimiento de la base de datos notablemente. Cada base de
datos, dependiendo del modelo implementado, y de sus peculiaridades, tiene una forma
diferentedetrabajarconlosndices,peroengeneralsepuedehablardelossiguientestiposde
ndices:
ndiceprimario(primaryindex).Imaginaquetienesquedisearunaclaseparaalmacenar

los coches arreglados en un taller, podras decir que dato de cada coche sera el ms
importante? Seguro que tu respuesta ha sido la matrcula. Y sabes por qu es tan
importante?Porquelamatrculaesnicaparacadacoche,ypermitediferenciaruncoche
de cualquier otro. Con los datos de la matrcula podra crearse lo que denominamos un
ndice primario, pues determina de forma univoca a cada coche y permite organizar la
informacin internamente en la base de datos con cierto orden. Cualquier atributo cuyo
valorseanicoparacadaobjetopuedeusarseparaconstruirunndiceprimario.
ndicesecundario(secondaryindex).Losndicesprimariossonsiemprenicos(losvalores

noserepiten),perolossecundariosnotienenporqueserlo.Sienlaaplicacinlaformams
habitualdebuscarloscochesesatravsdelamarca,paramejorarlabsquedapormarca
podramoscrearunndicesecundario.
ndicecompuesto(compoundindex).Losndicescompuestossonndicessobremsdeun

atributo que se crean concatenando sus valores, pueden ser nicos o no nicos. Si en la
aplicacin, la forma ms habitual de buscar coches es a travs de la marca y el modelo,
podramoscrearunndicecompuestoparatalfin.
9

DataClusteringyreplicacindedatos.Sontcnicasdestinadasamejorarelaccesoadatosya
protegerlosdeimprevistos.Porejemplo,imaginaqueelequipodondeestinstaladalabasede
datos se estropea. Pues manteniendo una replica de los datos en otro ordenador, podramos
seguir usando la base de datos. En este tipo de tcnicas los datos estn distribuidos en
diferentes sistemas que almacenan y procesan la informacin de forma independiente, dando
msrapidezyeficienciaalabasededatos.

Llave oclaveprimariaes unconceptomuyimportanteenlosSGBDrelacionales.Laclaveprimaria


est formada por una o varias columnas que siempre tendrn valor y que de forma conjunta
identificarn deformaunvocaacadafiladelatabla.Todatabladelmodelo relacionaldebetener
una clave primaria. La clave primaria es automticamente un ndice primario (si est formada solo
porunacolumna)ounndicecompuestonico(siestformadapordosomscolumnas)

Los ndices compuestos determinan siempre de forma unvoca cada objeto, dado que es
un ndice primario y secundario a la vez. Verdadero o falso?

Verdadero

Falso

DesarrollodeAplicacionesWeb

Tema10

2.InstalacindeunSGBDOO.
Caso prctico
Antonio se ha informado y ya conoce un poco ms qu es la persistencia y cmo influyen las bases
de datos en todo ese meollo. Despus de investigar e investigar, ha pensado que va a optar por los
SGBDOO para aadir persistencia a su aplicacin.
Esto supone todo un reto para l, pues l ya conoca los SGBD relacionales, pero jams se haba
enfrentado a un SGBDOO. Ha preguntado a Juan y a Ana, en busca de consejo. No sabe que
SGBDOO usar.

Qu SGBDOO usaras t? En esta seccin vamos aabordar la instalacin de un SGBD con soporte
para almacenar objetos. Como ya sabes, para almacenar objetos se pueden usar tanto bases de
datos objetorelacionales como orientadas a objetos. Aqu vamos a explorar la base de datos
IntersystemsCach,lacualesorientadaaobjetos,aunqueharemosreferenciascontinuasaOracle,
lacualesobjetorelacional.Pondremosejemplosparaambasbasesdedatos,porloquesiquieres
puedesinstalarlasdos.
IntersystemstieneunaversingratuitadesuproductoCach,quepuedesutilizarparaestaunidad.
Cach es un completo SGBDOO con muchas ms funciones de las que nosotros vamos a utilizar
realmente. La pgina web del producto es la siguiente, en ella podrs descargar Cach de forma
gratuita:
http://www.intersystems.es/page/es/cache_es.html
Para descargar Cach primero tienes que registrarte, despus podrs descargar la base de datos e
instalarlasinproblemas.Instalarestabasededatosesrelativamentesencillo.Veamoslospasosde
instalacinenelsistemaoperativoWindows.Elprocesosepuederesumircomosigue:
9

Descargarelinstaladoryejecutarlo.

Aceptar los trminos de licencia. La licencia nos permite usar esta base de datos para
evaluacin.

Seleccionarlacarpetadondeseinstalar.PordefectoseinstalarenC:\Intersystems\Cache,
es conveniente apuntar la carpeta donde se va a instalar, pues de ah tendremos que coger
algunosarchivosimportantes.

Instalacin. Suele durar entre 15 y 20 minutos aproximadamente, dependiendo de las


caractersticasdetuordenador.DuranteesteprocesoCachcopialosarchivosyseconfigura.

Mostrar la pgina de preparacin. Despus de la instalacin, dar la opcin de mostrar una


pginacondocumentacinparaempezarrpidamenteausarCach,todaestadocumentaciny
mucha ms, viene instalada con cach. El nico problema es que la documentacin viene en
ingls. Para hacer uso de esta documentacin necesitas un navegador web y tener iniciado
Cach.

Despusdelainstalacin,podremosencontrarherramientasenelmendeinicioparaarrancar
ypararCach,ascomoparaaccederaladocumentacin(atravsdelnavegadorweb),acceder
a la herramienta de administracin (tambin a travs de la web) y acceder a la herramienta
CachStudioqueusremosmsadelante.

En el siguiente enlace se describe el proceso de instalacin de InterSystems Cach para


sistemasoperativosbasadosenLinuxyUnix:
http://docs.intersystems.com/ens20091/csp/docbook/DocBook.UI.Page.cls?KEY=GCI_unix
Si deseas instalar Oracle y probar los ejemplos propuestos para dicha base de datos, a
continuacin encontrars el enlace oficial para descargar la base de datos Oracle XE

DAW

Mantenimientodelapersistenciadelosobjetos

(versinExpressEditiondelabasededatosOracle).LaversindeOraclemssencillade
utilizardeeslaXE.
http://www.oracle.com/technetwork/database/express
edition/downloads/index.html?ssSourceSiteId=ocomen
EnlossiguientesenlacesvieneninstruccionesdetalladasparainstalaryprobarOracleXE.
Si decides instalarla, no olvides apuntar la contrasea que del usuario SYSTEM (te la
pedirenelprocesodeinstalacin):
http://oraxedatabase.blogspot.com/2011/10/instruccionesparainstalarOracle.html
http://docs.oracle.com/cd/E17781_01/install.112/e18802/toc.htm
http://docs.oracle.com/cd/E17781_01/install.112/e18803/toc.htm

10

DesarrollodeAplicacionesWeb

Tema10

3.PrimerospasosconelSGDBOO.(I)
Caso prctico
Despus de darle muchas vueltas, Antonio se ha decidido por probar uno de los muchos SGBDOO
existentes. Guiado por los consejos de sus compaeros y compaeras, especialmente por los
consejos de Juan, se ha atrevido a experimentar con la base de datos Intersystems Cach. La ha
instalado, pero ahora no sabe muy bien por dnde empezar. Se acerca a Juan y le pide ayuda, pero
Juan est tremendamente atareado y no le puede ayudar justo en ese momento, por lo que decide
empezar a investigar por su cuenta. Qu es lo primero que tengo que hacer?, se pregunta.
Empezar es siempre lo ms difcil.

Ypordndeempiezo?LosSGDBOO modernosincorporanunagran cantidaddeopcionesparasu


administracinyutilizacinenfasesdedesarrollo(mientrasseestdesarrollandounaaplicacin)y
deproduccin(cuandolaaplicacinyadesarrolladaseestusandoplenamente).Aqunosvamosa
centrar en la parte de desarrollo, es decir, creacin y utilizacin de bases de bases de datos
orientadasaobjetosenunproyectosoftware.
Hoyda,lasbasesdedatosorientadasaobjetosdisponendevariostiposdeinterfaces,defciluso,
para administrar el servidor y poder hacer todas las tareas necesarias. Veamos lo que obtenemos
trasunainstalacindeInterSystemsCach:
9 PortaldeGestindelSistema.Esunservidorwebquedisponedeunapotenteherramientade
configuracin del SGBD a travs de la web. La URL de acceso a dicha herramienta es
normalmente http://localhost:57772/, siempre que ests usando el mismo ordenador en el
quehasinstaladolabasededatos.
9 HerramientasparainiciarydetenerelSGDB.Sihasoptadopordesactivarelinicioautomtico
de Cach, explicado en la animacin del apartado anterior, no olvides iniciar la base de datos
antesdeponerteatrabajar.
9 Documentacin.Cachincorporaunaextensadocumentacin,accesibleatravsdeweb.LaURL
de acceso a la documentacin, siempre que accedas desde el mismo ordenador en el que has
instalado
la
base
de
datos,
es
http://localhost:57772/csp/docbook/DocBook.UI.HomePageZen.cls. Obviamente tienes que
tenerCacharrancadoparaquefuncione.
9 CachStudio.Studioesunapotenteherramientaquepermitedisearcmodamentetubasede
datos.
Noobstante,enunainstalacintpicadeCach,ydependiendodelsistemaoperativousado,podrs
encontrarenelmendeiniciounaccesodirectoalasherramientasanteriores.
Otros servidores de bases de datos, como por ejemplo Oracle XE, tienen tambin una avanzada
interfazweb,yobviamentemuchasdelascaractersticasantescomentadas.ParaOracleXEexistela
herramientaSQLDeveloper,equivalentealaherramientaCachStudio.
Ahora veremos cmo crear un usuario nuevo en Cach, lo cual nos permitir acceder a la base de
datosdesdeJavaydesdelaherramientaStudio,usandodichousuario.Sianasnoconsiguescrear
elusuario,siemprepuedesusarelusuario_SYSTEMconcontraseaSYS.Dichousuariosecreaal
instalarCach.

11

DAW

12

Mantenimientodelapersistenciadelosobjetos

DesarrollodeAplicacionesWeb

Tema10

13

DAW

Mantenimientodelapersistenciadelosobjetos

EnelsiguienteenlacepuedesencontrarunacompletaguaparacomenzarausarOracleXE
desdecero:
http://docs.oracle.com/cd/E17781_01/admin.112/e18585/toc.htm

14

DesarrollodeAplicacionesWeb

Tema10

4.Creacindelabasededatos.
Caso prctico
Juan se levanta despus de un buen rato trabajando. Quiere dar una vuelta y despejarse, sabe que
no es bueno tirarse muchas horas sentado delante del ordenador sin hacer estiramientos y fijando
continuamente la vista en la pantalla, por lo que decide ir a tomar un poco de agua. Antonio, que lo
ve, y que est un poco desesperado, decide ir a preguntarle acerca de la base de datos que est
probando:
Hola Juan dice Antonio, tienes un minuto para explicarme cmo funciona la base de datos
Cach que me recomendaste?
Pues la verdad es que no, estoy muy atareado responde Juan. Si tan difcil te resulta, utiliza
otro SGDB que conozcas, aunque sea relacional. Oracle, por ejemplo, lo conoces?
S, pero la verdad es que quiero aprender cosas nuevas que me abran el mercado laboral, por lo
que estoy interesado en aprender a usar Cach.
Vale, dado que ests tan interesado, podemos quedar esta tarde, despus de que termine unas
cuantas cosas urgentes que tengo pendientes. De acuerdo?

Ycmocreounanuevabasededatos?DecaraalSGBD,unabasededatosserunaestructurade
discoquenospermitiralmacenarinstanciasdeobjetosdediferentetipo.Crearunabasededatos
nuevaenelSGBDCach,almacenadaentudiscodurolocal,sehaceatravsdelainterfazwebde
administracin.Elprocesoessencillo,yseresumeenlossiguientespasos:
9

Creacin de la base de datos. Al crear la base de datos crearemos las estructuras internas
necesariasyleasociaremosundirectoriodedisco,lugardondesealmacenarnlasinstanciasde
losobjetos.

Creacin de un espacio de nombres o namespace. Un espacio de nombres es un espacio de


trabajo lgico, que vincula una o varias estructuras de almacenamiento (bases de datos del
puntoanterior)conunaovariaslocalizaciones(diferentesdirectoriososervidores),detalforma
quesepuedecambiarporejemploeldirectoriodondeestnlosdatosdeunabasededatos,o
hacerrplicasparagarantizarelaccesoalosdatos.

De cara a trabajar con la base de datos Cach, lo que usaremos es el namespace o espacio de
nombres. Por ejemplo, si tenemos que conectar con Cach desde Java, usaremos el espacio de
nombresparaindicardondeestnguardadosnuestrosobjetos.Ysiqueremosdisearnuestrabase
de datos a travs de la herramienta Studio, tendremos que indicar cul es el espacio de nombres
dondesealojarnnuestrodatos.
Enlassiguientesimgenesseexplicalaformadecrearunabasededatosnuevaysucorrespondiente
espaciodenombres.

15

DAW

Mantenimientodelapersistenciadelosobjetos

16

DesarrollodeAplicacionesWeb

Tema10

17

DAW

Mantenimientodelapersistenciadelosobjetos

18

DesarrollodeAplicacionesWeb

Tema10

Si no consigues crear la base de datos y el espacio de nombres, no te preocupes, puedes usar el


espacio de nombres USER, que encontrars creado y listo para ser usado despus de instalar
Cach.Esteespaciodenombres,juntoconelusuario_SYSTEMconcontraseaSYStepermitirn
empezarausarCachsinconfigurarlo.
YsihasdecididoprobartambinconOracleXE,notienesquepreocuparteporlacreacindelabase
dedatos,dadoqueOracleXEvaconunabasededatoscreadapordefecto,cuyainstanciasellama
XE.NoesasenotrasversionesdeOracle,laversineXpressEditionesunaversinlimitadaparala
realizacindepruebasyaprendizajeenlaquemuchascosasyavanpreconfiguradas.

En Cach una base de datos es un espacio lgico que vincula uno o varios espacios de
nombres.

Verdadero

Falso

19

DAW

Mantenimientodelapersistenciadelosobjetos

5.Esquemadelabasededatos.
Caso prctico
Antonio ha quedado con Juan para que le explique el funcionamiento de la base de datos Cach, y
no quiere llegar tarde a la cita. Lleva su porttil, con la base de datos recin instalada, para que le
explique cmo funciona, y una libreta para tomar anotaciones. Juan aparece justo a tiempo y se
ponen de lleno a trabajar. Despus de un rato, Juan hace el siguiente comentario:
Antonio, qu te pasa? Te veo un poco perdido, quieres que te repita algo? dice Juan.
No, que va. Me estoy enterando de todo perfectamente, no te preocupes. Lo que pasa es que estoy
intentando comprender cmo se creara el esquema de la base de datos y me estoy liando un poco. A
ver, dices que tendra que crear una clase para poder almacenar objetos, y la pregunta es, cundo
creo el esquema de la base de datos? Antes o despus? responde Antonio.
Me parece que no me has entendido. Definir una clase en Cach es parte de la creacin del
esquema de la base de datos. Crear el esquema consiste en crear las clases que permitirn
almacenar informacin. Si no creas las clases, Cach no sabr cmo son los objetos a almacenar.

Qu es el esquema de la base de datos? Antes de poder almacenar datos hay que decirle al
SGBDOOcomosonlosdatosquesevanaalmacenarenlabasededatos,incluyendolasrelaciones
entre los diferentes objetos que se almacenan. Para esta tarea, el SGBD dispone de un lenguaje
especfico,llamadolenguajededefinicindeobjetos(ODL),quenospermitedefinircomosernlos
datosaalmacenar.Ellenguajededefinicindeobjetos,portanto,nospermitedefinirelesquemade
labasededatos.
Para los SGBDOO, el lenguaje de definicin de objetos vara de una base de datos a otra. Por
desgracia, aunque ha habido intentos de estandarizar este tipo de lenguajes por parte de la
organizacinODMG(deformaqueentodoslosSGBDOOseasimilar),nosehallegadobuenpuerto.
Hay pocos SGBDOO que cumplan con las especificaciones propuestas por la desaparecida ODMG.
CachusaunODLqueenciertamaneraseparecealODLdeODMG,aunqueapesardetodo,sigue
siendobastantediferente.
Para los SGBDOR, el lenguaje de definicin de objetos suele ser bsicamente el lenguaje estndar
SQL.EselcasodeOracleyotrasbasesdedatos.AgrosomodopodramosdecirqueellenguajeSQL
estcompuestodevariossublenguajes:unoparadefinirdatosyobjetos(equivalenteaunODL),otro
paraconsultadedatos,yotroparamanipulacindedatos.Aqunosreferimosalprimerodelostres,
losotrosdoslosveremosmsadelante.

20

DesarrollodeAplicacionesWeb

Tema10

Enelcasodeotrasbasesdedatos,comoDB4O,noesnecesariousarunlenguajediferenteparacrear
elesquemadelabasededatos.DB4OalmacenadirectamenteobjetosJavaenlabasededatos,por
loquesolohayquepreocuparsedecrearlasclasesenJava,dadoquedespussepuedenalmacenar
lasinstanciasdirectamenteenlabasededatos.Interesante,verdad?
PerocomonuestrofocoestpuestoenInterSystemsCach,veremoscmoeselODLdedichabase
de datos, comparndolo con el ODL de Oracle (SQL al fin y al cabo), para que as no pierdas la
perspectivadelossistemasobjetorelacionales.Demomento,hagamosunpequeoacercamientoa
la herramienta Cach Studio, que nos permitir crear nuestro esquema de una forma sencilla y
rpida.
EnlassiguientesimgenessehaceunpequeoacercamientoalaherramientaStudio.

21

DAW

Mantenimientodelapersistenciadelosobjetos

22

DesarrollodeAplicacionesWeb

Tema10

23

DAW

Mantenimientodelapersistenciadelosobjetos

24

DesarrollodeAplicacionesWeb

Tema10

A continuacin, se muestran varias afirmaciones sobre los esquemas de las bases de


datos. Marca aquellas que consideres falsas:
AllenguajequenospermitedefinirelesquemadelabasededatosenCachlo
denominamosDB4O
TodaslasbasesdedatostienenunODLdiferente,yaseanrelacionalesuorientadasa
objetos
Definirlasclasesformapartedelacreacindelmodelodebasededatos
EnOracle,noesnecesariodefinirelesquemadelabasededatos,dadoquesealmacenan
instanciasdeclasesJavadirectamente

25

DAW

Mantenimientodelapersistenciadelosobjetos

5.1.Ellenguajededefinicindeobjetos.(I)

Y cmo son los lenguajes de definicin de objetos de las diferentes bases de datos? Como se
comentenelapartadoanteriorexistendiferentesODLparaelmbitodelosSGBDOO,ycadauno
es,cuantomenos,ligeramentediferentedelresto.ElODLdeCachpermitecrearclasespersistentes
conunlenguajepropio.
VeamoscmoseraunaclasedeejemplousandoelODLdeCach,unprimeracercamiento:
Class User.Conductor Extends %Persistent
{
// Nombre del conductor o de la conductora, tipo cadena de texto.
Property Nombre As %String;
// Apellidos del conductor o de la conductora, tipo cadena de texto.
Property Apellidos As %String;
// Fecha de nacimiento del coductor, tipo fecha, formato DD/MM/AAAA.
Property FechaNacimiento As %Date (FORMAT = 4);
// Calcula la edad y retorna un nmero entero.
Method edad () as %Integer
{
Set e = ($PIECE($NOW(),",",1)-$PIECE(..FechaNacimiento,",",1))/365
Quit e
}
}

Veamosqusepuedesacarenconclusindespusdeverelcdigoanterior:
9 SeusalapalabrareservadaClassparacomenzaradeclararunaclase,seguidadelnombredela
clase.
9 ElnombredelaclaseesUser.Conductorqueincluiraelpaquete(User)dondeestlaclase
(Conductor).
9 La clase Conductor extiende (a travs del trmino reservado extends, como en Java) la clase
%Persistent,lacualesunaclasedesistema(aligualque %String o %Date ).Lasclasesdesistema
llevanel%delante,ysepuedenescribircomo%Library.Persistentoabreviadamentecomo
%Persistent. Extender la clase %Persistent hace que las instancias de dichas clases puedan
almacenarse,esdecir,quepuedanserpersistentes.
9 LaspropiedadesoatributosdelaclasesedefinenusandolapalabrareservadaProperty,seguida
delnombredelatributo,lapalabrareservadaaseindicandodespuseltipo.Enelejemplohay
tresvariables,dosdetipocadenadecaracteres(%String)yunatipofecha(%Date).
9 Sedeclaraunmtodo,elmtodoedad(),quecalculalaedaddelconductorodelaconductora.El
mtodoestconstruidoenunlenguajemuydiferenteaJava,setratadeObjectScript,elprincipal
lenguaje que usa Cach (puede usar, como veremos, varios lenguajes para la programacin de
mtodos). Si decides probar el ejemplo anterior, ten cuidado con los espacios, ObjectScript es
muycaprichosoconlosespacios.EnObjectScriptcualquiersentenciadebellevarcomomnimo
un espacio delante, salvo contadas excepciones, y procura dejar solo un nico espacio entre
elementosdellenguaje,haysituacionesenlasquedejarmsdeunespaciodaerror(eselcaso
deloscomandos).
Como ves, el ODL de Cach es moderadamente complejo. Se parece a Java en algunos, ms bien
pocos,aspectos,peroclaramenteesunlenguajeorientadoaobjetos.Unavezdescritalaclaseenel
ODLdeCach,hayquecompilarlaparacomprobarquenotieneerroresyparainsertarlaenlabase
dedatos,operacionesquesepuedenhacerdesdelaherramientaStudio.Unavezcreadaycompilada
laclase,yapodemosalmacenarinstanciasdedichaclaseenCach.

26

DesarrollodeAplicacionesWeb

Tema10

En el siguiente enlace puedes acceder a la gua de orientacin para programacin en


Cach.Unbuenlugardondecomenzar,paraaprendercmosecreanlasclasesdeCach,y
comoseprogramanlosmtodos,entreotrasmuchascosas.
http://docs.intersystems.com/cache20111/csp/docbook/DocBook.UI.Page.cls?KEY=GORIENT

5.1.1.Ellenguajededefinicindeobjetos.(II)
Y, cmo es el lenguaje de definicin de objetos de Oracle? Para empezar, podemos decir que en
Oraclenoexisteelconceptodeclase,sesustituyeensulugarporelconceptodetipodedatoobjeto,
el cual volveremos a explicar ms adelante, de momento diremos que en Oracle se crean tipos de
datoobjeto.
VersqueelODLdeOracleesmuydiferentealdeCach.Locuales,enalgunosaspectos,negativoy
en otros bastante positivo. Negativo porque obliga a aprender un lenguaje nuevo, pero positivo
porquesiyasabesSQL,tecostarpocotrabajoaprenderlo.Veamosunejemplo,elmismoejemplo
mostradoparaCachvamosrecrearloparaOracle:
CREATE TYPE tipo_conductor AS OBJECT (
nombre VARCHAR(20), apellidos VARCHAR(20), fecha_nacimiento DATE,
MEMBER FUNCTION edad RETURN INTEGER
);
/

Enelejemploanteriorsecreasimplementeuntipodedatoobjetonuevo,llamadotipo_conductor
quetienetresvariablesyunmtodo.Lasvariablessonporunlado,nombreyapellidos,quesondos
cadenasdetextodelongitudmxima20caracteres(VARCHAR2(20)),yporotrofecha_nacimiento
queserundatodetipofecha(DATE),yquecomoesobviocontendrunafechadenacimiento.
Fjateenlabarraqueaparecealfinal(/),esnecesarioponerlacuandousamosSQL*Plusparacrear
unnuevotipodedatoobjeto,yseponeenunanuevalnea,sinnadadelante.Siusasotrainterfaz
paraaccederaOracle(interfazwebporejemplo),noesnecesarioponerlabarra.Tampocoes
necesarioponerlabarraenotrotipodesentenciasqueveremos.
Elsiguientepasoseradefinirelmtodoedad,esdecir,escribirelcdigodelmismo:
CREATE TYPE BODY tipo_conductor AS
MEMBER FUNCTION edad RETURN INTEGER IS
v_edad INTEGER := 0;
BEGIN
v_edad := FLOOR(MONTHS_BETWEEN(CURRENT_DATE(),fecha_nacimiento)/12);
RETURN v_edad;
END;
END;
/

Unavezdefinidoelcdigodelosmtodos,entoncespasamosacrearunatablaquepermitir
almacenarinstanciasdedichosobjetos.EstoesdiferenteaCach,dondeestepasonoesnecesario.
EnCach,elhechodecrearycompilarunaclasepermitealmacenarinstanciasdedichaclase
(siemprequelaclasenotengaerrores),peroenOracleno:
CREATE TABLE conductores AS tipo_conductor;

27

DAW

Mantenimientodelapersistenciadelosobjetos

LasentenciausadaparacrearunatablaquepermitaalmacenarobjetosesCREATETABLEdondese
especificaelnombredelatabla,seguidodelapalabrareservadaASyeltipodedatoobjetoenel
quesebasarlatabla(enestecasotipo_conductor).
Sicreasuntipoounatablaydeseasborrarlos,puedesusarlasentenciaDROPTABLE(paralas
tablasdeobjetos)yDROPTYPEparalostiposdedatoobjeto.Tendrasqueborrarprimerolatabla
deobjetos,despuselcuerpodeltipodedatoobjeto,ydespuseltipo,eneseorden.Porejemplo:
DROP TABLE conductores;
DROP TYPE BODY tipo_conductor;
DROP TYPE tipo_conductor;

Puedesejecutarestassentencias,ylasanteriores,desdeSQL*Plus.Siunatablaotipoyaexisteen
Oracle,notedejarvolveracrearlos,tendrsqueborrarlosprimero.

En el siguiente documento puedes ver cmo es la sintaxis usada para crear objetos en
Oracle,esos,tendrsqueiralapartado5,porqueloscaptulosanterioreshablandelas
basesdedatosorientadasaobjetos.
http://www3.uji.es/~mmarques/e16/teoria/cap2.pdf

En Cach, las clases que extienden la clase %Library.Persistent son almacenables en la


base de datos.

Verdadero

Falso

5.2.Tipodedatosbsicosyestructurados.(I)
Hay tantos tipos de datos en Cach como en Java?
Los tipos de datos que se pueden usar en Cach
determinan obviamente que datos puede contener
cadaatributooquedatospuederetornarunmtodo.
La respuesta sera casi que si, podramos decir que
tienenprcticamentelosmismostiposdedatos.EnCachunapropiedadoatributopuedeser:
9

Untipodedatobsico(cadenadecaracteres,nmero,etc.).

Unainstanciadeotraclase,esdecir,sepuedeusarotraclasecreadacomotipoparaunatributo.

Unacoleccindeobjetos.

Existen otros casos, pero nos vamos a ceir a estos. En Cach los tipos de datos bsicos estn
recogidoscomoclasesdesistema,ysiemprelesprecedeelsmbolo%(comoyasecomentantes).
Haymuchos,perolosmsimportantesson:
9

%Boolean.Valorlgicooboolean,cuyosvaloresposiblesson0(falso)o1(verdadero).

%Date y %Time. Almacenan la fecha y la hora en el formato interno de Cach (formato


$HOROLOG),elcualessencillodeentender.Elformato$HOROLOGesunacadenaquecontiene
elnmerodedasdesdeel31dediciembrede1840ylossegundosdesdeelcomienzodelda,
separadosporunacoma,tendraunaspectocomoelquesigue:ddddd,sssss.sssss(lapartede

28

DesarrollodeAplicacionesWeb

Tema10

lossegundosvacondecimales).Porejemplo62200,65310.804992correspondeconel19/4/2011
alas18:08.Lapartedelosdas,seraportantolafecha,ylapartedesegundosseralahora.
9

%TimeStamp. Es un sello temporal. El sello temporal se usa generalmente para almacenar un


momentoexactoenel tiempo,porejemplo,cuandoseproduceunaventa,dadoquecontiene
tanto la fecha como la hora en formato legible por el ser humano. El sello temporal tiene la
formaYYYYMMDDHH:MM:SS(cuatrodgitosparaelao,dosparaelmesydosparaelda,
separadosporguiones,ydosdigitosparalahora,dosparalosminutosydosparalossegundos,
separadospordospuntos).

%Integerquecorrespondeconnmeroentero.

%Numeric que corresponde con un nmero con decimales almacenado internamente en coma
fija. Si queremos almacenar un nmero donde el nmero de decimales es fijo (dos decimales
comomximoporejemplo),deberamosusarestetipo.

%Doublequecorrespondeconunnmeroalmacenadointernamenteencomaflotante.

%String,quecorrespondeconunacadenadecaracteres.

Lostipos%Boolean,%Integer,%Float,%Doubley%Numericserantiposdedatossimples,dadoque
almacenan un valor simple, es decir, un nico dato. Mientras que los tipos %Date, %Time,
%TimeStamp y %String podran ser considerados como tipos de datos estructurados, puesto que
almacenanvalorescompuestosasuvezdevariosdatos(unacadena,porejemplo,almacenavarios
caracteres). Sin embargo, como se trata de tipos proporcionados de forma nativa por la base de
datos,lospodemosconsiderartambincomotiposdedatossimples.
Entendemospordatoestructuradoaquelquenospermitenalmacenardatosrelacionadosjuntos(el
da,elmesyelaodeunafecha,porejemplo).Sinecesitasalmacenarundatocompuestodevarias
partes,porejemplo,ladireccindeunapersona(calle,bloque,nmero,cdigopostal,etc.)tienes
que crear una clase y usar dicha clase como tipo de dato, tal y como se ver en los prximos
apartados.Tambinexistenotrostiposdedatosestructurados,comolascolecciones,queveremos
tambinmsadelante.

Enelsiguienteenlacepodrsampliarinformacinsobrelostiposdedatosdisponiblesen
Cach.
http://docs.intersystems.com/ens20102/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_data
types
Y en el siguiente enlace podrs obtener ms informacin acerca del formato usado para
fechayhoraenCach.
http://docs.intersystems.com/ens20102/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS_vhor
olog

5.2.1.Tipodedatosbsicosyestructurados.(II)
Y qu tipos de datos hay en Oracle? Tantos como en Cach? La
respuesta es que hay muchos, pero son muy diferentes a Java y
Cach. En Oracle, un atributo puede ser tambin un tipo bsico, un

29

DAW

Mantenimientodelapersistenciadelosobjetos

objeto o una coleccin de objetos. Veamos a modo comparativo, cuales son los tipos de datos
bsicosmsusadosdeOracle:
9

CHAR(n).Cadenasdecaracteresdetamaofijo,dondeneselnmerodecaracteres.

VARCHAR2(n)yVARCHAR(n).Cadenasdecaracteresdetamaovariable,dondeneseltamao
mximo.VARCHAResunaliasdeVARCHAR2,peroserecomiendausarVARCHAR2.

NCHAR(n).EquivalenteaCHAR(n)peroconcodificacinunicode.

NVARCHAR2(n).EquivalenteaVARCHAR2peroconcodificacinunicode.

NUMBER o NUMBER(p,s). Permite almacenar un nmero en coma fija o flotante. Se puede


especificarlaprecisin(p),queserelnmerodedgitosmximoquetendr,ylaescala(s),que
serelnmeromximodedecimales.Siqueremosalmacenarunnmerodondeelnmerode
decimalesesfijo(dosdecimalescomomximoporejemplo),deberamosusarestetipo.

FLOAT.Tipodedatopensadoparaalmacenarunnmeroencomaflotante.

INTEGER.Tipodedatopensadoparaalmacenarunnmeroentero.

DATE.AlmacenalahoraylafechaenunformatointernodeOracle.Paraconvertirunacadena
quecontieneunafechaalformatointernodeOracledebemosusarlafuncinTO_DATE,ypara
pasar una fecha a formato cadena (legible por un ser humano) usaremos la funcin TO_CHAR.
Comoveremosmsadelante,estasfuncionesestntambindisponiblesenCach.

TIMESTAMP. Es un sello de tiempo y es una extensin del tipo DATE. Permite almacenar el
momentoexactoenelquealgoocurri.IgualqueexistelafuncinTO_DATEparaeltipoDATE,
paraeltipoTIMESTAMP existelafuncinTO_TIMESTAMP,que permiteconvertirunafechaen
formatolegibleporelserhumanoaunsellotemporalalmacenadoenlabasededatos.

Comopuedesver,hayequivalenciasentrelostiposdedatosdeCach,deOracleydeJava,perono
hayunacorrespondenciaexacta.ParaalmacenarunStringdeJava,podramosusarunNVARCHAR2
en Oracle, o un %String en Cach, el nico inconveniente es que en Oracle hay que especificar el
tamaomximo,locualsedebetenerencuentaalahoradeprogramanuestraaplicacinenJava,
haciendolasoportunascomprobaciones.

Enelsiguienteenlacepodrsencontrarmsinformacinacercadelostiposdedatosde
Oracle.
http://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements001.htm

Cules de los siguientes tipos empleados en Oracle y Cach se podran usar, si fuera
necesario, para almacenar un nmero negativo sin decimales?

30

FLOATdeOracle

NVARCHARdeOracle

%BooleandeCach

%DoubledeCach

DesarrollodeAplicacionesWeb

Tema10

5.3.Tiposdedatosobjeto.(I)
Tipo de datos objeto o clases? Son lo mismo? Como ya se coment con anterioridad, en los
SGBDOR,comopasaenOracle,noexistenclasescomotal,sinoqueloqueseusasonlostiposde
dato objeto, y esto, qu quiere decir? En los SGBDOR la estructura de almacenamiento lgico
utilizadaeslatabla,yesonoencajadeltodoconloqueseraunmodelodeobjetospuro.
EnSGBDcomoOraclelacreacindeobjetosseproduceatravsdelacreacindenuevostiposde
datos, a travs de sentencias SQL. Existe un tipo de dato llamado tipo de dato objeto, que es
bsicamente un tipo de dato compuesto que permite asociar datos y procedimientos. Los objetos
sernenestecasounnuevotipodedatoespecialquepodrserusadodelassiguientesformas:
9

Untipodedatoobjetopuedeserusadocomotipoparalascolumnasdeunatabla,dondepuede
habercolumnasquenoseandetipoobjeto.Estoquieredecirquelasinstanciasdelosobjetosse
almacenarndentrodeunacolumnaenunafiladelatabla.Enestaunidadnoseabordaresta
formadetrabajarconobjetosenOracle.

Crear tablas basadas en tipos de datos objeto, es decir, que solo contendran instancias de un
tipo de objeto. Este planteamiento es posiblemente el que ms se acerca a las bases de datos
orientadasaobjetosyeselqueabordaremosenestaunidad.

Veamos primero como es la sintaxis usada para crear clases en Cach, aunque ya se introdujo en
apartadosanteriores,despusharemosunacercamientoaOracle.Paraempezar,tienesqueteneren
cuentaqueCachesextremadamenteextensoytienemuchasopciones(lomismoqueOracle),aqu
nos centraremos en algunas pocas realmente, justo las que necesitamos para hacer los datos de
nuestraaplicacinmnimamentepersistentes.Veamosahoracomoseralaestructurageneraldeuna
claseenCach:
///Descripcin de la clase.
Class User.Conductor extends %Persistent [ClassType = persistent, Final]{
//Comentario.
//Aqu iran las definiciones de mtodos y clases.
}

El formato, por lo menos al principio, es simple. Ya se vio en un ejemplo anterior, ahora vamos a
profundizarunpocoenl.Vamosaanalizarlo:
9 Laprimeralneapuedeserunadescripcindelaclase.Paraincluirladescripcinseutilizantres
barrasinclinadas(///)ydetrsseescribiraladescripcin.
9 Justodespusdeladescripcin,debeirladefinicindelaclase.ParaelloseusalapalabraClass
(comoyasevioenapartadosanteriores).Elnombredelaclase(Conductor)incluyeelnombre
del paquete (User), lo cual se indica poniendo el nombre del paquete seguido de la clase
separadoporunpuntoPaquete.Clase.Uninconveniente,esqueenelnombredelaclasenose
puedeusarelguinbajo(solocaracteresydgitosnumricos).Bueno,engeneral,enCachnose
puedeusarelguinbajo(_)paranombresdeclases,variables,propiedades,etc.
9 Se pueden poner comentarios, dentro de la clase (fuera no es posible), usando la doble barra
(//),talycomosehaceenJava.Tambinsepuedeusarlanotacindecomentariomultilnea
dejava:/*Comentario*/.

31

DAW

Mantenimientodelapersistenciadelosobjetos

9 EnladefinicindelaclaseseutilizanlosmodificadoresClassTypeyFinal.Losmodificadoresse
indican entre corchetes separados por comas, algunos necesitan una asignacin y otros no
([ClassType=persistent,Final]).
9 El primer modificador, ClassType, permite indicar el tipo de la clase. En este caso es una clase
persistente(ClassType=persistent),esdecir,quelasinstanciasdelosobjetosdeestaclasese
podrn almacenar en la base de datos de forma persistente. Poner este modificador no es
suficiente para hacer la clase persistente, hay que poner tambin que se extiende la clase
%Persistent(extends%Persistent).
9 El segundo modificador, Final, permite indicar que esta clase no podr tener clases hijas, es
decir,quenopodrserheredadaconextends.Siqueremosquelaclasepuedaserheredada,
nodebemosponerlo.EncontraposicinaFinalestelmodificadorAbstract,queindicaque
nosepodrncrearinstanciasdelaclase,yquesernecesarioquedichaclaseseaheredadapor
algunasubclaseparapodercrearinstancias.

5.3.1.Tiposdedatosobjeto.(II)
Y, esto no se puede hacer ms fcilmente? Pues s. Te recomendamos en todo momento usar el
asistente de creacin de clases de la herramienta Studio de Cach para evitar problemas con el
lenguaje.Seacomosea,tantoenCachcomoenOraclelasclasesylostiposdedatoobjetocreados
puedenserreutilizadoscomopropiedadesoatributosdeotrosobjetos.Estopermitematerializarlas
relaciones de composicin entre clases (permitiendo que un objeto est compuesto de otros). Por
ejemplo,lasiguienteclase,pensadaparacontenerlosdatosdeunadireccin,puedeserusadacomo
atributodeotraclase:
Class User.Direccion Extends %SerialObject [ ClassType = serial ]
{
// Tipo de la va (calle, paseo, paraje, etc.)
Property tipovia As %String;
// Nombre de la va
Property nombrevia As %String;
// Nmero.
Property numero As %Integer;
// Bloque, planta, puerta y otro tipo de informacin.
Property dirinterior As %String;
Property codigopostal As %String;
Property localidad As %String;
Property provincia As %String;
Property region As %String;
Property pais As %String;
}

LaclaseUser.Direccionpodrausarsecomopropiedadenotraclasedelmismopaquete,simplemente
indicando como tipo el nombre de la clase al declarar la propiedad (recuerda que Cach distingue
entremaysculasyminsculas,noeslomismoUser.Direccionqueuser.direccion):
Class User.Conductor Extends %Persistent [ClassType = persistent]
{
Property direccion As Direccion;
}

Las clases de tipo serial (indicado con el modificador ClassType = serial y extendiendo la clase
%SerialObject), son clases que no pueden ser persistentes por si mismas, solo pueden ser

32

DesarrollodeAplicacionesWeb

Tema10

persistentes cuando se incrustan o embeben en otra clase, es el caso de la clase User.Direccion.


Para facilitar las explicaciones, en esta unidad solo se usarn clases tipo serial como atributos de
otrasclases,puestoquesuusoesmssencillo,porloqueterecomendamosquesipiensasembeber
una clase en otra, uses clases tipo serial para tal fin. No obstante, una clase persistente puede
tambinserusadacomopropiedadenotraclase,aunqueaqunoloveamos.

Enelsiguienteenlaceencontrarsinformacinabundanteacercadeladefinicindeclases
enCach:propiedades,mtodos,ndicesymuchoms.
http://docs.intersystems.com/cache20111/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ

En Cach, cules de los siguientes tipos de clases no pueden tener instancias por si
solas?
Persistent
Serial
Abstract
Final
Lasclasesabstractasnopuedentenerinstancias,dadoqueesnecesarioquetenganunasubclase.Lasclasestiposerialestn
pensadasexclusivamenteparaseratributosdeotrasclases,porloquenopueden,enteora,tenerinstancias.

5.3.2.Tiposdedatosobjeto.(III)
YcmoseralasintaxisdelasclasesenOracle?Preguntatrampa!Recuerda,nosonclasesloquese
usaenOracleyenotrasbasesdedatosobjetorelacionales,sinotiposdedatoobjeto,recuerdas?
MsomenosyaseintrodujoconanterioridadlasintaxisSQLdeOracleparacreartiposdedatos
objeto.Paraacercarnosunpocomsaestasintaxis,vamosarecrearelmismoejemplopropuesto
paraCach,estavezenOracle.
Primerocrearemoseltipodedatoobjetonuevo,tipo_direccion,pensadoparaalmacenarlosdatos
deunadireccin.VeamoscomoseraelcdigoSQLdeOracle:
CREATE TYPE tipo_direccion AS OBJECT(
tipovia VARCHAR2(10),
nombrevia VARCHAR2(20),
numero INTEGER,
dirinterior VARCHAR2(30),
codigopostal CHAR(5),
localidad VARCHAR(20),
provincia VARCHAR(20),
region VARCHAR(20),
pais VARCHAR(15));

Lasintaxisparacrearuntiponuevosiempretienemsomenoslamismaforma(yairemosviendo
algunosdetallesadicionalesmsadelante).Comienzapor"CREATETYPE",aloquesigueelnombre
deltipodedato("tipo_direccion"),despusindicamosqueloquevamosacrearesuntipodedato
objeto,yparaelloponemos"ASOBJECT".Despus,entreparntesisyseparadosporcomasseindica
lalistadeatributosymtodos.Enestecaso,comonohaymtodos,nohayquedeclararelcuerpode
laclase.

33

DAW

Mantenimientodelapersistenciadelosobjetos

DespusdeejecutarelcdigoSQLanterior,eltipodedatoobjetotipo_direccionsehabrcreadoy
sepodrusarcomotipoenotroobjeto,locualesmuysimple:paracrearunatributodedichotipose
poneelnombredelatributoseguidodeltipo.Fcilno?Veamoscomosera:
CREATE TYPE tipo_conductor AS OBJECT (
nombre VARCHAR(20),
apellidos VARCHAR(20),
fecha_nacimiento DATE,
direccion tipo_direccion);

Despus,parapoderalmacenarobjetos,debemoscrearunatabladeobjetosdeesetipo,estoen
OraclesehaceconlasiguientesintaxisSQLsiguiente,explicadayaenapartadosanteriores:
CREATE TABLE conductores OF tipo_conductor;

Comosedijoantes,yaunquenosotrosnolousaremos,losobjetosdeOraclepuedenserusados
tambinenunatablanormaldelmodelorelacional,comosideunatributosetratara:
CREATE TABLE empleados (
identificacion VARCHAR2(20),
nombre VARCHAR2(20),
sueldo
NUMBER(7,2),
direccion tipo_direccion);

Sinentrarendetalles,dadoqueesteenfoqueesmenosinteresanteparalapersistenciadeobjetos,
podemosdecirqueelejemploanteriorcreaunatablacondatosdeempleadosyempleadas,enla
quecadafilacontendrunaidentificacin(elDNIoelNIEporejemplo),elnombredelempleadoola
empleada,susueldoyadems,contendrsudireccinalmacenadaenunaestructuratipoobjeto.

EnelsiguienteenlacepodrsaprenderunpocomssobrelosobjetosdeOracle.
http://docs.oracle.com/cd/B19306_01/appdev.102/b14260/adobjint.htm

5.4.Atributos.(I)
Qu es lo ms importante de una clase? Sus atributos.
Est claro que sin los atributos una clase no es nada, ni
siquiera los mtodos de una clase son nada sin los
atributos de una clase. En Cach se llaman propiedades,
aunquellamarloatributosopropiedadesesindiferente.Ya
se ha visto ms o menos en apartados anteriores como
aadirunapropiedad,ahoravamosaprofundizarunpoco
ms. Nuevamente, tienes que tener en cuenta que Cach
tienemltiplesopciones,yqueaqusoloveremoslasmsimportantes.
Una propiedad se crea simplemente usando la palabra reservada Property, seguida del nombre
quedeseamosquetengadelapropiedad,yseguidadeltipo.Eltipodelapropiedadseindicaatravs
de la palabra reservada As, a la que debe seguir el tipo deseado. Finalizamos la declaracin con
puntoycomanoloolvides,veamosunejemplo:
Property FechaNacimiento As %Date;

34

DesarrollodeAplicacionesWeb

Tema10

Alahoradecrearunapropiedad,yaquvienelacuestinclave,podemosespecificaropcionalmente
algunosparmetrosquemodificarnelcomportamientodeltipodedato.Losparmetrosseponen
entreparntesis,justodetrsdeltipodedato.Veamosunejemplo,enelsiguienteejemplopuedes
verlosparmetrosmsimportantes:
Property FechaNacimiento As %Date(FORMAT = 4);
Property HorasSemanales As %Numeric(MINVAL=1,MAXVAL=40,SCALE=2);
Property Identificacion As %String(MINLEN=6,MAXLEN=10);

ElparmetroFORMATusadoconeltipodedato%Datepermiteespecificarelformatodelafecha.El
formatonmero4(FORMAT=4)correspondeconelformatodefechaeuropeo(DD/MM/AAAA,
dos dgitos para el da, seguidos de otros dos para el mes y cuatro para el ao). Los parmetros
MINVALyMAXVALpermitenespecificar,entiposdedatosnumricos,elvalormnimoyelmximo
admitido.ElparmetroSCALE,endeterminadostipos,comoeltipo%Numeric,permiteespecificar
elnmerodedecimales.YlosparmetrosMINLENyMAXLENpermitenindicaralascadenasdetexto
elnmeromnimoymximodecaracteresqueadmite.
Cadatipodedatotienesuspropiosparmetros,inclusopodemosdefinirparmetrosparanuestras
propias clases, aunque no vamos a entrar en ese aspecto. Pero aparte de poder acotar el
funcionamiento de un tipo de dato a travs de sus parmetros, podemos imponer o establecer
opciones de funcionamiento a una propiedad. Las opciones pueden ser de muchos tipos y son
independientesdeltipodedato,esdecir,todoslostiposdedatospuedentenerestasopciones.Las
ms comunes son: obligatoriedad de que una propiedad tenga valor (no pudiendo estar vaca) y
definirunvalorinicial.Veamosunejemplo:
Property
HorasSemanales
InitialExpression=25];

As

%Integer

(MINVAL=1,MAXVAL=40,SCALE=2)

[Required,

Estetipodeopcionesseindicanentrecorchetes,algunaspuedentenerunaasignacindeunvalory
otrasno.Requiredeslaprimeradelasopciones,eindicaquelapropiedadtienequetenerunvalor
obligatoriamente,nopuedeestarvaca.InitialExpresioneslasegundaopcinypermiteindicarque
lapropiedadtomaresevalorencasodequenoseleasigneunoenelmomentodecreacindela
clase,esdigamos,elvalorpordefecto.

Cul de los siguientes parmetros permite indicar el nmero de decimales de algunos


tipos numricos?
FORMAT
DECIMALS
SCALE
MINVAL

5.4.1.Atributos.(II)
YqupodemosdecirdelosatributosenOracle?Lacreacindeatributosyaseperfilantes.Indicar
queunobjetotieneunatributoconcreto,sehaceatravsdelODLdeOracle,yconsisteenindicar

35

DAW

Mantenimientodelapersistenciadelosobjetos

simplementeelnombrequequeremosparaelatributoseguidodeltipodedato,todoellopor
supuestoserealizaenladefinicindeltipodedatoobjeto:
CREATE TYPE tipo_conductor AS OBJECT (
nombre VARCHAR(20),
apellidos VARCHAR(20),
fecha_nacimiento DATE,
permiso VARCHAR(5),
puntoscarnet INTEGER);

Ahorabien,aligualquepasabaconelcasoanterior,conlosatributosdeCach,unatributopuede
teneracotacionesquemodificansucomportamiento.Algunasdeestasacotaciones,comoindicar
elnmeromximodecaracteresdeunacadena,olacantidaddedecimalesdeunnmero,sehacen
atravsdeltipo,comosevioenelapartadodetiposdedatos.Porejemplo,elsiguienteatributo
tendra10dgitoscomomximoydosdecimales:
numero number(10,2)

Perootrasrestriccionesmsprofundas,comoporejemploindicarqueunatributosoloadmiteun
rangodevalores,oqueunatributonopuedeestarvaco,oqueunacadenadecaracterestengaal
menosunalongitudmximaymnima,habraqueindicarlasalcrearlatabladeobjetos,ynosobreel
tipodedatoobjeto.Porejemplo:
CREATE TABLE conductores OF tipo_conductor (
CHECK (nombre IS NOT NULL AND apellidos IS NOT NULL AND
LENGTH(permiso)>2 AND puntoscarnet IS NOT NULL AND
puntoscarnet>0
AND puntoscarnet<=15));

ParaincluirrestriccionesenunatabladeobjetossepuedeusarlaclausulaCHECK.LaclausulaCHECK
sepuedeponerjuntoaotrasrestriccionesysepondracontinuacindeladefinicindelatablade
objetos,entreparntesis.Yentreparntesistambin,seindicantodaslasrestriccionesacomprobar,
porejemplo:queuncampotengavalorobligatoriamente(nombreISNOTNULL),quelalongitud
de una cadena contenga un mnimo o un mximo de caracteres (LENGTH(permiso)>2) o que un
nmeroestentreunrangodevalores(puntoscarnet>0).Cadacomprobacinseuneconelresto
conAND(equivalentealoperadorlgico&&deJava)oconOR(equivalenteaoperadorlgico||
deJava),pudiendousarparntesisparaagruparcomparaciones.

Si quieres saber un poco ms acerca de las restricciones de Oracle, puedes consultar el


siguientedocumento.LasrestriccionestipoCHECKestnapartirdelapgina8,perotodas
soninteresantes.Cuandololeas,tenencuentaqueenelmbitodelosobjetosseusanlas
restricciones a nivel de tabla, no a nivel de columna. Fijate tambin en el uso de las
sentenciasALTERparamodificarlasrestriccionesdeunatabla.
http://alarcos.infcr.uclm.es/doc/bda/doc/lab/p2/bdap2doc.pdf

La palabra reservada CHECK permite indicar condiciones que tienen que cumplir los
objetos almacenados en Cach y en Oracle.
Verdadero

36

Falso

DesarrollodeAplicacionesWeb

5.4.2.Atributos.(III)

Tema10

Yquotrasrestriccionespodemosimponeralosatributosdeunaclaseodeuntipodedatoobjeto?
Tanto en Cach como en Oracle hay varias restricciones para los atributos que son especialmente
importantes.Setratadelasrestriccionesdellaveprimariaydeunicidad.
Unoovariosatributospuedenserllaveprimaria,locualsignificaqueeseatributo,oesosatributossi
setratademsdeuno,identificandeformaunvocaacadaobjeto,puestoquenohabrotroobjeto
quetengalosmismosdatoseneseoesosatributos.Porejemplo,elDNIvaldracomollaveprimaria
paraobjetosquealmacenandatosdepersonas,dadoquenohabrdospersonasconelmismoDNI.
Verdad?Deesaforma,conociendoelDNI,podramoslocalizaracualquierpersonasinerror.
El concepto de unicidad es similar al de llave primaria, pero diferente en algunos aspectos. En un
objetonopuedehabermsdeunallaveprimaria(puedeserunallaveprimariacompuestadevarios
atributos,peronopuedehabermsdeuna).Launicidadconsisteenquenopuedehaberdosobjetos
conelmismovalorenundeterminadoatributo.Unejemplodeatributonicopodraserelcorreo
electrnico, dado que no habra dos personas que en principio compartieran el mismo correo
electrnico.
Paraindicarqueunoovariosatributossonllaveprimaria,oqueunatributoesnico,enCachse
realizaraatravsdelosndices.Cuidado,noconfundaslosndicesprimariosconlasllavesprimarias,
sonconceptosdiferentes,aunquerelacionadosentres(lasllavesprimariasylosatributosnicosse
usannormalmenteparacrearndicesprimarios).Losndicessonindicacionesrealizadasalabasede
datos,enlaqueledecimoscualessonloscamposmsbuscados,deformaquesepuedanoptimizar
lasbsquedas.Veamoscmosera:
Class User.Empleado Extends %Persistent
{
Property DNI As %String;
Property email As %String;
Index DNIidx On DNI [PrimaryKey];
Index emailidx On email [Unique];
}

EnestecasoseutilizaralapalabrareservadaIndex,seguidadeunnombrequeleasignamosal
ndice.DespussepondralapalabrareservadaOnseguidadelatributooatributossobrelosque
seaplicaelndice(cuandosonmsdeunoseponenentreparntesisyseparadosporcomas).A
continuacin,seindicaentrecorchetessisetratadeunallaveprimaria(PrimaryKey)odeun
atributonico(Unique).
EnOracle,lallaveprimariaylosatributosnicosseestableceranenlasentenciadecreacindela
tabladeobjetosynoenladefinicindeltipodedatoobjeto.Seradelasiguienteforma:
CREATE TYPE tipo_empleado AS OBJECT(
dni VARCHAR(10),
email VARCHAR(50));
CREATE TABLE empleados OF tipo_empleado
(CONSTRAINT dni_c PRIMARY KEY (dni), CONSTRAINT email_c UNIQUE (email));

37

DAW

Mantenimientodelapersistenciadelosobjetos

LapalabrareservadaCONSTRAINTpermiteindicarunarestriccin.Acontinuacindelamismase
indicaelnombredelarestriccin(dni_cyemail_c)ydespuslarestriccinens.Enelejemplo
apareceporunladolarestriccindeclaveprimariayporotroladeunicidad.Larestriccindeclave
primariaseponeconlapalabrareservadaPRIMARYKEYseguidadelatributooatributosalosquese
aplicaentreparntesis(sifueranmsdeunosepondranseparadosporcomas).Larestriccinde
unicidadsepondradeformasimilar,peroconlapalabrareservadaUNIQUE.
Oraclecrearaunndiceprimarioautomticamenteparalasclavesprimariasylosatributosnicos.

En una clase de Cach o en una tabla de objetos solo puede haber una llave primaria y
un atributo nico. Verdadero o falso?
Verdadero

Falso

5.5.Mtodos.(I)
Ycmoseprogramanlosmtodosenlasbasesdedatos?Alahoradeprogramarlosmtodosenlas
basesdedatosnormalmentenoseutilizaellenguajedeprogramacinqueseutilizaparaprogramar
la aplicacin final. Esto es por un lado, un problema, dado que al cambiar el lenguaje de
programacinesnecesarioaprendernuevoslenguajes,peroporotroladoesnecesario,dadoquelos
requisitosdeprogramacinenunabasededatosdistanbastantedelosrequisitosdeprogramacin
deunlenguajedeusogeneral.
Vamos a echar un vistazo a los diferentes mtodos de programacin en los diferentes SGBD que
estamosexplorando:
9

Cach permite una gran variedad de lenguajes de programacin para mtodos: ObjectScript
(lenguajesimilarallenguajeM)yBasic.Tambinpermiteotroslenguajes,comoJava,peroconel
inconvenientedequelosmtodosenJavanoseejecutannicompilanporelSGDB,sinoquese
ejecutanycompilanporyenlaaplicacincliente.EstoquieredecirquelosmtodosJavadeuna
claseCach,seejecutanentuprogramacuandoseinvocandesdetuprograma,ylosmtodos
ObjectScriptyBasicseejecutanenelservidorcuandotuprogramainvocaunmtodoremoto.

Oraclepermitecrearmtodosdedostipos:procedimientosyfunciones.LosmtodoenOracle
se programan principalmente en PL/SQL, aunque tambin es posible programarlos en Java. El
procesodeprogramacinenJavaesbastantemsliosoqueenPL/SQL,porloqueesteltimo
sueleserlaopcinprincipal.Enamboscasoslosmtodosseejecutanenelservidor.

Alahoradeprogramarenunauotrabasededatos,hayquetenerencuentaqueCachnopermite
sobrecargademtodos(mtodosconelmismonombreperocondiferentesargumentos),mientras
queOraclesi.Veamosahoracomosonlosmecanismosparacrearunmtodoenambasbasesde
datos.
LadefinicindeunmtododentrodeunaclasedeCach,sesuelehacerdelasiguienteforma:
Method edad(t1 As %String, t2 As %String) As %String [Language = cache]
{
Set e = ($PIECE($NOW(),",",1)-$PIECE(..FechaNacimiento,",",1))/365
Quit t1_e_t2
}

38

DesarrollodeAplicacionesWeb

Tema10

Unmtodopuedesermuchomscomplejoqueelejemploanteriorperoconestoessuficientepara
el propsito de esta unidad. El ejemplo anterior muestra un ejemplo de mtodo escrito en el
lenguaje ObjectScript. La palabra reservada Method se utiliza para indicar que se va a crear un
mtodo. El nombre del mtodo es edad, el cual tiene dos parmetros, t1 y t2, que son de tipo
cadenadetexto(%String).
Como resultado, el mtodo retornar una cadena, detalle que se indica poniendo As y el tipo a
devolver detrs de los parntesis con los argumentos (As %String). Es opcional indicar que el
mtododevolveralgo,notieneporqudevolvernada.Noobstante,elusoqueenestaunidadse
hardelosmtodosimplicaquedevuelvanalgo.
Opcionalmente se puede indicar, detrs del tipo a devolver por el mtodo, el lenguaje de
programacindelmtodo,quepordefectoserellenguajepropiodeCach,esdecir,ObjectScript.
EstoseindicaponiendolapalabraclaveLanguage,unsignodeigual,yellenguajeausardespus,
todo entre corchetes. Los lenguajes que se pueden utilizar son cache (ObjectScript), basic y
java entre otros. Entre los corchetes podemos definir muchas ms palabras clave separadas por
comas,peronoesnecesarioquedemomentolasconozcas.
Y entre llaves ira obviamente todo el cdigo del mtodo. Si se usa ObjectScript, hay que tener
cuidadoconelusodelosespacios.Comosecomentoantes,hayquedejaralmenosunespacioal
comienzodecadasentenciayconvienedejarunnicoespacioentreelementosdellenguaje(dejar
mspodradarerrorenalgunoscasos).

AcontinuacinmostramosunresumenorientativodecomoeslasintaxisdeObjectScript,
comparada con la sintaxis de Java. Ten en cuenta que el objetivo principal de ese
documentonoesqueaprendasunnuevolenguaje,sinoquesepasmsomenos,comoes
lasintaxisparapoderdefenderteyaprendermsportucuenta.
ResumendelasintaxisdeObjectScript.

Noeselobjetivodeestedocumentoqueaprendasdeltodounnuevo,completoycomplejolenguaje
de programacin como es ObjectScript, pero s que lo conozcas mnimamente para saber hacer
algunastareasbsicas.Laideaesqueseascapazdealmacenardatosenunabasededatoorientada
a objetos, y que si necesitas hacer un pequeo mtodo que se ejecuta en la base de datos, que
puedas hacerlo sin problemas. Por lo que vamos a analizar las caractersticas principales de
ObjectScript:
9

SebasaenellenguajeestndarM,peroconunasintaxismsrelajada.

Losbloquesdecdigosondefinidosporllaves,comoenJava.

Dentrodeunmtodo,elusodeespaciosesclave:
Hayquedejaralmenosunespaciodelantedecadasentencia.
Entreciertoselementosdelcdigohayquedejarunnicoespacio(detrsdeloscomandos).

No es lo mismo poner Set e con un nico espacio entre la palabra reservada Set y la
variable e, que poner dos espacios en medio. Si pones dos o ms espacios en este caso
darerroralcompilar.
9

LaslneasnoacabanenpuntoycomacomoenJava,simplemente,seponesaltodelneaylisto.

39

DAW

Mantenimientodelapersistenciadelosobjetos

Lasvariablessondetipadodbil,estoquieredecirquenosedeclaraeltipodelavariablecomo
enJava,sinoquelavariableasumeeltipoqueseleasignaenelmomentodelaasignacin.

Un mtodo puede retornar o no un dato. Cuando no se retorna un dato puede finalizarse la


ejecucindelmtodoencualquiermomentoconlasentenciaQuit.Cuandoseretornaundato,
estesedeberetornarponiendoQuitydetrselnombredelavariableconeldatoaretornar,
porejemplo:Quite.DadoqueObjectScriptesdetipadodbil,hayqueasegurarsedequela
variableconelvaloraretornarcontieneundatodeltipoadecuado(porejemplo,darerroral
ejecutarse si se espera que retorne un nmero entero y la variable retornada contiene una
cadena).

Los comentarios son del estilo a Java, iguales, salvo que existen otros tipos de comentarios
adicionales,quesolosepuedenusardentrodelbloquedecdigodeObjectScript.

Veamos brevemente cmo es la sintaxis de ObjectScript, partiendo de como se diferencia con


respectoaJava.Imaginaquetieneslasiguienteclasedepartida:
/// Clase conductor.
Class User.Prueba Extends %Persistent [ ClassType = persistent ]
{
Property dato As %Integer [ Required ];
Method ponerdato()
{
Set ..dato=$RANDOM(10)+1
}
Method obtenerdato() As %Integer
{
Quit ..dato
}
}

En el ejemplo anterior tienes dos mtodos (ponerdato y obtenerdato) y una propiedad (dato). El
resto,vamosaanalizarloapartirdeahora.Loprimero,veamoslas4formasdeponercomentarios:
// Modelo de comentario nmero 1, solo una lnea.
; Modelo de comentario nmero 2, solo una lnea.
;; Modelo de comentario nmero 3, solo una lnea.
#; Modelo de comentario nmero 4, solo una lnea.
/* Modelo de comentario multilnea. */

Comopuedesobservar,poneruncomentarioessencillo,sehaceigualqueenJava,aunquehayms
opciones. Ahora vamos a ver como se hace una simple asignacin. La asignacin se hace con el
operadorSet,elcualpermiteasignarunnuevovaloraunavariable,ysilavariablenoestcreada,
pueslacrea.Noseindicaeltipo,dadoqueesunlenguajedetipadodbil,yentreSetyelnombrede
lavariablesolopuedehaberunnicoespacio.Veamosunejemplo:
Method obtenerdato() As %Integer
{
Set a = 10
Quit ..dato*a
}

LasoperacionesaritmticasyelusodeparntesisesigualqueenJava,condosexcepciones:quela
potenciaseponecondosasteriscosseguidos("**"),porejemploa**bsignificaraaelevadoab,y

40

DesarrollodeAplicacionesWeb

Tema10

queelmduloseponeconlaalmohadilla("#"),porejemploa#beselmdulodeladivisinaentre
b.
Set b = (a+b)*c
Set b = a**2 // A elevado a 2
Set b = a#2 // A mdulo 2

LascadenassonigualesqueenJava,salvoqueparaconcatenarcadenasseusaelguinbajo(envez
deelsmbolodesuma),yqueparaponerunascomillasenlacadenanousamoslabarrainclinada
como carcter de escape (\"), simplemente se ponen dos comillas seguidas (""), sin espacios en
medio. Se pueden tambin concatenar con variables numricas, de forma que dichas variables se
transformarnacadenadetexto.Veamosunejemplo:
Set
Set
Set
Set

a
c
c
d

=
=
=
=

10
"ASDF"_"ASDF" // Concatenar cadenas, resultado ASDFASDF
"ASDF""ASDF" // Poner unas comillas en una cadena, resultado ASDF"ASDF
"ASDF"_a // Concatena a ASDF la variable a, dando lugar a la cadena ASDF10

EnCachhaydefinidasunmontndefuncionesglobales,quesonmuytiles.Lasfuncionesglobales
siempre deben llevar el signo del dolar ($) antepuesto al nombre. Es el caso de la funcin
$RANDOMquegeneraunnmeroaleatorioentre0yelnmerojustamenteanterioralquesepasa
porparmetro(enelejemplosiguienteseraunnmeroentre0y9,alqueselesumaunoparaque
elrangopaseaserde1a10):
Method multiplicarporaleatorio() As %Integer
{
Set e=$RANDOM(10)+1 // Valor aleatorio entre 1 y 10
Quit ..dato*e
}

VeamosahoracmoserealizalaevaluacindecondicionesenObjectScript,estosiqueesdiferente
aJavaenalgunosaspectos,veamoslo:
9

Comparacin de igualdad. En Java es con dos iguales (==) pero ObjectScript es con un solo
igual(=).

Comparacinmenorque.SerealizaigualqueenJava,conelsmbolomenorque(<).

Comparacinmenoroigualque.IgualqueenJava,conlossmbolosmenorqueseguidodeigual
(<=).

Comparacinmayorque.IgualqueenJava,conelsmbolodemayorque(>).

Comparacin mayor o igual que. Igual que en Java, con los smbolos mayor que seguido del
smboloigual(>=).

Comparacindedistintoa.MuydiferenteaJava,enObjectScriptesconelsmbolodeapstrofo
seguidodeigual('=).

41

DAW

Mantenimientodelapersistenciadelosobjetos

Comparacinnomenorque.Noexisteenjava,almenosdeestaforma,seindicaponiendoun
apstrofo seguido del smbolo de menor qu ('<). No menor que es lo mismo que decir o
mayoroigualque.

Comparacinnomayorque.Igualquelaanterior,noexisteenjava,almenosdeestamisma
forma. Se indicara poniendo el apstrofo seguido del smbolo de mayor qu ('>). Decir no
mayorqueslomismoquedecirmenoroigualque.

Y los operadores lgicos binarios, usados para combinar varias condiciones, o para negar una
condicin,soncasiigualesaJava:
9

LosoperadoreslgicosYbinaria(&&)yObinaria(||)sonigualesqueenJava.

El operador lgico negacin es diferente a Java. La negacin es con el apstrofo, por


ejemplo:"'(A<B&&B<C)",mientrasqueenJavaesconelsignodeexclamacininvertida(!(A<B
&&B<C)).

Sepuedenusarparntesis,igualqueenJava,paraagruparcomparaciones.

Veamosahoraunejemplodecmoseusanlascondiciones.Elejemplosiguienteutilizaeloperador
decontroldeflujoIf,queesigualqueenJava,salvoporelhechodequeseusa"Elseif"(todojunto)
enlugarde"elseif"(separado),parahaceruncondicionalmltiple.Yotrodetalle,enObjectScriptes
opcionalusarparntesisparaindicarlacondicinaevaluar,veamoslo:
Set a=$RANDOM(5)*2+1 // Nmero impar del 0 al 10
Set b=$RANDOM(5)*2 // Nmero par del 0 al 10
If a'<b { // Si "a" no es menor que "b", incrementamos "a"
Set a=a+1
}
Elseif '(a<b && b>5) { // Si no se cumple que "a" sea menor que "b" y "b" mayor que 5
Set a=a+2
}
Else { // En cualquier otro caso
Set a=a+3
}

VeamosahoracmoeslasentenciadecontroldeflujomientrasenObjectScript.Elbuclemientras
esigualqueenJava,salvoobviamenteporelhechodequelosoperadoresdecondicin(menorqu,
mayor qu, etc.) cambian para algunos casos, detalle explicado en prrafos anteriores. Veamos un
ejemplo,enelsiguientetrozodecdigosesumantodoslosnmerosentre1y10,paralocualseusa
unbuclemientras:
set a=10
set b=0
while (a<10)
{
set b=b+a
set a=a-1
}

Si el bucle mientras es igual que en Java, el bucle for es completamente diferente. Se pone con la
sintaxissiguiente:
For variable = valorinicial:incremento:valorfinal {
// Cdigo a ejecutar en cada iteracin
}

Enelbucleforanteriorvalorinicialserelvalordecomienzo,incrementoserelincrementodevalor
en cada iteracin del bucle, y valorfinal obviamente ser el valor de salida del bucle. Veamos un

42

DesarrollodeAplicacionesWeb

Tema10

ejemploqueharexactamentelomismoqueelbuclemientrasanterior(sumarlosnmerosdel1al
10):
set b=0
For a =1:1:10 {
write a
}

Yaestamoscasiacabandoestepequeoresumen.Esimportantequesepasquecuandounavariable
ya no se usa, se puede eliminar con el operador kill, pudiendo indicar varias variables separadas
porcomas:
Method CalcularSuma(inicio As %Integer, fin As %Integer) As %Integer
{
Set suma=0
Set contador=inicio
while (contador>=inicio && contador<=fin)
{
set suma=suma+contador
set contador=contador+1
}
Kill contador
Quit suma
}

Yotracosamuytil,conlafuncin$DATApodemosdeterminarsiunavariableexisteono,esdecir,
sisehacreadoantes:
if $DATA(a) {
write "Variable existente"
}
else
{
write "Variable no existe"
}

Y por ltimo, veamos cmo se accede a otros mtodos de la clase (es decir, como se invocan), y
comosepuedeobtenerycambiarelvalordelosatributosdelaclase.Parainvocarotromtododela
clase, se distinguen dos casos. Primer caso: el mtodo no retorna nada, o simplemente no nos
interesaloqueretorna.Paraejecutarloseusaeloperadordo(despusdeloperadordosolopuede
haberunnicoespacio):
Do ..ponerdato()

Fijateenlanotacinpuntopunto,seanteponendospuntos(..)delantedelosmtodosydelos
atributosdelaclase.DeesaformaCachsabequesetratadeunmtodoodeunatributoanivelde
clase.Veamosahoraelsegundocaso:elmtodoretornaunvalorqueademsnosinteresausar.En
esecasonoseusaeloperadordo,serealizaradelasiguienteforma:
Set a=a+..edad("A","B")

Yporltimo,ynomenosimportante,paraaccederaunapropiedadoatributodelaclasetambinse
usalanotacindepuntopunto(comoyahabrsimaginado),veamosunejemplo:
Set a=a+..dato // Suma a la variable "a" el valor de la propiedad de clase "dato"

43

DAW

Mantenimientodelapersistenciadelosobjetos

EstehasidounpequeoybrevecompendiodelasintaxisdeObjectScript,losuficientecomopara
poderhacertuspequeosexperimentos.

En el siguiente enlace podrs conocer, con un poco ms de profundidad, las sintaxis de


ObjectScript.Esos,antesdehacerclic,cogeunpocodeaire:
http://docs.intersystems.com/cache20101/csp/docbook/DocBook.UI.Page.cls?KEY=GCOS
Y en el siguiente enlace podrs buscar funciones preexistentes en Cach, parasu uso en
mtodosprogramadosconObjectScriptporti:
http://docs.intersystems.com/cache20102/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS_F
UNCTIONS
5.5.1.Mtodos.(II)
Y cmo son los mtodos de Oracle? Como se coment en el apartado anterior, los mtodos en
Oracle se programan principalmente en PL/SQL y tienen dos fases: definicin en el tipo de dato
objetoydeclaracin,enloquesedenomina,cuerpodeltipodedatoobjeto.EnOracletenemosdos
tipos de mtodos: procedimientos y funciones. Los procedimientos, en principio, no retornan un
valorylasfuncioness.Aunqueseexplicanlosdostipos,nosotrosusaremoslasfunciones.
En primer lugar tendramos que crear los tipos de datos objeto indicando que van a tener uno o
varios mtodos. Esto es relativamente sencillo, dado que consiste simplemente en indicar la
cabeceradelmtodo.Veamosunejemplo:
CREATE TYPE tipo_coordenada AS OBJECT (
x
NUMBER,
y
NUMBER,
MEMBER PROCEDURE moverPunto(incx NUMBER, incy NUMBER),
MEMBER FUNCTION distanciaCon (x2 NUMBER, y2 NUMBER) RETURN NUMBER
);

El tipo de dato objeto anterior est pensado para poder almacenar un par de coordenadas
cartesianas y en el se han declarado dos mtodos: un procedimiento que permite desplazar un
punto,indicandoelincrementoenladireccinxyenladirecciny(procedimientomoverPunto),
yunafuncinquepermitecalcularladistanciaconotropunto(funcindistanciaCon).Paradeclarar
un mtodo, simplemente se usa la palabra reservada MEMBER seguida de PROCEDURE o
FUNCTION dependiendo de si se trata de un procedimiento o de una funcin respectivamente.
Despusseindicaelnombredelmtodo,seguidodelosargumentosdelmtodoentreparntesisy
separadosporcomas.Enelcasodequeelmtodoseatipofuncin,sedeberindicarademseltipo
aretornar,conlapalabrareservadaRETURNseguidadeltipodedato.
Los parmetros del mtodo pueden ser uno, varios o ninguno, y van separados por comas, y se
indican simplemente poniendo el nombre de la variable seguida del tipo (incx NUMBER, por
ejemplo). Siempre existe el parmetro SELF, aunque no se indique manualmente. SELF es una
referenciaalapropiainstanciadeobjetodesdelaqueseinvocaelmtodo.SELF.xseraelatributo
xdelobjeto,aunqueenprincipionoesnecesarioponerSELFdelante.
Pero lo anterior, es solo la creacin del tipo, ahora tenemos que crear el cuerpo y definir los
mtodos.Veamoscmosera:
CREATE TYPE BODY tipo_coordenada AS
MEMBER PROCEDURE moverPunto(incx NUMBER, incy NUMBER) IS

44

DesarrollodeAplicacionesWeb

Tema10

BEGIN
x:=x+incx;
y:=y+incy;
END;
MEMBER FUNCTION distanciaCon (x2 NUMBER, y2 NUMBER) RETURN NUMBER IS
distancia NUMBER;
BEGIN
distancia:=SQRT(POWER(x2-x,2)+POWER (y2-y,2));
RETURN distancia;
END;
END;

Lacreacindelcuerpodeltipodedatoobjeto,oloqueeslomismo,ladefinicindelosmtodos,
comienza por CREATE TYPE BODY, seguido del nombre del tipo dato objeto en cuestin, y la
palabra reservada AS, a continuacin de la cual se pondr la definicin de cada mtodo. La
definicindecadamtodocomienzaporrepetirlacabeceradeclaradaalcreareltipodedatoobjeto,
seguida de un bloque de declaracin de variables (entre IS y BEGIN), donde se declararn las
variables que se usarn en el mtodo, y del cdigo del mtodo (entre BEGIN y END;). En las
funcionesseutilizareltrminoreservadoRETURNobligatoriamente,seguidodelvaloraretornar,
paraobviamenteindicarelvalordevueltoporlafuncin.

En el siguiente enlace puedes ampliar tus conocimientos sobre la sintaxis de PL/SQL


cuandoseusaconobjetos.Enestaunidadnoseprofundizarenestasintaxis,dadoqueno
eselobjetivoprincipal,peroaqupuedesencontrarmsinformacin:
http://docs.oracle.com/cd/B14117_01/appdev.101/b10807/10_objs.htm#i12431

Y en el siguiente enlace encontrars un completo tutorial sobre PL/SQL, que no est


enfocadoasuusoconobjetos,peroqueteservirparaconocermejorsusintaxis.
http://www.devjoker.com/gru/tutorialPLSQL/PLSQ/TutorialPLSQL.aspx

5.6.Herencia.(I)
Yparaqusirvelaherenciaenunabasededatos?PuesexactamenteparalomismoqueenJava.
TantoCachcomoOraclepermitenimplementarherenciaensubasededatos.
EnCachlasintaxisparaindicarqueunaclaseheredalaspropiedadesylosmtodosdeotraclasees
igualqueenJava,usandoeloperadorextends,porloquenotecostarningntrabajo.Lanica
salvedadesquecachpermiteherenciamltiple(unaclasepuedeheredarlosmtodosyatributosdevariasclasesala
vez)delacualenprincipionovamosahaceruso.Supongamosquetenemoslasiguienteclase:
Class User.Persona extends %Persistent {
Property nombre As %String;
Property apellidos As %String; }

Estaclaseyaheredalaclase%Persistent,usandoeloperadorextendsparaello.Setratadeunaclase
quecontienelosdatosmnimosdecualquierpersona,sunombreysusapellidos.Veamosahora
comoseraparacrearunaclasequeheredeoextiendalaclaseanterior:
Class User.Conductor Extends User.Persona{
Property PuntosCarnet As %Integer(MINVAL=0,MAXVAL=15);
}

45

DAW

Mantenimientodelapersistenciadelosobjetos

EnelejemplosecrealaclaseConductorqueextiendelaclasePersonaaadiendoelatributo
PuntosCarnetalaspropiedadesanteriores.Silaclaseestenelmismopaquete(ambasclases
anterioresestnenelpaqueteUser),noesnecesarioponerExtendsUser.Persona,bastacon
ponerExtendsPersona.LaclaseConductorheredatambinlacapacidaddepersistenciadelaclase
Persona,dadoquedichaclaseyahabaextendidolaclase%Persistent.SilaclasePersonanohubiera
extendidolaclase%Persistent,podramosindicarquenuestranuevaclaseConductorextiendeo
heredavariasclases,simplementeindicandoellistadodeclasesentreparntesisyseparadopor
comas:
Class User.Socio Extends (Persona,%Persistent) {
Property PuntosCarnet As %Integer(MINVAL=0,MAXVAL=15); }

LaherenciaenCachnoafectaparticularmentealosmtodos.SienlaclaseUser.Personaexistiese
unmtodoqueesnecesariosobreescribirenlaclaseConductor,simplementesecrearaelmtodo
enlaclaseConductor,usandoelmismonombredemtodo,conexactamentelosmismos
argumentosyexactamenteretornandoelmismotipodedato.Sinoseusanlosmismosargumentos
(encuantonmeroytipo),darerror,dadoqueCachnopermitelasobrecargademtodos.
Veamosunejemplodesobreeescriturademtodos,dondeunmismomtodogetNombreApellidos
secomportadeformadiferenteenuncasoyenotro:
Class User.Persona Extends %Persistent {
Property nombre As %String;
Property apellidos As %String;
Method getNombreApellidos () as %String {
Quit ..apellidos_", "_..nombre }
}
Class User.Conductor Extends (Persona,%Persistent) {
Property PuntosCarnet As %Integer(MINVAL=0,MAXVAL=15);
Method getNombreApellidos () as %String {
Quit ..nombre_" "_..apellidos }
}

Cul de las siguientes afirmaciones sobre la herencia en la base de datos Cach es


falsa?
Cachpermitelasobrecargademtodosheredados
Cachpermitesobreescribirmtodosheredados
Cachpermitelaherenciamltiple

5.6.1.Herencia.(II)
Yquocurreencachconlaspropiedadesheredadas?Sepuedensobreescribircambindoleel
tipoporejemplo?Encuantoalaspropiedadesdelasclasesheredadas,tienesquetenerencuenta
quenopuedesvolveradefinirunapropiedadyaexistenteenunaclaseheredada(estoesastanto
enOraclecomoenCach).

46

DesarrollodeAplicacionesWeb

Tema10

EnOraclelaherenciasehaceefectivaatravsdesubtipos,esdecir,creandoloquesedenomina
subtiposdetiposdedatosobjetoyaexistentes.AdiferenciadeCach,dondecualquierclasepuede
heredarsesalvoquesemarquecomofinal,lostiposdeobjetoOraclenopuedenheredarse,porque
sonsiemprefinales,salvoqueseindiquelocontrario.EstosignificaqueenlosobjetosdeOracle,
parapoderheredarlos,hayquemarcarloscomonofinales.Veamosunejemplo:
CREATE TYPE tipo_persona AS OBJECT (
nombre
VARCHAR2(20),
apellidos
VARCHAR2(40),
MEMBER FUNCTION getNombreYApellidos RETURN VARCHAR2
) NOT FINAL;
CREATE TYPE BODY tipo_persona AS
MEMBER FUNCTION getNombreYApellidos RETURN VARCHAR2 IS
BEGIN
RETURN apellidos || ', ' || nombre;
END;
END;

Enelejemploanteriorsecreaeltipoobjetotipo_personaequivalentealejemplopropuestopara
Cach.Fjatequeenladeclaracindeltipodedatoobjetotipo_personaseaadealfinalNOT
FINAL,conesoseconsiguequeeltipodedatoobjetoseanofinal,yqueporlotanto,pueda
heredarse.Parahacerunsubtipopodramoshacerlodelasiguienteforma:
CREATE TYPE tipo_conductor UNDER tipo_persona (
puntoscarnet INTEGER,
OVERRIDING MEMBER FUNCTION getNombreYApellidos RETURN VARCHAR2)
NOT FINAL;
CREATE TYPE BODY tipo_conductor AS
OVERRIDING MEMBER FUNCTION getNombreYApellidos RETURN VARCHAR2 IS
BEGIN
RETURN nombre || ' ' || apellidos;
END;
END;

ParacrearunsubtiposeutilizaeltrminoreservadoUNDERacontinuacindelcualhayqueindicar
eltipoobjetodelcualseheredarnmtodosypropiedades,esteserconocidocomoelsupertipo.
Para sobreescribir un mtodo existente se utiliza la palabra reservada OVERRIDING. Dicha palabra
reservadasedebeponertantoalahoradedeclararelmtodo,comoalahoradevolveraescribirsu
cdigoenelcuerpodeltipodedatoobjeto.
ResumamoslascaractersticasdelaherenciatantoenCach,comoenOracle:
9

EnCachsepermiteherenciamltiple,mientrasqueenOracleno.

TantoenCachcomoenOraclesepuedensobreescribirmtodosyaexistentes.

NienCach,nienOraclesepuedenredefiniratributosqueyaexistanenunaclasepadreo
supertipo.

Para qu sirve la palabra reservada OVERRIDING de Oracle?


Parasobrecargarunatributo

47

DAW

Mantenimientodelapersistenciadelosobjetos

Parasobreescribirunmtodo
Parausarpoderusarlosmtodosdelossupertiposenlossubtipos

5.7.Constructores.
Sabesquesunconstructorenprogramacin?Seguroquesi,dadoqueJavausaconstructores,yes
unadelastcnicasusadasenlaprogramacinorientadaaobjetos.
LosconstructoresenunSGBDOOoenunSGBDORpermitencreareinicializarunainstanciadeobjeto
partiendo de una serie de valores pasados como argumentos, garantizando que esa inicializacin
serloprimeroqueseharalcrearlainstancia.Ahoratepreguntars,cmoseponeunconstructor
en Cach? Y en Oracle? Pues Cach no permite la creacin de constructores, lo cual es un
inconvenienteenalgunosaspectos,peroOracles.Dehecho,enOraclesonmuyimportantes,dado
que los constructores se pueden usar para introducir una nueva instancia de objeto en la base de
datos.
Veamos pues cmo son los constructores en Oracle. Todo tipo de dato objeto de Oracle tiene un
constructorpordefecto.
Imaginalasiguientetabladeobjetos:
CREATE TYPE tipo_persona AS OBJECT (
nombre
VARCHAR2(20),
apellidos
VARCHAR2(40)
) NOT FINAL;
CREATE TYPE tipo_conductor UNDER tipo_persona (
puntoscarnet INTEGER)
NOT FINAL;
El constructor por defecto sera el siguiente:
tipo_conductor('Pepe', 'Garca Rodrguez', 12)

EnOracletodotipodedatoobjetotieneunconstructor,cuyosargumentossontodoslosatributos
delobjeto,puestosenelordenquesehanpuestoenladeclaracindeltipoobjeto.Eseconstructor
seusa,porejemplo,alahoradeguardarunobjetonuevoenlabasededatos:
CREATE TABLE conductores OF tipo_conductor;
INSERT INTO conductores VALUES (tipo_conductor('Pepe', 'Garca Rodrguez', 12));

Enelejemploanterior,seinsertaunnuevotipo_conductorenlatablaconductores.Esoserealizaa
travsdelaexpresinINSERTINTOdeSQL,enlaqueseindica,porunladolatabladeobjetosdonde
se va a insertar el objeto (conductores en este caso), y por otro, los valores a insertar. La palabra
reservada VALUES, permite indicar que valores se insertarn, despus de ponerla se indican los
valoresainsertarenlatablaencerradosentreparntesis.Enestecaso,elvalorainsertarseobtiene
a partir del constructor del tipo de dato objeto tipo_conductor, por tanto, lo que hay que poner
comovalorainsertaressimplementeelconstructor.
LosconstructorestambinseutilizanenlosprocedimientosylasfuncionesprogramadasconPL/SQL,
paracrearporejemplounainstanciadeunobjeto.

48

DesarrollodeAplicacionesWeb

Tema10

Oracle permite personalizar, es decir, crear a medida tus propios constructores. En la


siguientepgina,eningls,puedesprofundizareneseaspecto:
http://docs.oracle.com/cd/B19306_01/appdev.102/b14260/adobjadv.htm#CHDJCFAG

Toda clase de Cach tiene un constructor por defecto, el cual contiene todos los atributos
de la clase, en el orden en el que se han puesto en la definicin de la clase. Verdadero o
falso?
Verdadero

Falso

5.8.Tipodedatoscoleccin.(I)
Quesunacoleccin?Unacoleccin,comoyasabrsdeunidadesanteriores,esunaestructuraque
permite almacenar varios datos, generalmente del mismo tipo, de forma que sean fcilmente
accesibles.EnJava,porejemplo,sonmuyusadaslaslistasylosmapas.
De cara a una base de datos, las colecciones son estructuras que nos permiten almacenar varios
datos,generalmentedelmismotipo,yestosematerializaenatributosquesoncapacesdecontener
varios objetos del mismo tipo. En las bases de datos, las colecciones son bastante diferentes a las
coleccionesenJava,sonmenosflexiblesyhaymenostipos.Veamosqucoleccionestenemosenlas
basesdedatosqueestamosexplorando:
9

Cach.EnCachunapropiedadpuedeserdedostiposdecolecciones:listasyarraysasociativos
(similaresalosmapasenJava).Ladiferenciaentreambasesquelaslistassonsimplementeun
conjuntodeelementosalosqueseaccedeporsuposicin,mientrasquelosarrayssondetipo
asociativo,esdecir,permitenaccederaunelementoporunaclavequepuedeserunnmeroo
unacadena.ElnmerodeelementosquepodemosalmacenarenunalistayunarraydeCach
esilimitado.

Oracle.EnOracleDBlascoleccionespuedenserdedostipos:tablasanidadasyarrays(conocidos
como VARRAYS). La principal diferencia entre ambas estructuras, es que las tablas anidadas
permitenalmacenarunnmerodinmicodeelementos,digamossinlmitelgico,mientrasque
los VARRAYS almacenan un nmero fijo de elementos, aunque este puede ser cambiado. Las
tablasanidadassegestionarncomounatablaqueestdentrodeotratabla,mientrasquelos
VARRAYSserndigamosunapropiedadconmltiplesvaloresdelmismotipo.

Veamoscmoseusanlascoleccionesdeobjetos.EmpezaremosporCach,dondesepodrcrearuna
nuevapropiedadtipoarrayotipolistadelasiguienteforma:
Class User.Conductor Extends (Persona)
{
Property PuntosCarnet As %Integer(MINVAL=0,MAXVAL=15);
Property Mails As List Of %String;
Property Telefonos As Array of %String;
}

EnelejemploanteriorseaadendospropiedadestipocoleccinalaclaseConductor,unalistade
correos electrnicos y un array de telfonos. Los tipos base para la lista y el array son cadenas de
texto(%String),perosepodrahaberutilizadocualquierotrotipooclasecreadapornosotros.Para
declararestaspropiedadesseponeAsListOfoAsArrayOf,seguidodeltipodedatoaalmacenar

49

DAW

Mantenimientodelapersistenciadelosobjetos

enlalista,dependiendodesisetratadeunalista(primercaso)odesisetratadeunarray(segundo
caso).LaslistasenCachestnimplementadasporlaclase%ListOfObjects,mientrasquelosarrays
estnimplementadosporlaclase%ArrayOfObjects,estosignificaquecuandocreamosunalistaoun
array, esta realmente se traduce en una de esas clases. Dichas clases proveen de sendos mtodos
paragestionarloselementosquetienenensuinterior.
Loscorreoselectrnicosdelejemploanteriorsealmacenarancomounalista.Enlalistaseaccedea
loselementosporlaposicinqueocupan,simplementehayqueindicarelnmerocorrespondientea
su posicin. Pero los telfonos se almacenaran como un array asociativo, y eso implica que para
acceder no se indica su posicin, sino una cadena de texto o nmero que acta de llave. Los
telfonos se almacenaran asociados auna llave, lo cual es muy til. Por ejemplo, podramos decir
que el telfono asociado a la llave FAX es el telfono 12345678, y que el asociado a la llave
MVILesotrodiferente.LosarraysdecachsonelequivalentealosmapasdeJava(HashMappor
ejemplo).
Notepierdaselsiguientecdigodeejemplo.Enl puedesver comoseusanlaslistasylosarrays
asociativos de Cach, usando ObjectScript. Hay mtodos para eliminar, modificar, extraer, etc.
elementosdelistasyarrays,versquerealmenteesmuysencillo:
Class User.Socio Extends %Persistent
{
// Nombre del socio
Property nombre As %String [ Required ];
// Apellidos del socio
Property apellidos As %String [ Required ];
// Nmero de socio.
Property NumSocio As %String [Required];
// Lista con los mails.
Property Mails As list Of %String;
// Lista con los telefonos.
Property Telefonos As array Of %String;
/* Ejemplo A.1 de uso de colecciones tipo listas de Cach.
Inserta un nuevo mail en la list de mails. */
Method insertarMail(mail As %String)
{
/* El mtodo Insert de las listas permite insertar un nuevo elemento del tipo
especificado en la lista, se insertar al final, dado que las listas no son
ordenadas. */
do ..Mails.Insert(mail)
}
/* Ejemplo A.2 de uso de colecciones tipo listas de Cach.
Hacer un recuento de los mails almacenados en la lista. */
Method contarMails() As %Integer
{
/* El mtodo Count de las listas permiten obtener el nmero de elementos
que contienen */
Quit ..Mails.Count()
}
/* Ejemplo A.3 de uso de colecciones tipo listas de Cach.
Obtener el mail almacenado en una posicin concreta de la lista.
Si dicho mail no existe se retornar cadena vacia (""), tambin conocido en Cach como
null string. Tienes que tener en cuenta que las posiciones se empiezan a numerar por 1
y no por 0.*/
Method obtenerMail (pos As %Integer) As %String
{
/* Primero se comprueba si la posicin indicada, donde est el elemento a
obtener, existe o no en la lista. Para ello, hacemos uso del mtodo contarMails
antes implementado. */
if pos<=..contarMails() && pos>=1
{
/* El mtodo GetAt permite obtener un mail almacenado en una posicin concreta.
Su nico argumento es la posicin a obtener. Tienes que tener en cuenta
que las posiciones se empiezan a numerar por 1, y no por 0. */
Quit ..Mails.GetAt(pos)

50

DesarrollodeAplicacionesWeb

Tema10

}
Else /* Si el mail no existe, se retorna cadena vaca (""), tambin llamado null string.
*/
{
Quit ""
}
}
/* Ejemplo A.4 de uso de colecciones tipo listas de Cach.
Eliminar un mail. Retornar 1 (verdadero) se ha eliminado, y 0 (false) en otro caso.
Se le pasa como parmetro la posicin del elemento a eliminar, que se empieza a numerar
por 1 y no por 0.
*/
Method eliminarMail(pos As %Integer) As %Boolean
{
Set eliminado=0
/* Volvemos a hacer uso de la funcin contarMails para saber si la posicin
indicada est o no dentro de los lmites de almacenamiento de la lista. */
if pos<=..contarMails() && pos>=1
{
/* El mtodo RemoveAt de las listas permite eliminar un elemento
de una posicin concreta. Se le pasa como argumento la posicin a eliminar, que
deber empezar a contarse en 1 y no en 0. Si consigue eliminarse, entonces
retornar el elemento eliminado, en caso contrario retornar cadena vaca (""),
tambin llamado null string. */
Set result=..Mails.RemoveAt(pos)
if result="" { Set eliminado = 0 }
else { Set eliminado = 1 write !,"Eliminado:",result }
}
Quit eliminado
}
/* Ejemplo A.5 de uso de colecciones tipo listas de Cach.
Obtener los mails separados por comas. Usando mtodos antes creados se obtiene
una lista separada por comas de los mails.
*/
Method obtenerMails () As %String
{
Set t=""
for i=1:1:..contarMails() {
if i'=1 { Set t=t_"," }
Set t=t_..obtenerMail(i)
}
Quit t
}
/* Ejemplo A.6 de uso de colecciones tipo listas de Cach.
Vaciar la lista de mails. */
Method vaciarMails ()
{
/* El mtodo clear permite vaciar una lista, dejandola sin elementos. */
do ..Mails.Clear()
}
/* Ejemplo B.1 de uso de colecciones tipo arrays de Cach.
Insercin de un telefono y su tipo en el array.
Se trata de poder almacenar el telefono, junto al tipo, por ejemplo: "fax" junto al
nmero de fax o "movil" junto al telfono mvil, para as poder diferenciar el tipo
de telfono.*/
Method insertarTlf (numero As %String, tipotlf As %String)
{
/* Con el mtodo SetAt se inserta un telefono asociado a una llave, que identicar
al telefono por el propsito del mismo.*/
Do ..Telefonos.SetAt(numero,tipotlf)
Quit
}
/* Ejemplo B.2 de uso de colecciones tipo array de Cach.
Recuperacin del telefono de un tipo determinado almacenado en el array. */
Method obtenerTlf (tipo As %String) As %String
{
/* Se obtiene un elemento etiquetado como "tipo" a travs del mtodo GetAt,
retornando el elemento en cuestin o "" (null string) en caso de que no
se encuentre. */
Quit ..Telefonos.GetAt(tipo)
}

51

DAW

Mantenimientodelapersistenciadelosobjetos

/* Ejemplo B.3 de uso de colecciones tipo array de Cach.


Elimina un telefono (por tipo) introducido previamente en el array. */
Method eliminarTlf (tipo As %String) As %Boolean
{
Set eliminado=0
/* A travs del mtodo isDefined se puede averiguar si en el array hay o no un
elemento almacenado con una clave asociada croncreta. Si es as, retornar 1 (true)
en caso contrario retornara 0 (false). */
if ..Telefonos.IsDefined(tipo) {
/* El mtodo RemoveAt elimina un elmento que tenga una clave concreta,
si se ha eliminado retornar el elemento eliminado, en caso contrario,
por ejemplo, si no existiera el elemento, retornara cadena vaca (""),
tambin conocida como null string. */
Set result=..Telefonos.RemoveAt(tipo)
If result="" { Set eliminado = 0 } Else { set eliminado=1 }
}
Quit eliminado
}
/* Ejemplo B.4 de uso de colecciones tipo array de Cach.
Obtiene la lista de telefonos separadas por comas. Si no hay telefonos, retornar una
cadena vaca (""), tambin conocido como null string.
*/
Method obtenerTlfs () As %String
{
Set result=""
/* El mtodo Next, de los arrays permite obtener la primera llave o clave del
primer par llave/valor almacenado, pero solo cuando se le pasa cadena vaca como
parmetro. Si no existiese, retonara cadena vaca. */
Set tipotlf=..Telefonos.Next("")
while tipotlf'="" {
if result'="" { Set result=result_"," }
/* Con el mtodo GetAt obtenemos el valor asociado a una llave o clave. */
Set result=result_tipotlf_":"_..obtenerTlf(tipotlf)
/* El mtodo Next, permite obtener la siguiente llave o clave de la lista
cuando se le pasa una clave, de esa forma, permite iterar sobre el array,
como se hace con los iteradores de java. */
Set tipotlf=..Telefonos.Next(tipotlf)
}
Quit result
}
/* Ejemplo B.5 de uso de colecciones tipo array de Cach.
Vacia la lista de telfonos usando el mtodo Clear, de forma similar a como se hace
con las listas.*/
Method vaciarTlfs ()
{
do ..Telefonos.Clear()
}
}

Y en el siguiente archivo encontrars las clases anteriores, importables a Cach a travs de la


herramientaStudio.
<?xml version="1.0" encoding="UTF-8"?>
<Export generator="Cache" version="24" zv="Cache for Windows (x86-32) 2010.1.3 (Build 703)"
ts="2012-02-25 14:56:29">
<Class name="User.Socio">
<Super>%Persistent</Super>
<TimeChanged>62512,53611.238828</TimeChanged>
<TimeCreated>62498,35489.617941</TimeCreated>
<UDLText name="T">
<Content><![CDATA[
// Nombre del socio
]]></Content>
</UDLText>
<Property name="nombre">
<Type>%String</Type>
<Required>1</Required>
</Property>
<UDLText name="T">
<Content><![CDATA[

52

DesarrollodeAplicacionesWeb

Tema10

// Apellidos del socio


]]></Content>
</UDLText>
<Property name="apellidos">
<Type>%String</Type>
<Required>1</Required>
</Property>
<UDLText name="T">
<Content><![CDATA[
// Nmero de socio.
]]></Content>
</UDLText>
<Property name="numsocio">
<Type>%String</Type>
<Required>1</Required>
</Property>
<UDLText name="T">
<Content><![CDATA[
// Lista con los mails.
]]></Content>
</UDLText>
<Property name="Mails">
<Type>%String</Type>
<Collection>list</Collection>
</Property>
<UDLText name="T">
<Content><![CDATA[
// Lista con los telefonos.
]]></Content>
</UDLText>
<Property name="Telefonos">
<Type>%String</Type>
<Collection>array</Collection>
</Property>
<UDLText name="T">
<Content><![CDATA[
/* Ejemplo A.1 de uso de colecciones tipo listas de Cach.
Inserta un nuevo mail en la list de mails. */
]]></Content>
</UDLText>
<Method name="insertarMail">
<FormalSpec>mail:%String</FormalSpec>
<Implementation><![CDATA[
/* El mtodo Insert de las listas permite insertar un nuevo elemento del tipo
especificado en la lista, se insertar al final, dado que las listas no son
ordenadas. */
do ..Mails.Insert(mail)
]]></Implementation>
</Method>
<UDLText name="T">
<Content><![CDATA[
/* Ejemplo A.2 de uso de colecciones tipo listas de Cach.
Hacer un recuento de los mails almacenados en la lista. */
]]></Content>
</UDLText>
<Method name="contarMails">
<ReturnType>%Integer</ReturnType>
<Implementation><![CDATA[
/* El mtodo Count de las listas permiten obtener el nmero de elementos
que contienen */
Quit ..Mails.Count()
]]></Implementation>

53

DAW

Mantenimientodelapersistenciadelosobjetos

</Method>
<UDLText name="T">
<Content><![CDATA[
/* Ejemplo A.3 de uso de colecciones tipo listas de Cach.
Obtener el mail almacenado en una posicin concreta de la lista.
Si dicho mail no existe se retornar cadena vacia (""), tambin conocido en Cach como
null string. Tienes que tener en cuenta que las posiciones se empiezan a numerar por 1
y no por 0.*/
]]></Content>
</UDLText>
<Method name="obtenerMail">
<FormalSpec>pos:%Integer</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
/* Primero se comprueba si la posicin indicada, donde est el elemento a
obtener, existe o no en la lista. Para ello, hacemos uso del mtodo contarMails
antes implementado. */
if pos<=..contarMails() && pos>=1
{
/* El mtodo GetAt permite obtener un mail almacenado en una posicin concreta.
Su nico argumento es la posicin a obtener. Tienes que tener en cuenta
que las posiciones se empiezan a numerar por 1, y no por 0. */
Quit ..Mails.GetAt(pos)
}
Else /* Si el mail no existe, se retorna cadena vaca (""), tambin llamado null string.
*/
{
Quit ""
}
]]></Implementation>
</Method>
<UDLText name="T">
<Content><![CDATA[
/* Ejemplo A.4 de uso de colecciones tipo listas de Cach.
Eliminar un mail. Retornar 1 (verdadero) se ha eliminado, y 0 (false) en otro caso.
Se le pasa como parmetro la posicin del elemento a eliminar, que se empieza a numerar
por 1 y no por 0.
*/
]]></Content>
</UDLText>
<Method name="eliminarMail">
<FormalSpec>pos:%Integer</FormalSpec>
<ReturnType>%Boolean</ReturnType>
<Implementation><![CDATA[
Set eliminado=0
/* Volvemos a hacer uso de la funcin contarMails para saber si la posicin
indicada est o no dentro de los lmites de almacenamiento de la lista. */
if pos<=..contarMails() && pos>=1
{
/* El mtodo RemoveAt de las listas permite eliminar un elemento
de una posicin concreta. Se le pasa como argumento la posicin a eliminar, que
deber empezar a contarse en 1 y no en 0. Si consigue eliminarse, entonces
retornar el elemento eliminado, en caso contrario retornar cadena vaca (""),
tambin llamado null string. */
Set result=..Mails.RemoveAt(pos)
if result="" { Set eliminado = 0 }
else { Set eliminado = 1 write !,"Eliminado:",result }
}
Quit eliminado
]]></Implementation>
</Method>
<UDLText name="T">
<Content><![CDATA[
/* Ejemplo A.5 de uso de colecciones tipo listas de Cach.
Obtener los mails separados por comas. Usando mtodos antes creados se obtiene
una lista separada por comas de los mails.
*/
]]></Content>
</UDLText>
<Method name="obtenerMails">
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[

54

DesarrollodeAplicacionesWeb

Tema10

Set t=""
for i=1:1:..contarMails() {
if i'=1 { Set t=t_"," }
Set t=t_..obtenerMail(i)
}
Quit t
]]></Implementation>
</Method>
<UDLText name="T">
<Content><![CDATA[
/* Ejemplo A.6 de uso de colecciones tipo listas de Cach.
Vaciar la lista de mails. */
]]></Content>
</UDLText>
<Method name="vaciarMails">
<Implementation><![CDATA[
/* El mtodo clear permite vaciar una lista, dejandola sin elementos. */
do ..Mails.Clear()
]]></Implementation>
</Method>
<UDLText name="T">
<Content><![CDATA[
/* Ejemplo B.1 de uso de colecciones tipo arrays de Cach.
Insercin de un telefono y su tipo en el array.
Se trata de poder almacenar el telefono, junto al tipo, por ejemplo: "fax" junto al
nmero de fax o "movil" junto al telfono mvil, para as poder diferenciar el tipo
de telfono.*/
]]></Content>
</UDLText>
<Method name="insertarTlf">
<FormalSpec>numero:%String,tipotlf:%String</FormalSpec>
<Implementation><![CDATA[
/* Con el mtodo SetAt se inserta un telefono asociado a una llave, que identicar
al telefono por el propsito del mismo.*/
Do ..Telefonos.SetAt(numero,tipotlf)
Quit
]]></Implementation>
</Method>
<UDLText name="T">
<Content><![CDATA[
/* Ejemplo B.2 de uso de colecciones tipo array de Cach.
Recuperacin del telefono de un tipo determinado almacenado en el array. */
]]></Content>
</UDLText>
<Method name="obtenerTlf">
<FormalSpec>tipo:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
/* Se obtiene un elemento etiquetado como "tipo" a travs del mtodo GetAt,
retornando el elemento en cuestin o "" (null string) en caso de que no
se encuentre. */
Quit ..Telefonos.GetAt(tipo)
]]></Implementation>
</Method>
<UDLText name="T">
<Content><![CDATA[
/* Ejemplo B.3 de uso de colecciones tipo array de Cach.
Elimina un telefono (por tipo) introducido previamente en el array. */
]]></Content>
</UDLText>
<Method name="eliminarTlf">
<FormalSpec>tipo:%String</FormalSpec>
<ReturnType>%Boolean</ReturnType>
<Implementation><![CDATA[
Set eliminado=0
/* A travs del mtodo isDefined se puede averiguar si en el array hay o no un
elemento almacenado con una clave asociada croncreta. Si es as, retornar 1 (true)
en caso contrario retornara 0 (false). */
if ..Telefonos.IsDefined(tipo) {

55

DAW

Mantenimientodelapersistenciadelosobjetos

/* El mtodo RemoveAt elimina un elmento que tenga una clave concreta,


si se ha eliminado retornar el elemento eliminado, en caso contrario,
por ejemplo, si no existiera el elemento, retornara cadena vaca (""),
tambin conocida como null string. */
Set result=..Telefonos.RemoveAt(tipo)
If result="" { Set eliminado = 0 } Else { set eliminado=1 }
}
Quit eliminado
]]></Implementation>
</Method>
<UDLText name="T">
<Content><![CDATA[
/* Ejemplo B.4 de uso de colecciones tipo array de Cach.
Obtiene la lista de telefonos separadas por comas. Si no hay telefonos, retornar una
cadena vaca (""), tambin conocido como null string.
*/
]]></Content>
</UDLText>
<Method name="obtenerTlfs">
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
Set result=""
/* El mtodo Next, de los arrays permite obtener la primera llave o clave del
primer par llave/valor almacenado, pero solo cuando se le pasa cadena vaca como
parmetro. Si no existiese, retonara cadena vaca. */
Set tipotlf=..Telefonos.Next("")
while tipotlf'="" {
if result'="" { Set result=result_"," }
/* Con el mtodo GetAt obtenemos el valor asociado a una llave o clave. */
Set result=result_tipotlf_":"_..obtenerTlf(tipotlf)
/* El mtodo Next, permite obtener la siguiente llave o clave de la lista
cuando se le pasa una clave, de esa forma, permite iterar sobre el array,
como se hace con los iteradores de java. */
Set tipotlf=..Telefonos.Next(tipotlf)
}
Quit result
]]></Implementation>
</Method>
<UDLText name="T">
<Content><![CDATA[
/* Ejemplo B.5 de uso de colecciones tipo array de Cach.
Vacia la lista de telfonos usando el mtodo Clear, de forma similar a como se hace
con las listas.*/
]]></Content>
</UDLText>
<Method name="vaciarTlfs">
<Implementation><![CDATA[
]]></Implementation>
</Method>

do ..Telefonos.Clear()

<Storage name="Default">
<Type>%Library.CacheStorage</Type>
<DataLocation>^User.SocioD</DataLocation>
<DefaultData>SocioDefaultData</DefaultData>
<IdLocation>^User.SocioD</IdLocation>
<IndexLocation>^User.SocioI</IndexLocation>
<StreamLocation>^User.SocioS</StreamLocation>
<Data name="SocioDefaultData">
<Structure>listnode</Structure>
<Subscript>"Socio"</Subscript>
<Value name="1">
<Value>NumSocio</Value>
</Value>
<Value name="2">
<Value>Mails</Value>
</Value>
<Value name="3">
<Value>numsocio</Value>
</Value>
<Value name="4">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="5">
<Value>nombre</Value>

56

DesarrollodeAplicacionesWeb

Tema10

</Value>
<Value name="6">
<Value>apellidos</Value>
</Value>
</Data>
<Data name="Telefonos">
<Attribute>Telefonos</Attribute>
<Structure>subnode</Structure>
<Subscript>"User.Socio.Telefonos"</Subscript>
</Data>
</Storage>
</Class>
</Export>

Enlossiguientesenlacespodrsvercondetallelosmtodosimplementadosenlasclases
%ListOfObjectsy%ArrayOfObjects:

http://docs.intersystems.com/cache20102/csp/documatic/%25CSP.Documatic.cls?PAGE=CL
ASS&LIBRARY=%25SYS&CLASSNAME=%25Library.ListOfObjects

http://docs.intersystems.com/cache20102/csp/documatic/%25CSP.Documatic.cls?PAGE=CL
ASS&CLASSNAME=%25Library.ArrayOfObjects

5.8.1.Tipodedatoscoleccin.(II)
YcmoseraparaOracle?Puesbastantediferente,dadoquenohaycorrelacinentrelostiposde
coleccionesdeOracleylosdeCach.ElcasodelarraydetelfonospodramosresolverloenOraclea
travsdetablasanidadas,peroprimerohayquecrearuntipodedatoobjetonuevo(tipo_telefono
porejemplo).Crearemosuntiponuevoquecontendrelnmerodetelfonoyeltipodetelfono
asociado(mvil,fax,etc.):
CREATE TYPE tipo_telefono AS object (
tipo varchar2(10),
numero varchar2(30)
) NOT FINAL;

Despus tendramos que crear un tipo de dato nuevo, no visto hasta ahora, partiendo de
tipo_telefono. Ese tipo de dato nuevo sera un tipo de dato tabla. Una vez hayamos creado este
nuevo tipo de dato, podremos poner una tabla de objetos tipo_telefono, como atributo en otra
tabla,permitiendoascrearunatablaanidada(poresosellamatablaanidada,porqueseusacomo
atributodeotroobjeto).Veamosportantocomosecreauntipodedatotabla,quepodrcontener
objetosdeltipotipo_telefono:
CREATE TYPE tabla_telefonos AS TABLE OF tipo_telefono;

La sintaxis es bastante sencilla. Comenzariamos por poner CREATE TYPE seguido del nombre del
tipo.YparadecirquesetratadeuntipodedatotablapondramosASTABLEOF,ydespus,habra
queindicarelnombredeltipodedatoobjetoenelquesebasaradichotipodedatostabla.Unavez
creado el tipo tabla_telefonos, tenemos que usarlo como atributo. Para ello, nos vamos a la

57

DAW

Mantenimientodelapersistenciadelosobjetos

declaracin del tipo objeto tipo_conductor, lugar donde vamos a introducir los telfonos, e
indicamosqueunodelosatributosserlatablaanidadaanterior:
CREATE TYPE tipo_conductor UNDER tipo_persona (
puntoscarnet INTEGER,
telefonos tabla_telefonos) NOT FINAL;

Paraelcasodelosmails,podemoshacerusodelaestructuraVARRAY,presuponiendoporejemplo
quenotendremosmsde5mails,comomucho,paraunusuarionormal(dadoquelosVARRAYsson
de tamao fijo). Para crear un VARRAY que contenga dichos mails debemos empezar creando
tambin un tipo de dato nuevo, que ser de forma efectiva un array de cadenas que contendr
correos electrnicos. Si bien, aunque los elementos del VARRAY en este caso son un tipo bsico
(VARCHAR2),esobviamenteposibleutilizartiposdedatoobjeto.Veamoscmosera:
CREATE TYPE array_mails AS VARRAY(5) OF VARCHAR2(40);

En el caso anterior se crea un nuevo tipo de dato, no visto hasta ahora, con el que se define un
VARRAY. La creacin del mismo se realiza poniendo CREATE TYPE, seguido del nombre del tipo de
dato,ydelaexpresinASVARRAY(5)OF,dondesedebeespecificarelnmerodeelementosdel
VARRAY(elejemplopropuestotiene5elementos).Alfinal,nodebemosolvidarponereltipodedato
ausarparacadaelementodelarray(VARCHAR2uotrotipo).Ahorayapodemoscompletarnuestro
tipo_conductor,aadiendoelvarrayparalosmails:
CREATE TYPE tipo_conductor UNDER tipo_persona (
puntoscarnet INTEGER,
mails array_mails,
telefonos tabla_telefonos) NOT FINAL;

Cul de las siguientes afirmaciones es incorrecta?


LastablasdeOracleseparecenlosmapasdeJava
LosarraysdeOracleseparecenlosarraysdeJava
LosarraysdeCachseparecenalosmapasdeJava
LaslistasdeCachseparecenalaslistasdeJava

5.8.2.Tipodedatoscoleccin.(III)
Yyaest?NohayquehacernadamsparacrearunacoleccinenOracle?Todavafaltaunpaso
ms.Conlovistoenelapartadoanterioryatendraseltipodedatotipo_conductorcreado.Ahora
debemos crear un tabla que contendr los conductores y las conductoras, proceso que ya se ha
explicadoantes,peroquecambialigeramentealtenerunatablaanidada.Parapodercrearahorala
tabladeobjetosdeberemosindicarcomosellamarlatablaanidadaenlaquesealmacenarnlos
telfonos,veamoscomosera:
CREATE TABLE conductores OF tipo_conductor NESTED TABLE telefonos STORE AS telefonos_nt;

58

DesarrollodeAplicacionesWeb

Tema10

Estocrearacomoyasabesunatabladeobjetos,dondecadafilaesunnicoobjeto.Lostelfonosse
almacenaran en realidad en una tabla aparte, llamada telefonos_nt, la cual se indica con la
expresin NESTED TABLE telefonos STORE AS telefonos_nt. Para rellenar la tabla podemos usar
tambinSQL,recurriendoalasentenciaINSERTantescomentadayusandoconstructores:
INSERT INTO conductores VALUES (
tipo_conductor ( 'pepe', 'garca', 12,
array_mails('mail1@direcciondemail.com', 'mail2@direcciondemail.com'),
tabla_telefonos (tipo_telefono ('fax','283847575'),tipo_telefono ('movil','28283748'))));

Enelejemploanterior,fijatequesehaceusodevariosnivelesdeconstructores.Secomienzaconel
constructorparaeltipo_conductor,queincluirensuinteriorentreotrascosas,unconstructorpara
elvarraydemails,dondesehanincluidodosmails(separadosporcomas),yunconstructorparael
tipotabla_telefonos,enelqueseinsertandosinstanciasdetipo_telefono,creadasasuvezusando
el constructor del tipo de dato objeto tipo_telefono. Es un poco lioso, pero es solo al principio,
cuandoteacostumbrasresultamssencillo.

Cul de las siguientes expresiones corresponde con crear un array en Cach?


ASTABLEOF
ASARRAYOF
ASARRAY(5)OF
ASTABLE(5)OF

EnelsiguientedocumentosobreOracleysumodelodeobjetos,podrsverunresumende
lovistoenestetema,yalgunascosasms.chaleunvistazo!
http://alarcos.infcr.uclm.es/doc/bbddavanzadas/prorel.pdf

59

DAW

Mantenimientodelapersistenciadelosobjetos

6.Mecanismosdeconsultayaccesoalabasededatos.
Caso prctico
Juan est muy emocionado, ya ha empezado a disear su base de datos, modelando los objetos de
la aplicacin, pero, sigue preocupado por un asunto: Una vez diseado el esquema de la base de
datos, cmo se meten datos en la base de datos? Y cmo se recuperan? Ser muy difcil?. No
quiere molestar a Juan, porque sabe lo atareado que est, por lo que decide investigar por su cuenta
los mecanismos para conectarse a la base de datos desde Java.

Bueno,yasabescmocrearunaestructuraquetepermitealmacenarlosdatosdetuaplicacinen
un almacenamiento persistente, pero, cmo hacemos los datos persistentes? Hasta ahora solo
tenemosunesqueletoenelquenohemosguardadonada.Ahoraveremosunenfoquemsprctico
delasbasesdedatos,dondenuestraaplicacinentraencontactoconlabasededatos,literalmente.
Para poder almacenar y manipular objetos de la base de datos (insertar, modificar, eliminar y
consultar objetos), los SGBD proporcionan un lenguaje de consulta de objetos (OQL, que en ingls
significa Object Query Language) y un lenguaje de manipulacin de datos (OML, que en ingls
significaObjectManagementLanguage).Atravsdeestoslenguajesrealizaremostodasocasitodas
lasoperacionesconlosobjetos:atravsdelOQLpodremosrecuperarlosobjetosalmacenados,ya
travsdelOMLinsertar,modificaryeliminarobjetos.
Uno de los primeros intentos de definir un OQL estndar vino de la organizacin ODMG. El OQL
propuesto por la desaparecida organizacin ODMG, se intentaba parecer al lenguaje SQL. OQL era
portantosimilar,peronoigual,allenguajeSQL,usadointensamenteenelmodelorelacional.Pero
SQLevoluciono,enprincipiosolousadoparabasesdedatosrelacionales,mejorparapodertener
capacidadespropiasdesistemasorientadosaobjetos.Esaevolucinseconcretoen1999conSQL3.
Dado que SQL3 estaba respaldado por grandes empresas y por organismos de estandarizacin de
gran calado (como ISO y ANSI), su expansin fue rpida y contundente, desplazando al OQL de
ODMG. A todo esto haba que sumar que realmente ODMG no propona un OML propio, sino que
propona que el OML fuera una extensin del lenguaje de programacin usado (C++, Java, etc.),
mientrasqueSQL3sitenaunOMLclaroydefinido.
Todo esto ha repercutido en que muchos de los SGBDOO y SGBDOR actuales usan SQL de alguna
forma. Quizs no se usa SQL3 o posterior de forma precisa, pero si usan una sintaxis bastante
parecida.Yasocurreennuestrocaso,CachyOracleusanSQLcomoOMLyOQL,aunqueelSQLde
OracleesmsfielaSQL3.
Ahora que ya sabemos con que lenguaje manipular los datos almacenados en la base de datos,
necesitamossabercomoaccederalabasededatosparapodermanipularlosobjetos.Paraponerse
encontactoconlabasededatosyparamanipulardatosexistenmuchosmecanismos.Vayamospor
partes,qumecanismosnospermiteCach?Veamoslosprincipales:
9

CachJavaBinding.Estaformademanipularobjetosenlabasededatosesposiblementelams
cmoda.Conestemecanismo,atravsdeCach,creamosunaclaseJavaqueestarvinculada
directamentecon una clasehomologa enCach. Ennuestraaplicacin utilizaremosdicha clase
Javaparaalmacenardatosenlabasededatos,sintenerqueemplearSQL.

CachJalapeo.EstaformadealmacenarobjetospermitealmacenardirectamenteobjetosJava,
sin tener que definirlos en Cach. Este sistema requiere de un motor de persistencia especial,
capazdetransformarlasclasesJava,enobjetosalmacenables enlabasededatosCach.Para
poderusarlohayquecrearlasclasesJavadeunaformaespecial(conanotaciones).

ConexinatravsdeJDBC.Estaformadetrabajocreaunaconexindirectaalabasededatos,a
travs de la cual se pueden ejecutar sentencias SQL que nos permitirn insertar, borrar,
actualizaryconsultarlosobjetosalmacenadosennuestrabasededatos.JDBCespropiodeJava,

60

DesarrollodeAplicacionesWeb

Tema10

esdecir,vaincluidoenlospaquetesJREyJDKdeJava,perorequieredeundriverespecficopara
cadabasededatos.
YOracle,cmopodemoscomunicarnosconOracledesdeJava?Puestenemosvariosmecanismos,
veamos:
9

ConexinatravsdeJDBC.Porsupuesto,OracletambinpermiteJDBC,yporsupuestodispone
deundriverparaJDBC.

SQLJ.EsunmecanismoquepermiteincrustardirectamentesentenciasSQLenellenguajeJava,
sinloscomplejosmecanismosdeJDBC.Estoreduceenormementeeltiempodedesarrollo.

JPublisher.EsunmecanismoequivalenteaCachJavaBindingperoparaOracle.

Detodosestosmecanismos,vamosaexplorarCachJavaBinding,ylaejecucindesentenciasSQLa
travsdeJDBC.

61

DAW

Mantenimientodelapersistenciadelosobjetos

7.Almacenandoobjetosenlabasededatos.
Caso prctico
Juan est intranquilo, est muy liado pero sabe que Antonio necesita ayuda. No sabe qu hacer, le
ayuda o no? Juan mira su propio escritorio, ve todo lo que tiene pendiente y se pone a sudar, pero
decide ir a ver cmo lo lleva:
Qu tal? Cmo lo llevas? dice Juan.
Pues estoy muy asustado dice Antonio. Juan, si te soy sincero, no paro de mirar pginas y
pginas, y me resulta imposible. Es muy difcil.
No es tan difcil, lo que pasa es que es la primera vez que lo ves y siempre las primeras veces
cuesta mucho. Voy a decirle a Mara que te eche una mano, creo que ella est un poco ms libre que
yo.

Antes de continuar, recuerdas los ejemplos que


hemos ido poniendo con anterioridad en los que se
creaban diferentes tipos de clases y tipos de datos
objeto?Alolargodeloquequedadeunidad,vamos
aponerejemplossobrecomoconectarseaCachya
Oracle, desde Java, y de cmo gestionar los datos
almacenados. Para facilitar su comprensin, te
facilitamos a continuacin el esquema de la base de
datosqueseusarcomopuntodepartidadedichos
ejemplos, tanto para Cach como para Oracle. El
esquema de ejemplo es una continuacin de los
ejemplospuestosantes.
Antesdecontinuar,siyahascreadoenCachclasesllamadas"Conductor"o"Direccion"(comoen
los ejemplos anteriores), es conveniente borrarlas. Para borraruna clase simplemente despliega el
men contextual de la clase a borrar, desde el navegador de proyecto de la herramienta Cach
Studio, y selecciona la opcin "Borrar clase". Fijate que en el navegador de proyecto hay tres
pestaas, hay una para navegar por los archivos de tu proyecto (los que tienes incorporados a tu
proyectoactual),yotraparanavegarporlasclasesdelnamespace.Lasclasespuedennoestarentu
proyecto(porquenolasestsusando),perosienelnamespace(almacenadasenlabasededatos).
ElesquemaquetefacilitamosparaCach,vaenformatoXML.Paraincorporarloatuproyectotienes
queseguirlossiguientespasos:
1. En la herramienta Cach Studio ve al
menHerramientas.
2. SeleccionalaopcinImportarLocal....
EstotepermitirbuscarelarchivoXML
entrelosarchivosdetuordenador.
3. Busca el archivo XML que contiene el
esquemadeCach.
4. Abre el archivo XML, te saldr una
nueva ventana emergente donde
seleccionarlasclasesaimportar.
5. Selecciona las clases a importar (todas
enrealidad).

62

DesarrollodeAplicacionesWeb

Tema10

6. Dalealaopcindeimportar.Comoresultadolasclasesseincorporarnatuproyectoyse
compilarn,quedandolistasparaserusadas.
ParausarelesquemadeejemplodeOracle,puedeshacerlodesdeSQL*Plus.Seincluyendosscripts
SQL,unoparaborrarelesquemayotroparacrearlo.Paraejecutarlosscriptspuedesconectarte,por
ejemplo, con el usuario HR desde SQL*Plus ("CONNECT HR") y despus puedes usar el comando
STARTparaejecutarlosscripts.AlcomandoSTART tienesqueindicarlelarutacompletaalscripta
ejecutar,porejemplo:"START'E:\CrearEsquemaBaseDeDatos.sql'".
EnOracleesconvenienteborrarprimerolosposiblestiposexistentesparapodervolveracrearlos,y
lo mismo pasa con las tablas. Si intentas crear una tabla o un tipo que ya existe, en general no te
dejarcrearlo(existenmecanismosparareemplazarocambiarladefinicindeuntipoounatabla,
peroaqunosehanvisto).

Enelsiguientearchivocomprimidoseincluyenlosarchivosnecesariospararecrearentuordenador
los esquemas necesarios para seguir los ejemplos. Son esquemas sencillos que seguro no
representanningunadificultadparati.
CrearTiposYTablasDeEjemplo_Oracle.sql
create or replace TYPE tipo_persona AS OBJECT
(
ddi VARCHAR2(10),
nombre VARCHAR2(20),
apellidos VARCHAR2 (40),
MEMBER FUNCTION getNombreYApellidos RETURN VARCHAR2
) NOT FINAL;
/
CREATE TYPE BODY tipo_persona AS
MEMBER FUNCTION getNombreYApellidos RETURN VARCHAR2 IS
BEGIN
RETURN apellidos || ', ' || nombre;
END;
END;
/
create or replace TYPE tipo_direccion AS OBJECT
(
tipovia VARCHAR2(10),
nombrevia VARCHAR2(20),
numero INTEGER,
dirinterior VARCHAR2(30),
codigopostal CHAR(5),
localidad VARCHAR(20),
provincia VARCHAR(20),
region VARCHAR(20),
pais VARCHAR(15)
);
/
create or replace TYPE tipo_telefono AS object (
tipo varchar2(10),
numero varchar2(30)
);
/
create or replace TYPE tabla_telefonos AS TABLE OF tipo_telefono;
/
CREATE OR REPLACE TYPE array_mails AS VARRAY(5) OF VARCHAR(40);
/
CREATE OR REPLACE TYPE tipo_conductor UNDER tipo_persona
(

63

DAW

Mantenimientodelapersistenciadelosobjetos

fecha_nacimiento DATE,
mails array_mails,
telefonos tabla_telefonos,
puntos_carnet INTEGER,
direccion tipo_direccion,
MEMBER FUNCTION edad RETURN INTEGER
);
/
CREATE TYPE BODY tipo_conductor AS
MEMBER FUNCTION edad RETURN INTEGER IS
v_edad INTEGER := 0;
BEGIN
v_edad := FLOOR(MONTHS_BETWEEN(CURRENT_DATE(),fecha_nacimiento)/12);
RETURN v_edad;
END;
END;
/
CREATE TABLE conductores OF tipo_conductor
(CONSTRAINT ddi_c PRIMARY KEY (ddi),
CHECK (nombre IS NOT NULL AND
apellidos IS NOT NULL AND
fecha_nacimiento IS NOT NULL AND
( puntos_carnet IS NULL
OR
(puntos_carnet IS NOT NULL AND puntos_carnet>=0 AND puntos_carnet<16)
)
)
) NESTED TABLE telefonos STORE AS telefonos_ntt ;

BorrarTiposYTablasDeEjemplo_Oracle.sql
DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP
DROP

TABLE conductores;
TYPE BODY tipo_conductor;
TYPE tipo_conductor;
TYPE tipo_direccion;
TYPE array_mails;
TYPE tabla_telefonos;
TYPE tipo_telefono;
TYPE BODY tipo_persona;
TYPE tipo_persona;

ClasesDeEjemplo_Cache.xml
<?xml version="1.0" encoding="UTF-8"?>
<Export generator="Cache" version="24" zv="Cache for Windows (x86-32) 2010.1.3 (Build 703)"
ts="2012-02-25 17:58:16">
<Class name="User.Conductor">
<Super>%Persistent</Super>
<TimeChanged>62512,59812.25366</TimeChanged>
<TimeCreated>62505,48407.569596</TimeCreated>
<UDLText name="T">
<Content><![CDATA[
// DDI es un documento de identificacin (DNI, NIE u otro tipo)
]]></Content>
</UDLText>
<Property name="DDI">
<Type>%String</Type>
<Required>1</Required>
</Property>
<Index name="DDIidx">
<PrimaryKey>1</PrimaryKey>
<Properties>DDI</Properties>
<Unique>1</Unique>
</Index>
<UDLText name="T">
<Content><![CDATA[
// Nombre del conductor, tipo cadena de texto.
]]></Content>

64

DesarrollodeAplicacionesWeb

Tema10

</UDLText>
<Property name="Nombre">
<Type>%String</Type>
<Required>1</Required>
</Property>
<UDLText name="T">
<Content><![CDATA[
// Apellidos del conductor, tipo cadena de texto.
]]></Content>
</UDLText>
<Property name="Apellidos">
<Type>%String</Type>
<Required>1</Required>
</Property>
<UDLText name="T">
<Content><![CDATA[
// Fecha de nacimiento del conductor, tipo fecha, formato DD/MM/AAAA.
]]></Content>
</UDLText>
<Property name="FechaNacimiento">
<Type>%Date</Type>
<Required>1</Required>
<Parameter name="FORMAT" value="4"/>
</Property>
<UDLText name="T">
<Content><![CDATA[
// Lista de mails.
]]></Content>
</UDLText>
<Property name="Mails">
<Type>%String</Type>
<Collection>list</Collection>
</Property>
<UDLText name="T">
<Content><![CDATA[
// Array con los telfonos.
]]></Content>
</UDLText>
<Property name="Telefonos">
<Type>%String</Type>
<Collection>array</Collection>
</Property>
<UDLText name="T">
<Content><![CDATA[
// Calcula la edad y retorna un nmero entero.
]]></Content>
</UDLText>
<Property name="PuntosCarnet">
<Type>%Integer</Type>
<Parameter name="MAXVAL" value="15"/>
<Parameter name="MINVAL" value="0"/>
</Property>
<UDLText name="T">
<Content><![CDATA[
// Direccin del conductor.
]]></Content>
</UDLText>
<Property name="direccion">

65

DAW

Mantenimientodelapersistenciadelosobjetos

<Type>Direccion</Type>
</Property>
<Method name="getNombreApellidos">
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
Quit ..Apellidos_", "_..Nombre
]]></Implementation>
</Method>
<Method name="edad">
<ReturnType>%Integer</ReturnType>
<Implementation><![CDATA[
Set e = ($PIECE($NOW(),",",1)-$PIECE(..FechaNacimiento,",",1))/365
Quit e
]]></Implementation>
</Method>
<Projection name="ProyeccionJava">
<Type>%Projection.Java</Type>
</Projection>
<Storage name="Default">
<Type>%Library.CacheStorage</Type>
<DataLocation>^User.ConductorD</DataLocation>
<DefaultData>ConductorDefaultData</DefaultData>
<IdLocation>^User.ConductorD</IdLocation>
<IndexLocation>^User.ConductorI</IndexLocation>
<StreamLocation>^User.ConductorS</StreamLocation>
<Data name="ConductorDefaultData">
<Structure>listnode</Structure>
<Subscript/>
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>Nombre</Value>
</Value>
<Value name="3">
<Value>Apellidos</Value>
</Value>
<Value name="4">
<Value>FechaNacimiento</Value>
</Value>
<Value name="5">
<Value>Mails</Value>
</Value>
<Value name="6">
<Value>PuntosCarnet</Value>
</Value>
<Value name="7">
<Value>direccion</Value>
</Value>
<Value name="8">
<Value>DDI</Value>
</Value>
<Value name="9">
<Value>t</Value>
</Value>
<Value name="10">
<Value>HorasSemanales</Value>
</Value>
</Data>
<Data name="Telefonos">
<Attribute>Telefonos</Attribute>
<Structure>subnode</Structure>
<Subscript>"Telefonos"</Subscript>
</Data>
</Storage>
</Class>

<Class name="User.Conductores">
<Super>Persona,%Persistent</Super>
<TimeChanged>62512,59846.239782</TimeChanged>
<TimeCreated>62505,48407.569596</TimeCreated>
<UDLText name="T">
<Content><![CDATA[

66

DesarrollodeAplicacionesWeb

Tema10

// Fecha de nacimiento del conductor, tipo fecha, formato DD/MM/AAAA.


]]></Content>
</UDLText>
<Property name="FechaNacimiento">
<Type>%Date</Type>
<Required>1</Required>
<Parameter name="FORMAT" value="4"/>
</Property>
<UDLText name="T">
<Content><![CDATA[
// Lista de mails.
]]></Content>
</UDLText>
<Property name="Mails">
<Type>%String</Type>
<Collection>list</Collection>
</Property>
<UDLText name="T">
<Content><![CDATA[
// Array con los telfonos.
]]></Content>
</UDLText>
<Property name="Telefonos">
<Type>%String</Type>
<Collection>array</Collection>
</Property>
<UDLText name="T">
<Content><![CDATA[
// Calcula la edad y retorna un nmero entero.
]]></Content>
</UDLText>
<Property name="PuntosCarnet">
<Type>%Integer</Type>
<Parameter name="MAXVAL" value="15"/>
<Parameter name="MINVAL" value="0"/>
</Property>
<UDLText name="T">
<Content><![CDATA[
// Direccin del conductor.
]]></Content>
</UDLText>
<Property name="direccion">
<Type>Direccion</Type>
</Property>
<Method name="edad">
<ReturnType>%Integer</ReturnType>
<Implementation><![CDATA[
Set e = ($PIECE($NOW(),",",1)-$PIECE(..FechaNacimiento,",",1))/365
Quit e
]]></Implementation>
</Method>
<Projection name="ProyeccionJava">
<Type>%Projection.Java</Type>
</Projection>
<Storage name="Default">
<Type>%Library.CacheStorage</Type>
<DefaultData>ConductoresDefaultData</DefaultData>
<Data name="ConductoresDefaultData">
<Structure>listnode</Structure>
<Subscript>"Conductores"</Subscript>

67

DAW

Mantenimientodelapersistenciadelosobjetos

<Value name="1">
<Value>FechaNacimiento</Value>
</Value>
<Value name="2">
<Value>Mails</Value>
</Value>
<Value name="3">
<Value>PuntosCarnet</Value>
</Value>
<Value name="4">
<Value>direccion</Value>
</Value>
</Data>
<Data name="Telefonos">
<Attribute>Telefonos</Attribute>
<Structure>subnode</Structure>
<Subscript>"User.Conductores.Telefonos"</Subscript>
</Data>
</Storage>
</Class>

<Class name="User.Direccion">
<ClassType>serial</ClassType>
<Super>%SerialObject</Super>
<TimeChanged>62512,60012.463652</TimeChanged>
<TimeCreated>62505,42066.484095</TimeCreated>
<UDLText name="T">
<Content><![CDATA[
// Tipo de la va (calle, paseo, paraje, etc.)
]]></Content>
</UDLText>
<Property name="tipovia">
<Type>%String</Type>
</Property>
<UDLText name="T">
<Content><![CDATA[
// Nombre de la va
]]></Content>
</UDLText>
<Property name="nombrevia">
<Type>%String</Type>
</Property>
<UDLText name="T">
<Content><![CDATA[
// Nmero.
]]></Content>
</UDLText>
<Property name="numero">
<Type>%Integer</Type>
</Property>
<UDLText name="T">
<Content><![CDATA[
// Bloque, planta, puerta y otro tipo de informacin.
]]></Content>
</UDLText>
<Property name="dirinterior">
<Type>%String</Type>
</Property>
<Property name="codigopostal">
<Type>%String</Type>
</Property>
<Property name="localidad">
<Type>%String</Type>

68

DesarrollodeAplicacionesWeb

Tema10

</Property>
<Property name="provincia">
<Type>%String</Type>
</Property>
<Property name="region">
<Type>%String</Type>
</Property>
<Property name="pais">
<Type>%String</Type>
</Property>
<Storage name="Default">
<Type>%Library.CacheSerialState</Type>
<State>DireccionState</State>
<StreamLocation>^User.DireccionS</StreamLocation>
<Data name="DireccionState">
<Structure>listnode</Structure>
<Subscript/>
<Value name="1">
<Value>tipovia</Value>
</Value>
<Value name="2">
<Value>nombrevia</Value>
</Value>
<Value name="3">
<Value>numero</Value>
</Value>
<Value name="4">
<Value>dirinterior</Value>
</Value>
<Value name="5">
<Value>codigopostal</Value>
</Value>
<Value name="6">
<Value>localidad</Value>
</Value>
<Value name="7">
<Value>provincia</Value>
</Value>
<Value name="8">
<Value>region</Value>
</Value>
<Value name="9">
<Value>pais</Value>
</Value>
</Data>
</Storage>
</Class>

<Class name="User.Persona">
<Super>%Persistent</Super>
<TimeChanged>62512,60012.692998</TimeChanged>
<TimeCreated>62512,47662.970444</TimeCreated>
<UDLText name="T">
<Content><![CDATA[
// DDI es un documento de identificacin (DNI, NIE u otro tipo)
]]></Content>
</UDLText>
<Property name="DDI">
<Type>%String</Type>
<Required>1</Required>
</Property>
<Index name="DDIidx2">
<PrimaryKey>1</PrimaryKey>
<Properties>DDI</Properties>
<Unique>1</Unique>
</Index>
<UDLText name="T">

69

DAW

Mantenimientodelapersistenciadelosobjetos

<Content><![CDATA[
// Nombre del conductor, tipo cadena de texto.
]]></Content>
</UDLText>
<Property name="Nombre">
<Type>%String</Type>
<Required>1</Required>
</Property>
<UDLText name="T">
<Content><![CDATA[
// Apellidos del conductor, tipo cadena de texto.
]]></Content>
</UDLText>
<Property name="Apellidos">
<Type>%String</Type>
<Required>1</Required>
</Property>
<Method name="getNombreApellidos">
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
Quit ..Apellidos_", "_..Nombre
]]></Implementation>
</Method>
<Storage name="Default">
<Type>%Library.CacheStorage</Type>
<DataLocation>^User.PersonaD</DataLocation>
<DefaultData>PersonaDefaultData</DefaultData>
<IdLocation>^User.PersonaD</IdLocation>
<IndexLocation>^User.PersonaI</IndexLocation>
<StreamLocation>^User.PersonaS</StreamLocation>
<Data name="PersonaDefaultData">
<Structure>listnode</Structure>
<Subscript/>
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>DDI</Value>
</Value>
<Value name="3">
<Value>Nombre</Value>
</Value>
<Value name="4">
<Value>Apellidos</Value>
</Value>
</Data>
</Storage>
</Class>

<Class name="User.Socio">
<Super>%Persistent</Super>
<TimeChanged>62512,53611.238828</TimeChanged>
<TimeCreated>62498,35489.617941</TimeCreated>
<UDLText name="T">
<Content><![CDATA[
// Nombre del socio
]]></Content>
</UDLText>
<Property name="nombre">
<Type>%String</Type>
<Required>1</Required>
</Property>
<UDLText name="T">
<Content><![CDATA[
// Apellidos del socio

70

DesarrollodeAplicacionesWeb

Tema10

]]></Content>
</UDLText>
<Property name="apellidos">
<Type>%String</Type>
<Required>1</Required>
</Property>
<UDLText name="T">
<Content><![CDATA[
// Nmero de socio.
]]></Content>
</UDLText>
<Property name="numsocio">
<Type>%String</Type>
<Required>1</Required>
</Property>
<UDLText name="T">
<Content><![CDATA[
// Lista con los mails.
]]></Content>
</UDLText>
<Property name="Mails">
<Type>%String</Type>
<Collection>list</Collection>
</Property>
<UDLText name="T">
<Content><![CDATA[
// Lista con los telefonos.
]]></Content>
</UDLText>
<Property name="Telefonos">
<Type>%String</Type>
<Collection>array</Collection>
</Property>
<UDLText name="T">
<Content><![CDATA[
/* Ejemplo A.1 de uso de colecciones tipo listas de Cach.
Inserta un nuevo mail en la list de mails. */
]]></Content>
</UDLText>
<Method name="insertarMail">
<FormalSpec>mail:%String</FormalSpec>
<Implementation><![CDATA[
/* El mtodo Insert de las listas permite insertar un nuevo elemento del tipo
especificado en la lista, se insertar al final, dado que las listas no son
ordenadas. */
do ..Mails.Insert(mail)
]]></Implementation>
</Method>
<UDLText name="T">
<Content><![CDATA[
/* Ejemplo A.2 de uso de colecciones tipo listas de Cach.
Hacer un recuento de los mails almacenados en la lista. */
]]></Content>
</UDLText>
<Method name="contarMails">
<ReturnType>%Integer</ReturnType>
<Implementation><![CDATA[
/* El mtodo Count de las listas permiten obtener el nmero de elementos
que contienen */
Quit ..Mails.Count()
]]></Implementation>
</Method>

71

DAW

Mantenimientodelapersistenciadelosobjetos

<UDLText name="T">
<Content><![CDATA[
/* Ejemplo A.3 de uso de colecciones tipo listas de Cach.
Obtener el mail almacenado en una posicin concreta de la lista.
Si dicho mail no existe se retornar cadena vacia (""), tambin conocido en Cach como
null string. Tienes que tener en cuenta que las posiciones se empiezan a numerar por 1
y no por 0.*/
]]></Content>
</UDLText>
<Method name="obtenerMail">
<FormalSpec>pos:%Integer</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
/* Primero se comprueba si la posicin indicada, donde est el elemento a
obtener, existe o no en la lista. Para ello, hacemos uso del mtodo contarMails
antes implementado. */
if pos<=..contarMails() && pos>=1
{
/* El mtodo GetAt permite obtener un mail almacenado en una posicin concreta.
Su nico argumento es la posicin a obtener. Tienes que tener en cuenta
que las posiciones se empiezan a numerar por 1, y no por 0. */
Quit ..Mails.GetAt(pos)
}
Else /* Si el mail no existe, se retorna cadena vaca (""), tambin llamado null string.
*/
{
Quit ""
}
]]></Implementation>
</Method>
<UDLText name="T">
<Content><![CDATA[
/* Ejemplo A.4 de uso de colecciones tipo listas de Cach.
Eliminar un mail. Retornar 1 (verdadero) se ha eliminado, y 0 (false) en otro caso.
Se le pasa como parmetro la posicin del elemento a eliminar, que se empieza a numerar
por 1 y no por 0.
*/
]]></Content>
</UDLText>
<Method name="eliminarMail">
<FormalSpec>pos:%Integer</FormalSpec>
<ReturnType>%Boolean</ReturnType>
<Implementation><![CDATA[
Set eliminado=0
/* Volvemos a hacer uso de la funcin contarMails para saber si la posicin
indicada est o no dentro de los lmites de almacenamiento de la lista. */
if pos<=..contarMails() && pos>=1
{
/* El mtodo RemoveAt de las listas permite eliminar un elemento
de una posicin concreta. Se le pasa como argumento la posicin a eliminar, que
deber empezar a contarse en 1 y no en 0. Si consigue eliminarse, entonces
retornar el elemento eliminado, en caso contrario retornar cadena vaca (""),
tambin llamado null string. */
Set result=..Mails.RemoveAt(pos)
if result="" { Set eliminado = 0 }
else { Set eliminado = 1 write !,"Eliminado:",result }
}
Quit eliminado
]]></Implementation>
</Method>
<UDLText name="T">
<Content><![CDATA[
/* Ejemplo A.5 de uso de colecciones tipo listas de Cach.
Obtener los mails separados por comas. Usando mtodos antes creados se obtiene
una lista separada por comas de los mails.
*/
]]></Content>
</UDLText>
<Method name="obtenerMails">
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
Set t=""

72

DesarrollodeAplicacionesWeb

Tema10

for i=1:1:..contarMails() {
if i'=1 { Set t=t_"," }
Set t=t_..obtenerMail(i)
}
Quit t
]]></Implementation>
</Method>
<UDLText name="T">
<Content><![CDATA[
/* Ejemplo A.6 de uso de colecciones tipo listas de Cach.
Vaciar la lista de mails. */
]]></Content>
</UDLText>
<Method name="vaciarMails">
<Implementation><![CDATA[
/* El mtodo clear permite vaciar una lista, dejandola sin elementos. */
do ..Mails.Clear()
]]></Implementation>
</Method>
<UDLText name="T">
<Content><![CDATA[
/* Ejemplo B.1 de uso de colecciones tipo arrays de Cach.
Insercin de un telefono y su tipo en el array.
Se trata de poder almacenar el telefono, junto al tipo, por ejemplo: "fax" junto al
nmero de fax o "movil" junto al telfono mvil, para as poder diferenciar el tipo
de telfono.*/
]]></Content>
</UDLText>
<Method name="insertarTlf">
<FormalSpec>numero:%String,tipotlf:%String</FormalSpec>
<Implementation><![CDATA[
/* Con el mtodo SetAt se inserta un telefono asociado a una llave, que identicar
al telefono por el propsito del mismo.*/
Do ..Telefonos.SetAt(numero,tipotlf)
Quit
]]></Implementation>
</Method>
<UDLText name="T">
<Content><![CDATA[
/* Ejemplo B.2 de uso de colecciones tipo array de Cach.
Recuperacin del telefono de un tipo determinado almacenado en el array. */
]]></Content>
</UDLText>
<Method name="obtenerTlf">
<FormalSpec>tipo:%String</FormalSpec>
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
/* Se obtiene un elemento etiquetado como "tipo" a travs del mtodo GetAt,
retornando el elemento en cuestin o "" (null string) en caso de que no
se encuentre. */
Quit ..Telefonos.GetAt(tipo)
]]></Implementation>
</Method>
<UDLText name="T">
<Content><![CDATA[
/* Ejemplo B.3 de uso de colecciones tipo array de Cach.
Elimina un telefono (por tipo) introducido previamente en el array. */
]]></Content>
</UDLText>
<Method name="eliminarTlf">
<FormalSpec>tipo:%String</FormalSpec>
<ReturnType>%Boolean</ReturnType>
<Implementation><![CDATA[
Set eliminado=0
/* A travs del mtodo isDefined se puede averiguar si en el array hay o no un
elemento almacenado con una clave asociada croncreta. Si es as, retornar 1 (true)
en caso contrario retornara 0 (false). */
if ..Telefonos.IsDefined(tipo) {
/* El mtodo RemoveAt elimina un elmento que tenga una clave concreta,

73

DAW

Mantenimientodelapersistenciadelosobjetos

si se ha eliminado retornar el elemento eliminado, en caso contrario,


por ejemplo, si no existiera el elemento, retornara cadena vaca (""),
tambin conocida como null string. */
Set result=..Telefonos.RemoveAt(tipo)
If result="" { Set eliminado = 0 } Else { set eliminado=1 }
}
Quit eliminado
]]></Implementation>
</Method>
<UDLText name="T">
<Content><![CDATA[
/* Ejemplo B.4 de uso de colecciones tipo array de Cach.
Obtiene la lista de telefonos separadas por comas. Si no hay telefonos, retornar una
cadena vaca (""), tambin conocido como null string.
*/
]]></Content>
</UDLText>
<Method name="obtenerTlfs">
<ReturnType>%String</ReturnType>
<Implementation><![CDATA[
Set result=""
/* El mtodo Next, de los arrays permite obtener la primera llave o clave del
primer par llave/valor almacenado, pero solo cuando se le pasa cadena vaca como
parmetro. Si no existiese, retonara cadena vaca. */
Set tipotlf=..Telefonos.Next("")
while tipotlf'="" {
if result'="" { Set result=result_"," }
/* Con el mtodo GetAt obtenemos el valor asociado a una llave o clave. */
Set result=result_tipotlf_":"_..obtenerTlf(tipotlf)
/* El mtodo Next, permite obtener la siguiente llave o clave de la lista
cuando se le pasa una clave, de esa forma, permite iterar sobre el array,
como se hace con los iteradores de java. */
Set tipotlf=..Telefonos.Next(tipotlf)
}
Quit result
]]></Implementation>
</Method>
<UDLText name="T">
<Content><![CDATA[
/* Ejemplo B.5 de uso de colecciones tipo array de Cach.
Vacia la lista de telfonos usando el mtodo Clear, de forma similar a como se hace
con las listas.*/
]]></Content>
</UDLText>
<Method name="vaciarTlfs">
<Implementation><![CDATA[
]]></Implementation>
</Method>

do ..Telefonos.Clear()

<Storage name="Default">
<Type>%Library.CacheStorage</Type>
<DataLocation>^User.SocioD</DataLocation>
<DefaultData>SocioDefaultData</DefaultData>
<IdLocation>^User.SocioD</IdLocation>
<IndexLocation>^User.SocioI</IndexLocation>
<StreamLocation>^User.SocioS</StreamLocation>
<Data name="SocioDefaultData">
<Structure>listnode</Structure>
<Subscript>"Socio"</Subscript>
<Value name="1">
<Value>NumSocio</Value>
</Value>
<Value name="2">
<Value>Mails</Value>
</Value>
<Value name="3">
<Value>numsocio</Value>
</Value>
<Value name="4">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="5">
<Value>nombre</Value>
</Value>

74

DesarrollodeAplicacionesWeb

Tema10

<Value name="6">
<Value>apellidos</Value>
</Value>
</Data>
<Data name="Telefonos">
<Attribute>Telefonos</Attribute>
<Structure>subnode</Structure>
<Subscript>"User.Socio.Telefonos"</Subscript>
</Data>
</Storage>
</Class>
</Export>

7.1.Preparandonuestroproyectoparaalmacenarobjetos.

Y por dnde se empieza? Cmo conecto con la base de datos?


Damosporsentadoqueyatienesunesquemadeobjetoscreadoen
labasededatos,capazdedarsoportealosdatosdetuaplicacin.
Losiguientearealizaresconectartuaplicacinconlabasededatos.
Para poder realizar la conexin, es necesario incluir en tu proyecto
laslibrerasquetepermitirnconectartealabasededatos.Veamos
cmoincorporarunalibreranuevaennuestroproyectoNetBeans:
1. AbreunproyectodeaplicacinJavaexistenteocreaunonuevoenNetBeans.Despus,enel
navegador de proyecto despliega la seccin Libreras (en ingls, Libraries), del rbol de
proyecto.
2. ConelbotnderechodelratnhazclicencimadelaseccinlibrerasenAadirJar/Carpeta
(en ingls, Add Jar/Folder). Sacar un cuadro de dilogo que te permitir seleccionar la
librera.
3. LocalizaselarchivoJARcorrespondientealalibreraaincorporaryledasaaceptar.Yatienes
lalibreraincorporadaatuproyecto.
Estos pasos son necesarios si quieres usar la base de datos Cach desde tu aplicacin Java, y
obviamentetambinparausarlabasededatosOracle.Veamoslaslibrerasquehayqueimportaren
cadacaso:
9

ParapoderaccederalabasededatosCachdesdetuaplicacinhayqueincorporarlalibrerade
clienteCachentuproyecto,llamadaCacheDB.jar.Estalibrerapodrsencontrarlaenlacarpeta
de instalacin de Cach (en el apartado 2 se aviso de que haba que apuntar la carpeta de
instalacin,recuerdas?),enelsubdirectoriolib.Estalibreracontendrtodolonecesariopara
conectarsecontuaplicacin,incluidoeldriverJDBC.

ParapoderaccederaOracle(versinXE11g)desdetuaplicacindebesincorporareldriverJDBC
de Oracle. El driver JDBC est disponible a travs de la pgina web de Oracle y hay diferentes
versiones. Dentro de toda la maraa de versiones, caben destacar las versiones llamadas:
ojdbc5.jar, driver JDBC de Oracle a utilizar cuando se usa Java 5, y odbc6.jar, driver JDBC de
OracleausarcuandoseusaJava6osuperior.

EnelsiguienteenlacepuedesdescargarlosdriversJDBCdeOracle:
http://www.oracle.com/technetwork/database/enterpriseedition/jdbc112010
090769.html
Unavezincorporadaslaslibrerasnecesariasanuestroproyecto,paraconectarsealabasededatos
hay que preparar cierta informacin. Es necesario saber la direccin IP o nombre del ordenador

75

DAW

Mantenimientodelapersistenciadelosobjetos

dondeestarinstaladoelSGDB.Sihacemoslaaplicacinpensandoenaccederaunservidordebases
de datos que estar instalado en el mismo ordenador que la aplicacin, la direccin IP ser
127.0.0.1olocalhost.Esloqueusaremosparahacerpruebasenfasededesarrollo.
Para conectarnos a Cach, necesitaremos tambin saber cul es el espacio de nombres con el que
queremostrabajar(unoquehayamospreparadonosotrosobienelespacioUSERpreexistenteen
cach).YenelcasodeOracle,necesitaremoselnombredelainstanciadelabasededatosconla
quevamosatrabajar.LabasededatossellamarXEenelcasodeOracleXE11g,dadoqueesta
versinvarestringidaysolodejaunabasededatos.
Yporltimo,necesitamostambinelnombredeusuarioylacontrasea.RecuerdaqueCachtiene
pordefectoelusuario_SYSTEMconlacontraseaSYS,locualestilenelcasodequenohayas
podidocrearunusuarionuevo.RecuerdatambinqueOracleXEdisponedelusuarioHR,elcuales
necesariodesbloquear,talycomosedijoenapartadosanteriores(sinosedesbloquea,nosepodr
conectaralabasededatosusandodichousuario).

Completa con las palabras que faltan.


Para poder acceder desde Java a la base de datos usando
la librera del

es necesario incorporar

a nuestro proyecto. Tambin tenemos que conocer cierta

informacin para realizar la conexin, como por ejemplo el espacio de


caso de Cach, o el nombre de la instancia de la base de datos, en el caso de

, en el
.

7.2.Conectandoconlabasededatos.
Y ahora vamos a realizar una conexin a nuestra base de datos, que nos permitir manipular los
datosalmacenados.EstaconexinlaharemosatravsdeJDBC.JDBCseverconmayorprofundidad
enlasiguienteunidad,porloqueaquvamosaverlodeformabsica.Paracrearunaconexinque
nos permita conectarnos a la base de datos lo primero que debemos hacer indicar a Java, con la
sentenciaimport,lospaquetesimplicadosenelproceso:
9

java.sql.*:contienelasclasesnecesariasdeJavaparapoderconectarsevaJDBCaunabasede
datos.EsnecesariotantoparaCachcomoparaOracle.

com.intersys.jdbc.*ycom.intersys.objects.*:contienenlasclasesnecesariasparaestableceruna
conexinaCach,vaJDBC,yparapoderusarCachJavaBinding.

Oracle.jdbc.pool.*:contienelasclasesnecesariaspararealizarunaconexinaOracle,atravsde
JDBC. Tambin vamos a necesitar las clases del paquete Oracle.sql.*, para poder manejar los
tiposdedatoscoleccin.

Paraconectarportantoconlabasededatos,debesimportarlospaquetescorrespondientes,yluego
efectuar la conexin. Para crear la conexin se usan las clases CacheDataSource con Cach u
OracleDataSource con Oracle, dependiendo de lo que estemos utilizando. Tanto CacheDataSource
comoOracleDataSourcesonclasesderivadasdelaclaseDataSource.LaclaseDataSourceespartede
JDBCyagrupaunacoleccindemtodosquepermitirnconectarsealabasededatos.
Peroantesdeusarlasclasesanteriores,debemosprepararloquesedenominaURLdeconexin.La
URL de conexin es una cadena que contiene informacin para conectarse a la base de datos. En
nuestro caso la URL contendr la direccin IP o nombre de la mquina en la que est instalado el
SGBD. Contendr adems el puerto (cada aplicacin que se conecta a Internet utiliza un nmero, llamado puerto, para
diferenciarsuscomunicacionesdelasdelrestodeaplicacionesdelordenador)paraconectarse(generalmenteCachusa
elpuerto1972pordefectoyOracleelpuerto1521)yelespaciodenombres(encasodeCach)ola
instanciadelabasededatos(queencasodeOracleXEserXE).

76

DesarrollodeAplicacionesWeb

Tema10

Yunavezhallamosconectado,lainformacindeconexinseencapsularenunainstanciadelaclase
java.sql.Connection, la cual usaremos para manipular los datos. Veamos como sera el proceso de
conexin:
EjemplosdeconexinconlosSGBDCachyOracle
ConectandoconCachvaJDBC

ConectandoconOraclevaJDBC

CacheDataSource ds = new CacheDataSource();


String ipDelServidor=127.0.0.1;
Integer puertoDelServidor=1972;
String namespace=USER,
String usuario=_SYSTEM, password=SYS;
String url = "jdbc:Cache://" +
ipDelServidor + ":" + puertoDelServidor + "/" +
namespace;
ds.setURL(url);
ds.setUser(usuario); ds.setPassword(password);
Connection conn = ds.getConnection();

OracleDataSource ds = new
OracleDataSource();
String ipDelServidor=127.0.0.1;
Integer puertoDelServidor=1521;
String sid=XE;
String usuario=HR, password=HR;
String url = "jdbc:Oracle:thin:@//" +
ipDelServidor + ":" + puertoDelServidor +
"/" + sid;
ds.setURL(url);
ds.setUser(usuario);
ds.setPassword(password);
Connection conn = ds.getConnection();

Enlosejemplosanteriores,primerosecreaunainstanciadeCacheDataSourceuOracleDataSource
segncorresponda,enamboscasossealmacenaenunavariablellamadads.Despusseconstruye
una cadena de texto que contiene la URL (la cual tiene un formato especfico en cada caso),
aadiendo la informacin necesaria: IP o nombre de la mquina, puerto y espacio de nombres o
instanciadelabasededatos,segncorresponda.DespusseindicalaURL,elusuarioylacontrasea
con los mtodos setURL, setUser y setPassword respectivamente. Y por ltimo se establece la
conexinconelmtodogetConnection.Detodoelproceso,lonicoquerealmentecambiaentreun
SGBDyotroeselformatodelaURL.
Elprocesodeconexinpuedegenerarunaexcepcindetipojava.sql.SQLException,queesnecesario
capturaryprocesar.Estaexcepcinocurrircuandonosepuedaestablecerunaconexinconlabase
dedatos.
En el siguiente archivo comprimido se facilitan dos clases muy interesantes, de esas clases que te
hacenlavidamsfcil.Setrata dela claseConexionACacheyConexionAOracle,que te permitirn
cmodamentecrearunaconexinsincomplicartelavida.
ConexionAOracle.java
package util;
import oracle.jdbc.pool.*;
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Clase facilitadora para la realizacin de conexiones a oracle.
* @author Salvador Romero
*/
public class ConexionAOracle {
Connection conn=null;
/**
* Funcin que facilita la conexin a un servidor oracle.
* @param ipDelServidor Direccin IP del servidor o nombre de la mquina
* donde est el servidor (FQDN). Para desarrollo normalmente se pone
* "localhost", dado que el servidor est instalado en la misma mquina.
* @param puertoDelServidor Generalmente es el puerto 1521, salvo que se
* haya alterado la conexin por defecto.
* @param sid Nombre de la instancia. En el caso de Oracle XE el nombre
* de la instancia de la base de datos es "XE".
* @param usuario Usuario para conectarse, generalmente "HR".
* @param password Password para conectarse, cuyo dato depende de como

77

DAW

Mantenimientodelapersistenciadelosobjetos

* tengas configurada la base de datos.


* @return Retorna una instancia de la clase Connection, con la conexin
* o null en caso de no haber podido conectarse.
*/
public Connection construirConexion (String ipDelServidor,
int puertoDelServidor, String sid, String usuario,
String password)
{
try {
OracleDataSource ods = new OracleDataSource();
String url = "jdbc:oracle:thin:@//"+ipDelServidor+":"+puertoDelServidor+"/"+sid;
ods.setURL(url);
ods.setUser(usuario);
ods.setPassword(password);
conn = ods.getConnection();
} catch (SQLException ex) {
Logger.getLogger(ConexionAOracle.class.getName()).log(Level.SEVERE, null, ex);
conn=null;
}
return conn;
}
/**
* Crea una conexin a oracle cuando est instalado en el mismo ordenador
* donde se desarrolla y al puerto por defecto (1521).
* @param sid Nombre de la instancia. En el caso de Oracle XE el nombre
* de la instancia de la base de datos es "XE".
* @param usuario Usuario para conectarse, generalmente "HR".
* @param password Password para conectarse, cuyo dato depende de como
* tengas configurada la base de datos.
* @return El identificador de la conexin, instancia de la Connection o
* null si no se ha podido conectar.
*/
public Connection construirConexion (String sid,
String usuario, String password) {
return construirConexion("127.0.0.1", 1521, sid, usuario, password);
}
/**
* Obtiene la conexin realizada a Oracle o null si todava no se ha conectado.
* @return Una instancia de la clase Connection, con la conexin a la base
* de datos, o null en caso de no haberse conectado.
*/
public Connection getConn ()
{
return conn;
}

ConexionACache.java
package util;
import
import
import
import

com.intersys.jdbc.*;
com.intersys.objects.*;
java.sql.*;
java.util.logging.Level;

/**
* Clase facilitadora para la realizacin de conexiones a Cach.
* @author Salvador Romero Villegas
*/
public class ConexionACache {
Connection conn=null;
/**
* Funcin que facilita la conexin a un servidor Cach.
* @param ipDelServidor Direccin IP del servidor o nombre de la mquina
* donde est el servidor (FQDN). Para desarrollo normalmente se pone
* "localhost", dado que el servidor est instalado en la misma mquina.
* @param puertoDelServidor Generalmente es el puerto 1972, salvo que se
* haya alterado la instalacin por defecto.
* @param namespace Namespace a conectar por defecto. Si no has creado uno

78

DesarrollodeAplicacionesWeb

Tema10

* puedes usar el namespace USER, creado por defecto.


* @param usuario Usuario para conectarse. Si no has creado un usuario
* propio puedes usar el usuario "_SYSTEM" con password "SYS".
* @param password Password para conectarse, cuyo dato depende de como
* tengas configurada la base de datos.
* @return Retorna una instancia de la clase Connection, con la conexin
* o null en caso de no haber podido conectarse.
*/
public Connection construirConexion (String ipDelServidor,
int puertoDelServidor, String namespace, String usuario,
String password) {
try {
CacheDataSource ds = new CacheDataSource();
String url = "jdbc:Cache://" + ipDelServidor + ":" + puertoDelServidor + "/" +
namespace;
ds.setURL(url);
ds.setUser(usuario);
ds.setPassword(password);
conn = ds.getConnection();
} catch (SQLException ex) {
java.util.logging.Logger.getLogger(ConstructorConexionesACache.class.getName()).log(Level.SEVE
RE, null, ex);
conn = null;
}
return conn;
}
/**
* Crea una conexin a Cach cuando est instalado en el mismo ordenador
* donde se desarrolla y al puerto por defecto (1972).
* @param namespace Namespace a conectar por defecto. Si no has creado uno
* puedes usar el namespace USER, creado por defecto.
* @param usuario Usuario para conectarse. Si no has creado un usuario
* propio puedes usar el usuario "_SYSTEM" con password "SYS".
* @param password Password para conectarse, cuyo dato depende de como
* tengas configurada la base de datos.
* @return Retorna una instancia de la clase Connection, con la conexin
* o null en caso de no haber podido conectarse.
*/
public Connection construirConexion (String namespace,
String usuario, String password) {
return construirConexion("127.0.0.1", 1972, namespace, usuario, password);
}
/**
* Obtiene la conexin realizada a Cach o null si todava no se ha conectado.
* @return Una instancia de la clase Connection, con la conexin a la base
* de datos, o null en caso de no haberse conectado.
*/
public Connection getConn ()
{
return conn;
}
/**
* Obtiene una conexin, pero encapsulada en la clase Database de Cach,
* la cual permite usar Java Cach Binding. Solo funcionar si se ha
* conectado anteriormente con la base de datos con los mtodos construirConexion.
* @return Una instancia de la clase Database, con la conexin a la base
* de datos, o null en caso de no haberse conectado.
*/
public Database getDatabase ()
{
Database DBConn = null;
if (conn != null) {
try {
return CacheDatabase.getDatabase(conn);
} catch (CacheException ex) {
java.util.logging.Logger.getLogger(ConexionACache.class.getName()).log(Level.SEVERE,
ex);
DBConn = null;
}
}
return DBConn;

null,

79

DAW

Mantenimientodelapersistenciadelosobjetos

}
}

7.3.Proyecciones.
Bien,yanoshemosconectado,peroahora,cmoalmacenamos
nuestros datos en la base de datos? Un mtodo sencillo,
aplicable a Cach, es el de usar proyecciones y almacenar los
datosatravsdelCachJavaBinding.
En cach podemos crear una proyeccin para una clase
siguiendolasiguientesintaxis:
Projection ProyeccionJava As %Projection.Java;

Seponedentrodeladefinicindelaclase,podemosponerloalprincipiooalfinaldeladefinicin,y
loqueharsercrearunaproyeccinJavadelaclaseenelmomentodecompilacin.Normalmente
cada proyeccin lleva un nombre (ProyeccionJava, por ejemplo) y ser de un tipo concreto
(%Projection.Java), pudiendo llegar a crear proyecciones para mltiples lenguajes de una misma
claseCach.
La proyeccin se crea en el directorio
dondesealmacenalabasededatos,y
suubicacinexactalapodemosveren
lasalidaquegeneraCachalcompilar
la clase o las clases. Una proyeccin
sera simplemente un equivalente en
Java a la clase Cach, de forma que
podremos guardar datos en Cach
manipulando directamente una clase
Java.
Una vez creada cada proyeccin Java, su uso es muy simple, se copian los archivos Java a nuestro
proyectoNetBeans,yserealizaunapequeamodificacinparaindicarelpaqueteenelqueestn.
En el esquema de clases que te hemos proporcionado de ejemplo, las clases Cach estn en el
paqueteUserdenuestroespaciodenombres,yennuestrocdigoJavadebenestarenelmismo
paquete.Primero,vamosaldirectoriodondeCachhacreadolosarchivosJava,copiamoslasclasesy
las incorporamos a NetBeans. Despus, crea un paquete dentro de tu proyecto NetBeans cuyo
nombre coincida (incluso en minsculas y maysculas), con el nombre del paquete en Cach
(recuerda, en el esquema facilitado el paquete es User), y mueve las clases a dicho paquete. Si
NetBeansnorefactorizalaclases,aadiendoalprincipiopackageyelnombredelpaquete,tendrs
quehacerlomanualmente(ennuestrocasoespackageUser;).
Recuerdaquetodaslasclasespertenecientesaunmismopaquetedebenestarenunacarpetaque
sedebellamarigualque elnombre delpaquete (sielpaquete esUser,lacarpetadebellamarse
User),respetandomaysculasyminsculas.Porloquesinoconsiguescambiarelpaquetedelas
proyecciones a travs de NetBeans, puedes hacerlo manualmente: crea una carpeta dentro del
cdigofuente,ycopiadentrolosarchivosJava,modificndolosdespusparaindicarelpaqueteenel
queestn.
Y ahora, veamos como sera un sencillo ejemplo para insertar un nuevo conductor o conductora
usandounadeestasproyecciones.Versqueesmuysencillo,tienemuchaslneas,perolamayora
sonsimplementeparapedirdatosporpantalla.Fijateespecialmenteencomoseinsertandatosen

80

DesarrollodeAplicacionesWeb

Tema10

las colecciones tipo array y tipo lista de Cach, porque gracias a la proyeccin se pueden utilizar
comosifueranmapasolistasdeJava.
En el siguiente archivo comprimido encontrars un proyecto de NetBeans que te permitir
comprender como funcionan las proyecciones de Cach, vers que es muy fcil. El proyecto no
incorporalaslibrerasCacheDB.jarniodbc6.jar,porloquedebersincluirlasparapodercompilarel
proyecto.
InsertarconductoresyconductorasalabasededatosatravsdeproyeccionesJava.(670KB)

En Cach solo puede generarse ms de una proyeccin por clase, e incluso, para varios
lenguajes.

Verdadero

Falso

7.4.Sentenciasdeinsercindedatosenlabasededatos.
Y cmo insertamos objetos en la base de datos cuando no se usan proyecciones? Para insertar
objetossinusarproyeccionesloqueseusaeslasentenciaINSERTdeSQL.Estasentenciayaseha
explicado con anterioridad para Oracle, y aqu vamos a profundizar sobre su uso en Cach. Para
empezar,tienesquetenerencuentaquelasentenciaINSERTseusaenelmodelorelacional,donde
seinsertanfilasenunatabla,yqueaquvamosaversuutilizacinparainsertarobjetos.Oraclepor
ejemploesunabasededatosobjetorelacional,ylasentenciaINSERTpuedeusarconstructorespara
creareinicializarunnuevoobjeto,aunquetambinpodrutilizarselasintaxisquevamosaveraqu
paraCach.
LasintaxisqueusaCachparalasentenciaINSERTessimilaralaqueseusaraenunabasededatos
relacional, donde no se usan constructores. Cach permite manipular los objetos almacenados de
unadeterminadaclase,comosideunatablarelacionalsetratase.Estoesporqumantienedeforma
paralela una proyeccin SQL de las clases creadas, de modo que pueden ser accedidas como si se
tratase de tablas. La sintaxis que se usara para la sentencia INSERT en Cach sigue el siguiente
formato(elcualtambinsepuedeusarenOracle):
INSERT INTO clase ( lista de atributos separados por comas) VALUES (lista de valores separados
por comas)

La sentencia INSERT tiene fundamentalmente dos partes. Una primera parte que se utiliza para
indicarlaclaseyunalistadeatributos,yunasegundapartequeseutilizaraparaindicarlosvaloresa
insertar.Entreparntesis,despusdelnombredelaclase,sepuedenindicarlosatributosenlosque
sevaaguardarunvalor,dadoquenoesnecesarioponeraprioriunvalorparatodoslosatributos.Si
noseponelalistadeatributosentoncessiesnecesarioindicarelvalordetodoslosatributos.Esosi,
siempre es imprescindible poner un valor para aquellos atributos que se hayan marcado como
obligatoriosoquenopuedenestarvacos.Veamosunejemplo:
INSERT
INTO
Conductor
(DDI,
Nombre,Apellidos,FechaNacimiento,PuntosCarnet)
('12345C','Juan','Moreno Ruz',TO_DATE('12/09/1983','DD/MM/YYYY'),10+4)

VALUES

Delejemploanterior,sepuedenextraervariasconclusionesatenerencuentadeahoraenadelante:
9

Elnmerodeatributostienequecoincidirconelnmerodevalores.

Lascadenasdetextoseponenentrecomillassimples('cadena').EstoesastantoenOraclecomo
enCach.

81

DAW
9

Mantenimientodelapersistenciadelosobjetos

Los valores indicados en la segunda parte de las sentencia INSERT pueden ser una expresin
compleja,dondeinclusosepuedenusarfunciones.Eselcasodelvalorindicadoparaelatributo
PuntosCarnet, donde se usa una expresin matemtica que suma dos nmeros (10+4).
Tambineselcasodelvalorindicadoparalafechadenacimiento(FechaNacimiento),queusala
funcinTO_DATE.EstoesastantoenCachcomoenOracle.

VamosapararnosunpocoenlafuncinTO_DATE,disponibletantoenCachcomoenOracle.Esta
funcin convierte una cadena que contiene una fecha, la cual es legible por un ser humano, al
formatointernodelabasededatos.Paraello,seleproporcionaporunladolafecha,yporotro,el
formato de la fecha. El formato de fecha usado en Europa es 'DD/MM/YYYY', lo cual significa: dos
dgitosparaelda(DD),dosdgitosparaelmes(MM)ycuatrodgitosparaelao(YYYY).

SiusaslainterfazwebdeCachparaejecutarsentenciasSQLnopongaspuntoycomaal
finaldelasentencia.MientrasqueenOracleesnormalsiemprefinalizarlasentenciaen
puntoycoma,seuselainterfazqueseuse,enCachdaerrorsiponesunpuntoycomaal
final.

Dada la clase numeros, la cual tiene dos atributos no obligatorios tipo %Integer (t1 y t2),
indica cules de las siguientes formas de insertar objetos seran vlidas para Cach
usando la sentencia INSERT:
INSERTINTOnumerosVALUES(tipo_numero(10,20))
INSERTINTOnumerosVALUES(10,20)
INSERTINTOnumeros(t1)VALUES(10)
INSERTINTOnumeros()VALUES(10,20)

7.5.AlmacenandoobjetosatravsdeJDBC.(I)
Las proyecciones son un mecanismo fcil y sencillo de almacenar, modificar y manipular objetos,
pero en muchas ocasiones se quedan cortas, y es necesario recurrir a otros mecanismos. Qu
alternativastenemos?ParasuperarlaslimitacionesquetienenlasproyeccionespodemosusarJDBC,
disponibleenCachyenOracle.
Para empezar, debemos disponer de una conexin, ya sea a Cach o a Oracle va JDBC. Una vez
dispongamosdeella,laconexinnosfacilitarlapreparacindesentenciasSQLylaejecucindelas
mismasenelSGBD.Veamosprimeroalgunaspeculiaridadesadicionalessobreelusodelasentencia
INSERTenlabasededatosCach.Tienesquetenerencuentalosiguiente:
9

Alahorade almacenarobjetosdeunadeterminadaclasehayqueteneren cuentaelpaquete


donde se ubica la clase. Recuerda que cuando creas una clase, sta se ubica dentro de un
paquete.Porejemplo,laclaseUser.ConductoreslaclaseConductordentrodelpaqueteUser.

Noteconfundasdeespaciodenombres.Nopodrsaccederalasclasescreadasenotroespacio
denombres,salvoquesehayanmapeadolospaquetesdeformaadecuada,yesoesalgoqueno
sehaexplicado.

Cachproyectacadaclasecomounatabladelmismonombre(laclaseConductorseproyectara
comolatablaConductor).

CachproyectarcadapaquetedeclasescomounesquemaSQL.Unesquemaesenlaprctica
comounpaquete,peroquecontienetablas.Tenencuentalosiguiente:

82

DesarrollodeAplicacionesWeb

Tema10

LasclasesdelnamespaceUSERalmacenadasenelpaqueteUserseproyectarnenSQL
dentrodeunesquemallamadoSQLUser,queeselesquemapordefecto.Alserelesquema
pordefectonoesnecesarioponerSQLUser.ConductorparaaccederdesdeSQLalosdatos,
bastaconponerConductorparahacerreferenciaalatablaproyectadaenSQL.
Las clases de otros paquetes se proyectarn como un esquema del mismo nombre que el

paquete.Porejemplo:laclasepruebadelpaquetetest(test.prueba)seproyectarcomola
tabla prueba del esquema test (test.prueba). De esta forma para acceder desde SQL a una
tablaproyectadadeunpaquetediferenteaUsertienesqueponer,ennotacindepunto,
elpaqueteylaclase(test.pruebaporejemplo).
Unavezaclaradoslospuntosanteriores,yapodemosempezarconlainsercindeobjetosenlabase
dedatosdedatosCach.LoprimeroesconstruirunasentenciaSQLdeinsercinacordeconnuestras
necesidades,porejemplo:
String SQLq="INSERT INTO Conductor (Nombre, Apellidos, FechaNacimiento,
PuntosCarnet, direccion_nombrevia, direccion_numero, direccion_codigopostal, DDI)
VALUES (?,?,?,?,?,?,?,?)";

Fijate que la sentencia anterior es parecida a las sentencias vistas hasta ahora, pero que usa
interrogantes. Cada interrogante (?) representa un parmetro de consulta, y se usa para indicar
que en ese lugar se va a introducir un valor desde JDBC, podramos indicarlo manualmente pero
hacerlodesdeJavanosquitamuchosproblemas.
UndetallequenosetedebepasarporaltoescomoseproyectanlosatributosdelaclaseDireccion.
Recuerda que la clase Direccion antes comentada, es tipo serial, y se utiliza como propiedad en la
clase Conductor, dando lugar a la propiedad llamada direccion (en la clase Cach aparece con la d
minscula).Fijatequepodemosaccederacadaatributodelapropiedaddireccionponiendounguin
bajo y el nombre del atributo detrs. De esa forma direccion_nombrevia sera el atributo
nombreviadelapropiedaddireccion,ydireccion_numeroseraelatributonumerodelapropiedad
direccion, y as para todos los casos. Cuidado, esto es as en Cach, pero en Oracle no. Cach
proyectadeestaformalasclasestiposerial.SiDireccionnofueratiposerialseproyectaradeotra
forma.

Ten en cuenta lo siguiente: las sentencias SQL ejecutadas a travs de JDBC no deben
acabarenpuntoycoma.EnOracle,porejemplo,cuandolasentenciaseejecutaatravs
deSQL*Plus,sesueleponerunpuntoycomaalfinal(ounabarra/enunalneasola,
dependedelacostumbre),peroenJDBCnoesas.Dependiendodelainterfaz,avecesse
ponepuntoycomaalfinal,yotrasno.

7.5.1.AlmacenandoobjetosatravsdeJDBC.(II)
Bien,ahoraqueyatenemosnuestrasentenciaSQLdeinsercinpreparadaparaJDBC,procedamosa
efectuarlainsercindedatos.Enlosejemplospropuestosacontinuacinconnesunainstanciade
laclaseConnector,lacualcontienecomosedijoenapartadosanteriorestodalainformacinrelativa
alaconexin.
En primer lugar preparamos la sentencia para su ejecucin. Para ello usamos el mtodo
prepareStatementdelaclaseConnector,alquepasamoscomoargumentolaconsultaanterior,ysi
es necesario, algunas opciones de funcionamiento. En este caso, la opcin que pasamos es
RETURN_GENERATED_KEYS,lacualnospermitirobtenerelOIDdelobjetocreado.Elresultadodela
ejecucin de dicho mtodo generar una instancia de PreparedStatement, que nos servir para
ejecutarlasentenciaSQL:

83

DAW

Mantenimientodelapersistenciadelosobjetos

PreparedStatement ps=conn.prepareStatement(SQLq,Statement.RETURN_GENERATED_KEYS);

ElOID,porsinolorecuerdas,sevioalcomienzodelaunidad,yesunidentificadornicoquetiene
toda instancia de objeto. Al almacenar el objeto en la base de datos, se le asigna un OID, y esto
ocurre tanto en Cach como en Oracle. Para nosotros ser muy til, puesto que teniendo el OID
podremosabrirunainstanciadeunaclaseymanipularladesdelacorrespondienteproyeccinJava
(usandoCachJavaBindings).
Una vez preparada la consulta, tenemos que indicar el valor a poner en cada parmetro de la
consulta,esdecir,decimosquehayqueponerensustitucinacadaunadelasinterrogantes.Para
ello debemos contar la posicin del interrogante con respecto al resto de interrogantes, y
empezando a numerar por 1, vamos invocando los mtodos setString (para poner un parmetro
tipo cadena), setDate (para poner el valor en un parmetro tipo fecha), setInt (para poner un
parmetrotiponumrico),etc.Elprimerargumentodeestasfuncioneseslaposicindelparmetro
delcualsequiereindicarelvalor,yelsegundoargumentoeselvalorafijarendichaposicin.
Loimportanteaquesusarlafuncinadecuadaparacadaparmetro.SiunatributoenCachoen
Oracle es de tipo nmero entero, deberemos usar setInt y no setString. Veamos como
continuaramosnuestrocdigoahoraqueyasabemostodoesto:
ps.setString(1, "Nombre de ejemplo");
ps.setString(2, "Apellidos de ejemplo");
ps.setDate(3, java.sql.Date.valueOf("2000-01-01"));
ps.setInt(4, 15);
ps.setString(5, "Calle Desconocida");
ps.setInt(6, 55);
ps.setString(7,"93939");
ps.setString (8,"12345C");

Fjate en el uso de setDate. En el ejemplo anterior la fecha se pone a travs el mtodo esttico
ValueOf de la clase java.sql.Date, pasando como argumento una cadena con la fecha en formato
AAAAMMDD (cuatro dgitos para el ao, dos dgitos para el mes y dos dgitos para el da,
separados por guiones). Esto generar una instancia de la clase java.sql.Date que contiene dicha
fecha. Y cuidado, porque java.sql.Date no es igual que java.util.Date (el primero es para JDBC y el
segundoparaelsistema),aunqueesposibleconvertirdeuntipoaotro.
Ahora ya podemos ejecutar la consulta. Esto es lo ms fcil de todo, para ejecutarla simplemente
invocamoselmtodoexecuteUpdatedelaclasePreparedStatement:
ps.executeUpdate();

Sera correcto poner setInt(0,99)?

No

7.5.2.AlmacenandoobjetosatravsdeJDBC.(III)
Y los constructores? Adicionalmente, en Oracle, como ya se explico en apartados anteriores, se
puedenusarconstructoresenlasentenciaINSERT.Yesto,comoyaveremosmsadelante,sermuy
til.Dehecho,parainsertarunadireccinenlatabladeobjetosconductoresdelesquemadedatos
queoshemosfacilitado,habraqueusarunconstructordetipo_direccion.

84

DesarrollodeAplicacionesWeb

Tema10

La sentencia SQL siguiente sera la equivalencia Oracle a la expuesta en apartados anteriores para
Cach. Oracle no proyecta de igual forma los atributos que son tipo de dato objeto, no existiendo
direccion_nombreviaporejemplo,yexistiendolanecesidaddeusarconstructores:
String SQLq = "INSERT INTO CONDUCTORES
(nombre, apellidos, fecha_nacimiento, puntos_carnet, direccion, ddi)
VALUES (?,?,?,?,TIPO_DIRECCION(NULL,?,?, NULL,?, NULL, NULL, NULL, NULL),?);"

EnestasentenciaSQLseusaelconstructorpordefectodetipo_direccion,elproblemaesquealusar
elconstructorpordefecto,ynocrearunconstructordiferenteypropio,estamosobligadosaponer
unvalorparatodoslosatributos,yclaro,esposiblequehayavaloresquenovayamosarellenar,sea
elmotivoquesea.Paraesoscasos,seponeNULL.NULLsignificarnohaydato.
NULL se puede poner usar tanto en Oracle, como en Cach, dado que en ambas bases de datos
significarnohaydato(yengeneral,sepuedeusarencualquierbasededatosobjetorelacional).
Siocurrequeunatributo,porejemplopuntos_carnet,paraelcualhabamosprevistoponerundato
atravsdeJDBCconunparmetrodeconsulta(uninterrogante),derepente,notienedato,habra
queusarlafuncinsetNulldelaclasePreparedStatement(enelejemplosiguientepssiguesiendo
unainstanciadePreparedStatement):
ps.setNull(4, java.sql.Types.INTEGER);

setNull obviamente se usa tanto en Oracle como en Cach, y se indica por un lado la posicin del
interrogante (primer argumento), y por otro, el tipo base SQL que corresponde al tipo de dato
almacenado en dicha posicin (java.sql.Types.INTEGER para enteros, java.sql.Types.VARCHAR para
cadenas,java.sql.Types.DATEparafechas,etc.).DecaraaJDBC,lostiposdedatosalmacenadosenla
basededatostienenunnombreSQLfijo,yserelSGBDelquedeberproveer,atravsdeldriver
JDBC,latransparencianecesariaentretipos.
Esto implica que al usar setNull en Cach, dado que los tipos de datos usados son diferentes a los
estandarizadosparaSQL,debemosbuscarcualeslaequivalenciaSQLaltipodedatoCachusado.
Porejemplo,enunatributotipo%Stringseusarajava.sql.Types.VARCHAR.
Y el resto del cdigo en Java para insertar un objeto en la base de datos, a travs de JDBC, se
quedaraigualqueeldescritoenelapartadoanterior,solocambiaramos,enestecasoconcreto,la
sentenciaSQL,queesligeramentediferenteentreCachyOracle.
chale un vistazo al siguiente documento sin dudarlo, en l podrs ver cmo insertar datos en los
tiposdedatoscoleccin,tantoparaCach,comoparaOracle.
CACH.InsercindedatosenlascoleccionesusandoProyecciones.

ParaCach,serecomiendautilizarlasproyeccionesalahoradeinsertardatosenlascolecciones,as
comoparamanipularlas(modificar,eliminaryconsultarloselementosdelascolecciones),esmucho
mscmodo.ImaginaqueyahasejecutadotuconsultaSQLdeinsercindeobjetosatravsdeJDBC
(dejando sin rellenar las colecciones obviamente), y que ahora quieres insertar elementos en las
colecciones.Pararealizarestaoperacin,recurriremosalOIDdelelementorecininsertado(connes
unainstanciadelaclaseConnection):
String SQLq="INSERT INTO Conductor (Nombre, Apellidos, FechaNacimiento, PuntosCarnet,
direccion_nombrevia, direccion_numero, direccion_codigopostal, DDI) VALUES (?,?,?,?,?,?,?,?)";
PreparedStatement ps=conn.prepareStatement(SQLq,Statement.RETURN_GENERATED_KEYS);
ps.setString(1, "Nombre de ejemplo");
ps.setString(2, "Apellidos de ejemplo");
ps.setDate(3, java.sql.Date.valueOf("2000-01-01"));
ps.setInt(4, 15);
ps.setString(5, "Calle Desconocida");
ps.setInt(6, 55);

85

DAW

Mantenimientodelapersistenciadelosobjetos

ps.setString(7,"93939");
ps.setString (8,"12345C");
ps.executeUpdate();

Enelcasoexpuestoantes,nosedicenadadelascoleccionesTelefonosniMails,creadascomoarray
de%Stringenelprimercaso,ylistade%Stringenelsegundocaso.Unavezqueyasehayaejecutado
elmtodoexecuteUpdate,yapodemosobtenerelOIDdelobjetorecinalmacenado,invocandoal
mtodogetGeneratedKeysdelaclasePreparedStatement:
ResultSet rs=ps.getGeneratedKeys();
rs.next(); String nuevoOID=rs.getString(1);

EsteOIDesmuytil,especialmenteenCach(aunqueenrealidad,paraCachloqueseobtienecon
las sentencias anteriores no es el OID, sino otro tipo de identificador que al fin y al cabo nos va a
servirparalomismo).Yahoraquelotenemos,veamoscomoaadirinformacinalosatributostipo
coleccinusandoproyecciones.VeremosprimerocomocrearunnuevoobjetoCachatravsdelas
proyecciones,yluego,comousarunobjetoyaexistente,atravsdesuOID.
CrearunnuevoobjetoCach,comoporejemplounnuevoConductor,atravsdeproyeccionesJava
esrelativamentefcil.ImaginaquehasincorporadolasproyeccionesdeConductoryDireccionatu
proyecto,yqueconncontieneunainstanciavlidadelaclaseConnection,lacualcontienetodala
informacinnecesariaparaconectarseaCach.
Crearunnuevoconductorseratanfcilcomolosiguiente:
Conductor c=new Conductor(CacheDatabase.getDatabase(conn)); // Creamos un nuevo objeto
c.setNombre("Nombre"); // Establecemos el valor de los atributos necesarios.
c.setApellidos("Apellidos");
c._save(); // Guardamos.

En el cdigo anterior se ha creado una nueva instancia de la clase Conductor, invocando al


constructor de la proyeccin Java. A dicho constructor se le pasa como parmetro una conexin a
Cach,peronoexactamenteunainstanciadelaclaseConnection,sinoalgoparecidoquesepuede
obtenerfcilmentepartiendodeunaconexinJDBCexistente.Despusseestableceelvalordelos
atributos y se guarda el objeto invocando el mtodo esttico _save(), existente en cualquier
proyeccin.
Para recuperar un objeto almacenado en Cach y as poder usarlo a travs de su proyeccin,
necesitamos el OID del objeto. Cargar un objeto y manipularlo directamente desde su proyeccin
facilita enormemente el trabajo con los tipos de dato coleccin. Veamos como podramos ahora
cargarunconductorexistenteymanipularrpidamentelascoleccionesquecontienenlostelfonosy
losmails:
Conductor c=(Conductor)Conductor._open(CacheDatabase.getDatabase(conn), new Id(OID));
c.getTelefonos().put("Fijo","3939393");
c.getMails().add("mimail@maildeprueba");
c._save();

En el ejemplo anterior se recuperan los datos de un conductor partiendo de su OID a travs de la


funcin _open. El mtodo esttico _open devolver una instancia de la clase
com.intersys.classes.RegisteredObject,sobrelaquehabrquehacerunaconversindetipos.Fijate
quelafuncin_opentienedosparmetros,unaconexinalabasededatos,yunainstanciadela
clase Id, a la que se le pasa como parmetro el OID. Despus, se aade un telfono al array de
telfonos,yesosehacecomosisetrataradeunmapadeJava(java.util.Map).Ylomismopasaconla
listademails,seutilizacomosisetrataradeunalistadeJava(java.util.List).Tanfcilcomoeso.

86

DesarrollodeAplicacionesWeb

Tema10

ORACLE.InsercindedatosenlascoleccionesusandoJDBC.

Yahora,nosponemosdenuevoconOracle.Comparativamente,manejarlascoleccionesenOraclete
vaaserunpocomsdifcilqueenCach,dadoqueenOraclenousaremosproyecciones.Cuntode
difcil?Vamosaaveriguarlo.
El problema se produce, de cara a usar la sentencia INSERT, en el momento en el que tienes una
cantidaddedatosvariableaalmacenarenlascolecciones.Cuandotienesunacantidadfijadedatos,
porejemplo,exactamentedosmails,podemosusarconstructoresanidados,perocuandounobjeto
puedetener dosmails,yotro,tres,noestanfcil. EstosepuederesolverdesdeJDBC,peroesun
pocolioso.
LoprimeroahoraescrearunasentenciasentenciaINSERTquepermitainsertarcoleccionesatravs
deJDBC(estasentenciaINSERTestpensadaparaelesquemadeejemploqueoshemosfacilitado):
String SQLq = "INSERT INTO CONDUCTORES
VALUES (TIPO_CONDUCTOR(?,?,?,?,?,?,?,TIPO_DIRECCION
(NULL,?,?, NULL,?, NULL, NULL, NULL, NULL))))";

Enelejemploanteriorseusanconstructoresavariosniveles.Losinterrogantesdelasposiciones5y
6, corresponden con las posiciones del VARRAY de mails y de la tabla anidada de telfonos,
respectivamente.
Losvalorescorrespondientesatiposdedatoscoleccin,yloscorrespondientesaobjetos(comoesel
caso del tipo_direccion), pueden pasarse directamente a travs de JDBC, como si fuera un bloque
nico. Esto nos permitir indicar varios telfonos o varios mails de una tajada, es decir, podremos
insertar varios elementos en las colecciones, sin tener que modificar sustancialmente la sentencia
SQL.
Al igual que existen los mtodos setString o setInt en la clase PreparedStatement, existen los
mtodossetArrayysetObject.setArraypermiteindicarqueuninterrogantedelasentenciaSQL
serunacoleccin(yaseaVARRAYotablaanidada),ysetObjectpermiteindicarqueuninterrogante
es un objeto (por ejemplo tipo_telefono). Tambin podra haberse usado en el caso de
tipo_direccion,peronosehapuestoparanocomplicarmstodavaelejemplo.
Paraindicarqueunparmetroesunobjetotenemosquecrearprimeroundescriptordeestructura
del tipo de dato objeto. Esto se realiza a travs delmtodo esttico createDescriptor de la clase
StructDescriptor,proporcionadaatravsdelpaqueteoracle.sql.*(estaclasedebeproporcionarlade
formaindependientecadaSGDB).Seradelasiguienteforma(connsiguesiendounainstanciadela
claseConnection):
StructDescriptor sd_tipo_telefono = StructDescriptor.createDescriptor
("TIPO_TELEFONO", conn);

Lainstancia anteriorde StructDescriptorllamadasd_tipo_telefonocontiene todolonecesariopara


crearunobjetotipo_telefono,yas,poderguardarloenlacoleccintelefonos.Fjatequeelprimer
argumentodelafuncincreateDescriptoreselnombredeltipodedatoenlabasededatos,yqueel
segundoesunaconexinvlida.Unavezconocidalaestructura,yapodemosguardarlasenlabase
dedatosatravsdelaclaseSTRUCT:
String[] s_telefono_fijo={"Fijo","123451234"};
STRUCT telefono_fijo=new STRUCT(sd_tipo_telefono,conn,s_telefono_fijo);

EnelcdigoanteriorsecreaunainstanciadelaclaseSTRUCTalaqueselepasacomoparmetro:el
descriptordetipo_telefono(sd_tipo_telefono),ascomolaconexinalabasededatos,yunarrayde

87

DAW

Mantenimientodelapersistenciadelosobjetos

objetos que contendr todos los atributos (por orden) de dicho tipo objeto. Aqu tienes que tener
cuidado,enestecasotodoslosatributosdeltipotipo_telefonosoncadenasdetexto,sifuerande
otrotipo,tendrasqueusareltipoJavaequivalente(Integer,Float,etc.)alusadoenlabasededatos.
Sitienestiposdedatosdiferentes(cadenasmezcladasconnmeros),tendrsqueusarunarrayde
Objects.

Esta tcnica se podra usar para indicar la direccin en la sentencia INSERT anterior, en lugar de
poner el constructor de tipo de dato objeto tipo_direccion, se pondra un nico parmetro que se
establecera a travs del mtodo setObject. De esa manera se hubiera reducido el tamao de la
sentencia SQL, pero en contraposicin, hubieran aumentado las lneas de cdigo notablemente.
Comoimaginars,almtodosetObjectselepasancomoargumentoslaposicindelinterrogantea
reemplazar,ydespus,lainstanciadelalaclaseSTRUCTquecontieneelobjeto.
Continuando conelejemplodelapartadoanterior, ycontinuandocon Oracle,veamosahoracomo
indicaratravsdeJDBCqueunparmetrodelasentencianoessolounobjeto,sinounacoleccin
completadeobjetos.
Partamosdequeyatenemoslosiguiente,vistoenprrafosanteriores:
StructDescriptor sd_tipo_telefono = StructDescriptor.createDescriptor
("TIPO_TELEFONO", conn);
String[] s_telefono_fijo={"Fijo","123451234"};
STRUCT telefono_fijo=new STRUCT
(sd_tipo_telefono,conn,s_telefono_fijo);

Yahora,paraindicarqueunparmetrodeunasentenciaSQLesunacoleccin,debemosprocedera
crearotrodescriptor,peroenestecaso,eldescriptorserparalostiposdedatocoleccin.Primero
creamos lo que se denomina un descriptor de array, que ser una estructura que contendr
informacin sobre como es la coleccin en la base de datos. Para crearla usamos la clase
ArrayDescriptor (del paquete oracle.sql.*), de la misma forma que se uso la clase StructDecriptor,
pasndolecomoargumentoeltipodedatocoleccin(conelnombreusadoenlabasededatos,que
seraTABLA_TELEFONOSparalostelfonosyARRAY_MAILSparalosmails)yelconector:
ArrayDescriptor desc_tabla_telefonos = ArrayDescriptor.createDescriptor
("TABLA_TELEFONOS", conn);

Una vez hecho esto, tenemos que crear una instancia de la clase ARRAY (tambin del paquete
oracle.sql.*). Dicha instancia contendr la informacin que se pasar definitivamente como
parmetroalasentenciaSQL.Veamoscomosera:
//Creamos el descriptor para el objeto tipo_telefono
StructDescriptor sd_tipo_telefono = StructDescriptor.createDescriptor ("TIPO_TELEFONO", conn);
//Creamos un objeto tipo_telefono llamada tipo fijo que ya podremos almacenar en la base de
datos.
String[] s_telefono_fijo={"Fijo","123451234"};
STRUCT telefono_fijo=new STRUCT(sd_tipo_telefono,conn,s_telefono_fijo);
// Creamos el descriptor para el array de telefonos, donde meteremos el telefono anterior.
ArrayDescriptor desc_tabla_telefonos = ArrayDescriptor.createDescriptor("TABLA_TELEFONOS",
conn);
// Creamos un array de telefonos, que ahora si se podr meter en la base de datos, al que
pasamos el telefono fijo
STRUCT[] a_telefonos=new STRUCT[1];
a_telefonos[0]=telefono_fijo;
ARRAY nt_telefonos = new ARRAY(desc_tabla_telefonos s,conn,a_telefonos);

88

DesarrollodeAplicacionesWeb

Tema10

EnelejemploanteriorsecreaunainstanciadelaclaseARRAY,queestarbasadaeneldescriptordel
arraydesc_tabla_telefonos.Esainstanciayapodremosinsertarlaenlabasededatos.Paracrearla
instancia de la clase ARRAY, se le pasa como argumento el descriptor de la tabla
desc_tabla_telefonos, adems de la conexin a la base de datos, y los datos que contendr dicha
coleccin. Los datos a almacenar en la coleccin se le pasarn como si fueran un array de Object,
dondecadaelementoserunainstanciadeSTRUCTcreadaparaeltipodedatoobjetotipo_telefono.
Yahora,yapodemosindicaralaclasePreparedStatementcualessernlosdatosaalmacenarenla
tablaanidada.EstoloharemosconelmtodosetArray:
ps.setArray(6, nt_telefonos);

El caso anterior contemplaba las tablas anidadas. Pero cuando se trata de un atributo que es un
VARRAY se realiza de la misma forma. Veamos cmo sera para el caso de los mails. Este caso es
muchomssencillo,dadoqueelVARRAYcontieneuntipodedatobsico(VARCHAR2)ynountipo
dedatoobjeto:
ArrayDescriptor array_mails=ArrayDescriptor.createDescriptor("ARRAY_MAILS",conn);
String[] s_mails={"mail1@mail","mail2@mail", "mail3@mail"};
ARRAY mails=new ARRAY(array_mails,conn,s_mails);
ps.setArray(5, mails);
Veamos ahora el ejemplo completo:
//Creamos el descriptor para el objeto tipo_telefono
StructDescriptor sd_tipo_telefono = StructDescriptor.createDescriptor ("TIPO_TELEFONO", conn);
//Creamos un objeto tipo_telefono llamada tipo fijo que ya podremos almacenar en la base de
datos.
String[] s_telefono_fijo={"Fijo","123451234"};
STRUCT telefono_fijo=new STRUCT(sd_tipo_telefono,conn,s_telefono_fijo);
// Creamos el descriptor para el array de telefonos, donde meteremos el telefono anterior.
ArrayDescriptor desc_tabla_telefonos = ArrayDescriptor.createDescriptor("TABLA_TELEFONOS",
conn);
// Creamos un array de telefonos, que ahora si se podr meter en la base de datos, al que
pasamos el telefono fijo
STRUCT[] a_telefonos=new STRUCT[1];
a_telefonos[0]=telefono_fijo;
ARRAY nt_telefonos = new ARRAY(desc_tabla_telefonos s,conn,a_telefonos);
// Reemplazamos el interrogante nmero 6 por la tabla de telfonos.
ps.setArray(6, nt_telefonos);
// Creamos el array de mails, que ahora se podr meter en la base de datos:
ArrayDescriptor array_mails=ArrayDescriptor.createDescriptor("ARRAY_MAILS",conn);
String[] s_mails={"mail1@mail","mail2@mail", "mail3@mail"};
ARRAY mails=new ARRAY(array_mails,conn,s_mails);
// Reemplazamos el interrogante nmero 5 por el array de mails.
ps.setArray(5, mails);

En el siguiente archivo encontrars un proyecto de NetBeans de ejemplo, en el que se utiliza la


sentenciaINSERTparainsertardatosenlabasededatosdeejemploquetehemosproporcionado.El
proyectonoincorporalaslibrerasCacheDB.jarniodbc6.jar,porloquedebersincluirlasparapoder
compilarelproyecto.
InsertarconductoresyconductorasalabasededatosatravsdelasentenciaINSERT.(670KB)
Para saber como se proyectan en SQL cada tipo de dato usado por Cach, puedes consultar la
siguientetabla:

89

DAW

Mantenimientodelapersistenciadelosobjetos

http://docs.intersystems.com/cache20111/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_datatypes
#GOBJ_datatypes_available

Si el atributo T es de tipo entero en la base de datos, cul de las siguientes lneas de


Java valdra para indicar que su valor es NULL con setNull?
setNull(1,java.sql.Types.INTEGER)
setNull("T",java.sql.Types.INTEGER)

setNull(1,java.sql.Types.VARCHAR)
Ningunadelaanteriores

90

DesarrollodeAplicacionesWeb

Tema10

8.Manipulandolosobjetosalmacenados.
Caso prctico
Mara ha estado ayudando a Antonio, y menos mal, porque Antonio se haba atascado con JDBC y
no consegua avanzar. Pero ahora que ya ha conseguido solucionar sus problemas, lo ve todo mucho
ms sencillo, sobre todo porque para comunicarse con la base de dato se usa SQL, algo que ya
conoca con anterioridad.
Conoce SQL pero tiene que repasarlo, porque hay algunas cosas que no recuerda muy bien. Es fcil
olvidarse de las cosas que no se utilizan todos los das, as que siempre conviene tener
documentacin al lado que nos sirva de referencia.

Ycmorecupero,modificooeliminolosdatosalmacenados?Yasabemoscomoinsertarobjetosen
labasededatosatravsdediferentesmecanismos.Ahoravamosaexplorardequeformaspodemos
realizarelrestodeoperaciones.
Ya hemos visto la sentencia INSERT de SQL, la cual permitira insertar objetos en la base de datos.
Ahora veremos como recuperar objetos de la base de datos con la sentencia SELECT, como
eliminarlosconlasentenciaDELETEycomomodificarlosconlasentenciaUPDATE.
Para ejecutar estas sentencias podemos seguir usando JDBC. Las sentencias DELETE y UPDATE se
ejecutanigualqueunINSERT:
1. Creamos la sentencia SQL usando los interrogantes donde queramos pasar un parmetro.
Porejemplo:
String sqlu=UPDATE Conductor SET PuntosCarnet=PuntosCarnet-3 WHERE DDI=?;

2. Creamos una instancia de la clase PreparedStatement usando la sentencia anterior. Por


ejemplo(connunainstanciadelaclaseConnection):
PreparedStatement ps=conn.prepareStatement(conn,sqlu);

3. SustituimoslosparmetrosusandolafuncinsetdelaclasePreparedStatementadecuada:
ps.setString(1,"12345C");

4. EjecutamoslaconsultausandoelmtodoexecuteUpdatedelaclasePreparedStatement:
ps.executeUpdate();

Encambio,ejecutarunasentenciaSELECTatravsdeJDBCesligeramentediferente,dadoquehay
querecogerlosresultadosobtenidostraslaconsulta,paradespuspoderprocesarlosunoauno.Ten
encuentaquecomoresultadodeunaconsultatipoSELECTsepuedenobtenerdatosdemsdeun
objeto,porejemplo,podramosrecuperartodoslosnombresdetodoslosconductoresenunasola
consulta.Veamoscomosera:
1. CreamoslasentenciaSQLtipoSELECT.
sqlq="Select Nombre,Apellidos,FechaNacimiento from Conductor";

2. CreamosigualmenteunainstanciadelaclasePreparedStatement:
PreparedStatement ps2=conn.prepareStatement(conn,sqlq);

91

DAW

Mantenimientodelapersistenciadelosobjetos

3. Indicamos los parmetros usando la funcin set adecuada, pero como nuestra consulta no
tieneparmetros,nohacefalta.
4. EjecutamoslaconsultausandoelmtodoexecuteQuerydelaclasePreparedStatement.Esto
generarunainstanciadelaclaseResultSet,quecontendrelresultadodelaconsulta:
code
5. Paraextraerlosdatosdeunobjeto,ydespus,poderextraerlosdatosdelsiguienteobjeto,
tenemos que usar el mtodo next() de la clase ResultSet. El mtodo next(), es como un
iterador,permiteirrecorriendotodoslosresultadosobtenidos,unoporuno.Alprincipio,no
apunta a ninguno de los resultados, su primera ejecucin har que apunte al primer
resultado, su segunda ejecucin har que se apunte al segundo resultado, y as
sucesivamente.Devolverfalsecuandoyanoquedenmsresultadosqueextraer.Podemos
volverahacerqueapuntealprimerresultadoconelmtodofirst()delaclaseResultSet.
6. Conformevayamosrecorriendolalistaderesultadosconlafuncinnext(),tendremosqueir
extrayendolosdatosconlasfuncionestipogetdelaclaseResultSet.Tendremosunafuncin
getparacadatipodedatoarecuperar:getStringparacadenas,getIntparaenteros,getDate
parafechas(enformatojava.sql.Date),etc.Acadafuncingetselepasacomoargumentola
posicindeldatoaextraer(comenzandoanumerarpor1).Veamosunejemplo:
while (rs.next())
{
String Nombre=rs.getString(1);
Apellidos=rs.getString(2);
java.sql.Date fn=rs.getDate(3);
System.out.println("-->"+Nombre+" "+Apellidos+" "+fn.toString());
}

AJDBCselededicalasiguienteunidad.Aquharemosunusobsicodelmismo.

8.1.Recuperacindelosobjetosalmacenados.(I)
YcmofuncionalasentenciaSELECT?LasentenciaSELECTnosvaapermitirrecuperarinformacin
de los objetos almacenados almacenados en la base de datos, y su sintaxis es relativamente
compleja,aunqueaquvamosaverunaversinsimplificadadelamisma.
La sentencia SELECT nos permitir recuperar los datos de los objetos almacenados, pero se
recuperarn como si de una tabla se tratase, organizada por filas y columnas, donde cada fila
contendr los datos de un objeto diferente y cada columna el atributo extrado del objeto. Una
sentenciaSELECTtienelasiguienteformabsica:
SELECT atributos FROM clases u tablas de objetos WHERE condiciones

Lasentenciasedividedeformabsicaentrespartes:
9

Parte SELECT (obligatoria): donde se indican los


atributos a extraer de las clases o de las tablas de
objetos.

ParteFROM(obligatoria):dondeseindicanlasclases
(en Cach) o las tablas de objetos (en Oracle) sobre
losqueserealizarlaconsulta.

92

DesarrollodeAplicacionesWeb

Tema10

9 Parte WHERE (opcional): donde se indican las condiciones que deben cumplir los elementos a
extraer,sinocumplenlacondicin,noseextraen.
Veamos ahora, parte porparte. Empezaremos por la primera parte, la parte SELECT (recuerda que
paraejecutarlassentenciasvaJDBCnoseponenlospuntosycomafinales):
9

Podemosrecuperarunoomsatributosalavez.Paraindicarmsdeunatributosimplementese
separanporcomas:
EjemploparaCach:SELECTApellidos,NombreFROMConductor.
EjemploparaOracle:SELECTapellidos,nombreFROMconductores;.

Losatributosarecuperarpuedentenerunalias,deformaquedecaraalosresultadosobtenidos
despusdelaconsulta,elnombredelacolumnaserelalias,ynoelnombredelatributo.Elalias
seponeindicandoelnombredelaliasalladodelatributo:
EjemploparaCach:SELECTApellidosAPE,NombreNOMFROMConductor.
EjemploparaOracle:SELECTapellidosAPE,nombreNOMFROMconductores;.

Losatributosarecuperarpuedencontenerexpresionesdediferentetipo,combinandodiferentes
camposentres.Unadelasexpresionesautilizareslaconcatenacindecadenas,queserealiza
coneloperador||,tantoenOraclecomoenCach.Unacadenaseintroduciraentrecomillas
simples,comoyasecomentenapartadosanteriores:
Ejemplo para Cach: SELECT Apellidos || ', ' || Nombre NombreYApellidos FROM

Conductor.
Ejemplo para Oracle: SELECT apellidos || ', ' || nombre NombreYApellidos FROM

conductores;.
9

Tambin es muy comn usar expresiones matemticas en vez de indicar un atributo. Las
expresionesmatemticasquepodemosusarpuedencombinarseconatributosnumricos,ysu
sintaxis es igual que en Java, pudiendo usarse de parntesis, realizar sumas, restas,
multiplicacionesydivisiones(laoperacinmdulonoestdisponible):
EjemploparaCach:SELECT5*(PuntosCarnet+2)FROMConductor.
EjemploparaOracle:SELECT5*(puntos_carnet+2)FROMconductores;.

Tambinsepuedenrecuperartodosloslosatributosdelaclaseodelatabladeobjetosdeun
golpe,sinindicarlosunoauno.Pararealizarloseusaelsmbolo*envezdeindicaratributopor
atributo:
EjemploparaCach:SELECT*FROMConductor.
EjemploparaOracle:SELECT*FROMconductores;.

Y en Cach, toda clase esconde un atributo llamado %ID, que es el OID de cada instancia de
objeto almacenada (existir aunque no sea indicado). Es muy til poder obtenerlo a travs de
una sentencia SELECT, dado que nos permitir usar la proyeccin Java para operaciones de
borradoyactualizacin.
EjemploparaCach:SELECT%ID,Nombre,ApellidosFROMConductor.

93

DAW

Mantenimientodelapersistenciadelosobjetos

En la parte SELECT de la sentencia SELECT pueden indicarse todos los atributos a


extraer, o ninguno si no deseamos extraer ninguno, de los objetos almacenados en la
base de datos.
Verdadero

Falso

8.1.1.Recuperacindelosobjetosalmacenados.(II)
Y cmo sera la parte FROM de la sentencia SELECT? La parte FROM permite indicar sobre que
tablasdeobjetosoclasessevaatrabajar,permitiendoinclusocombinarvariastablasdeobjetoso
varias clases entre s, pero no vamos a entrar en tanto detalle (aunque un poco s). Veamos cmo
sera:
9

Podemosindicarquelosdatossesacarandeunaclaseotabladeobjetosconcreta,ypodemos
poner tambin un alias de dicha tabla poniendo el nombre del alias al lado del nombre de la
tabla:
EjemploparaCach:SELECT*FROMConductorcon.
EjemploparaOracle:SELECT*FROMconductorescon;.

Unavezfijadoslosaliasdelasclasesodelastablasdeobjetos,podemosusarnotacindepunto
(Alias.Atributo)paraindicarqueatributosretornaramiconsulta:
EjemploparaCach:SELECTcon.NombreFROMConductorcon.
EjemploparaOracle:SELECTcon.nombreFROMconductorescon;.

En el caso de Oracle, la parte FROM cobra especial relevancia cuando se trata de acceder a tablas
anidadas.Unatablaanidadaesunatabladentrodeotratabla,porloqueserauncasoenelquese
combinaran varias tablas. En el ejemplo siguiente se mostraran todos los atributos de la tabla
anidadatelfonos(tipodetelfonoynmero),juntoalnombredelconductorolaconductora:
9

Ejemplo para Oracle: SELECT con.nombre, tel.* FROM conductores con, TABLE(con.telefonos)
tel;.

En el ejemplo anterior se pone TABLE y entre parntesis la tabla anidada en notacin de punto
(con.telefono), para indicar que la tabla conductores se va a combinar con la tabla anidada. Al
combinarla es como si tuviramos una nica tabla que contendra cada conductor o conductora
repetido tantas veces como telfonos tenga. Si Juan tiene un telfono fijo y un telfono mvil,
aparecerandosfilas,conelnombrerepetido,ycondistintotelfono.
Para acceder
a
los
elementos
almacenados
enunVARRAY
podemosusar
la siguiente
notacin
(parecida a la
anterior, pero
ms
compleja):

RunSQLCommandLine
SQL*Plus: Release 11.2.0.2.0 Production on Mar Feb 21 00:35:19 2012
Copyright 1982, 2010, Oracle. All rights reserved.
SQL> CONNECT HR
Enter password:
Connected.
SQL>
SELECT
con.nombre,
TABLE(con.telefono) tel;
NOMBRE
-------------------Paco
juan
juan
SQL>

94

tel.*

TIPO
--------------Fijo
Fijo
Fijo

FROM

conductores

NUMERO
------------------------123456789
1231234
12341234

con,

DesarrollodeAplicacionesWeb

Tema10

SELECT COLUMN_VALUE as mail FROM TABLE


(SELECT mails FROM conductores WHERE DDI='99999F' AND mails IS NOT NULL);

EnelejemploanteriorseusatambinTABLE,peroensuinteriorhayunaconsultatipoSELECT.Dicha
subconsultaSELECTdebegenerarelVARRAYdeunnicoobjeto,yademssuresultadodebeserno
nulo (si es nulo, fallara la consulta). El nombre de la columna con los datos se llamara
COLUMN_VALUEalacualconvieneponerunalias.PoniendoTABLErealmenteloquehacemosen
convertir cualquier consulta en tabla, por lo que el caso anterior tambin se podra usar tambin
paraextraerporejemplolostelfonosdeunnicoconductor:
SELECT tel.tipo, tel.numero FROM TABLE
(SELECT telefonos FROM conductores
WHERE DDI='99999F' AND mails IS NOT NULL) tel;

LadiferenciaentreestecasoyeldelVARRAY,esqueenelcasodelastablasanidadaslostelefonossi
tienen nombres para los atributos almacenados, dado que el valor almacenado es un tipo de dato
objeto, concretamente el tipo tipo_telefono, por lo que se puede poner tel.tipo y tel.telefono,
cosaquenoocurriaenelcasodelVARRAY,dadoquealmacenabacadenas(VARCHAR2).
Y cmo manejo las listas y los arrays de Cach? En el caso de las colecciones de Cach (listas y
arrays), lo mejor y ms cmodo es manejarlas desde las proyecciones Java, dado que la sintaxis
anteriornoesaceptadaporCach.

Marca aquellas sentencias que se podran ejecutar en Cach:


SELECT%ID,Nombre,ApellidosFROMConductor
SELECT*FROMConductorcon
SELECTcon.nombre,tel.*FROMConductorcon,TABLE(con.telefonos)tel

EnCachnosepuedeutilizareltrminoreservadoTABLEparaaccederalosvaloresalmacenadosenlostiposdedatoscoleccin.

8.1.2.Recuperacindelosobjetosalmacenados.(III)
OtracosaenlaqueOracleyCachsondiferentes,esenloquerespectaalaformadetratardesde
SQLconaquellosatributosquesonasuvezuntipodedatoobjetoounaclase,comoeselcasodel
atributodirecciondelaclaseconductor.
Sirecuerdasdeapartadosanteriores,en Cachdijimosqueparaestassituacionesibamosatrabajar
conclasestiposerial,esdecir,paraembeberunaclaseenotra,bamosautilizarclasestiposerial,
que son ms fciles de tratar. Tambin dijimos que las clases tipo serial embebidas en otra clase,
proyectan sus atributos poniendo el nombre de la clase, guin bajo y el nombre del atributo
(direccion_nombrevia). Imagina que quieres mostrar algn dato de la direccin, por ejemplo, la
calleenlaqueviveunconductorounaconductora.Seharadelasiguienteforma:
9

EjemploparaCach:SELECTcon.Nombre,con.direccion_nombreviaFROMConductorcon.

EjemploparaOracle:SELECTcon.nombre,con.direccion.nombreviaFROMconductorescon;.

Fjate que en Cach se pondra como direccion_nombrevia y en Oracle como


direccion.nombrevia.EnOracleseusaunpuntoparaindicarquesetratadeunatributodentrode
untipo dedatoobjeto,mientrasqueenCachse poneunguinbajo.Estoesasporqueen Cach
Direccionestiposerial,sinofueratiposerialsepondradeotraforma.

95

DAW

Mantenimientodelapersistenciadelosobjetos

Tanto Cach como Oracle disponen adems de un catlogo de funciones que se pueden usar para
transformar digamos un atributo. Funciones que permiten muchas cosas, desde convertir una
fechaaunformatolegibleporelserhumano,acalcularelvalorabsolutodeunnmero.Veamosun
caso tpico y no trivial, que es precisamente convertir una fecha a formato legible por un ser
humano:
9

EjemploparaCach:SELECTTO_CHAR(FechaNacimiento,'DD/MM/YYYY')FROMConductor.

Ejemplo para
conductores;.

Oracle:

SELECT

TO_CHAR(fecha_nacimiento,'DD/MM/YYYY')

FROM

El ejemplo anterior usa la funcin TO_CHAR para convertir la fecha de nacimiento en un formato
concreto, concretamente el formato europeo de fecha (dos dgitos para el da, dos para el mes y
cuatroparaelao,separadosporbarras).

En el listado siguiente podrs encontrar un compendio de las funciones disponibles en


Cach:
http://docs.intersystems.com/cache20111/csp/docbook/DocBook.UI.Page.cls?KEY=RSQL_FU
NCTIONS
Yenelsiguienteenlace,tienesuncompendiodefuncionesparaelSQLdeOracle.
http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions001.htm

8.1.3.Recuperacindelosobjetosalmacenados.(IV)
Ycmoseralaparte WHEREdelas sentenciasSELECT?La parteWHERE nospermitedelimitarel
conjuntodeobjetosdelosqueserecuperarinformacin.Veamoscomoutilizarla:
9

Podramosmostrarsololosconductoresylasconductorasquetuvieranmsde10puntos?Pues
si. Lo haramos a travs de un operador de comparacin numrico. Podemos especificar en la
sentenciaSELECTquedichoatributodebesermayor(>),menor(<),igual(=),mayoroigual(<=),
menoroigual(>=)odistinto(<>)queotronmerooqueotroatributo.Loscomparadoresson
igualesqueenJavasalvoelcomparadordedistintoquepasaaser<>enlugarde!=.Veamos
comosera:
Ejemplo para Cach: SELECT Nombre,PuntosCarnet FROM Conductor WHERE

PuntosCarnet>10.
Ejemplo para Oracle: SELECT nombre, puntos_carnet FROM conductores where

puntos_carnet>10;.
9

Conlascadenasdetextosepuedeusareloperadorigualparaverificarqueunacadenacontiene
unvalorconcreto(recuerda,enSQLseusancomillassimplesparalascadenas):
Ejemplo para Cach: SELECT Nombre, PuntosCarnet FROM Conductor where

Nombre='Juan'.
Ejemplo para Oracle: SELECT nombre, puntos_carnet FROM conductores where

Nombre='Juan';.
9

Cuando necesitamos hacer una bsqueda imprecisa de una cadena, porque solo conocemos
partedelacadena,podemosusarelcomparadorlike.Elcomparadorlikepermiteindicarque
unatributodebeparecerseaunpatrn.Elpatrnesmuysimple,seponeporcentaje(%)para
decirquepuedehabercualquiernmerodecaracteresyguinbajo(_)paradecirquepuede
haberunnicocarcter:

96

DesarrollodeAplicacionesWeb

Tema10

Ejemplo para Cach: SELECT Nombre, PuntosCarnet FROM Conductor where Nombre like
'%uan'.
EjemploparaOracle:SELECTnombre,puntos_carnetFROMconductoreswhereNombrelike

'%uan';.
9

La fechas tambin se puede comparar usando los comparadores numricos. Esto permitir
comprobar si una fecha es posterior o anterior a otra. En el ejemplo siguiente se indica que la
fechadenacimientodelconductorodelaconductoradebeserposteriora1deenerode1976.
LafuncinTO_DATEseutilizaparaconvertirunafechaenformatolegibleporelserhumano,a
formatointernodelabasededatos.
Ejemplo para Cach: SELECT Nombre, FechaNacimiento FROM conductor WHERE

FechaNacimiento>TO_DATE('01/01/1976','DD/MM/YYYY').
Ejemplo para Oracle: SELECT nombre, fecha_nacimiento FROM conductores WHERE

fecha_nacimiento>TO_DATE('01/01/1976','DD/MM/YYYY');.
9

Las condiciones is null e is not null son especialmente tiles cuando lo que se desea
comprobaresqueunatributocontienevalor,yquenosehadejadovaco.Suusoesmuysimple,
isnullsignificaestvacoeisnotnullsignificanoestvaco:
EjemploparaCach:SELECTNombreFROMconductorWHEREPuntosCarnetisnotnull;.
EjemploparaOracle:SELECTnombreFROMconductoresWHEREPuntosCarnetisnotnull;

LascondicionesdelaseccinWHEREsepuedenagruparusandooperadoresANDyOR,equivalentes
alasoperacionesYlgica(&&)yOlgica(||)deJava.Sepuedenusarparntesisparaagrupar
dichasoperaciones,yadems,sepuedeusarNOTcomonegacinlgica,equivalentealanegacin
lgicadeJavaconeloperador!.Veamosunejemplo:
SELECT Nombre, Apellidos, FechaNacimiento, PuntosCarnet FROM Conductor WHERE
PuntosCarnet is not null AND
(PuntosCarnet>10 OR FechaNacimiento>TO_DATE('01/01/1976','DD/MM/YYYY'))

En el ejemplo anterior, se recuperan de la base de datos aquellos conductores para los que hay
informacindepuntosdeenelcarnetycumplenunadelasdoscondicionessiguientes:otienenms
de10puntosdecarnet,ohannacidodespusdel1deenerode1976.ElejemploseraparaCach,
peroenOraclerealizaradeformasimilar.

Dada la condicin "PuntosCarnet>10 AND PuntosCarnet<5". Qu rango de valores


admitira?
Todoslosvaloresentre10y5
Todoslosvaloresquenoestnentre10y5

Noadmitiraningnvalor

8.2.Modificacindelosobjetosalmacenados.

97

DAW

Mantenimientodelapersistenciadelosobjetos

YcmoeslasentenciaUPDATE?LamodificacindelosobjetosalmacenadosenCachyenOracle
se realiza a travs de la sentencia UPDATE de SQL, y su utilizacin es bastante sencilla. Bueno, en
Cach tambin se pueden modificar a travs de las proyecciones Java, pero eso ya lo sabas,
verdad?LasentenciaUPDATEconsisteenmodificaraquellosobjetosquecumplanunadeterminada
condicin,perocuidado,semodificarntodoslosobjetosquecumplanlacondicin,aunqueseams
deuno.
Paragarantizarquenoseactualizaunobjetoerrneo,esconvenientetenerenlaclaseoenlatabla
de objetos un atributo que este marcado como llave primaria, de forma que no se pueda repetir
nunca,yquesirvaparaidentificardeformaunvocaacadaobjetoalmacenado.Estogarantizarque
enesassituacionesmsimportantes,dondelamodificacindeunobjetoerrneopuedesignificarla
prdidadeinformacin,sepuedausaralmenoslallaveprimariaparaidentificarcadaobjeto.
Dichoesto,laestructuradelasentenciaUPDATEesdelasiguienteforma:
UPDATE clase o tabla de objetos SET nuevos valores para los atributos WHERE condicion

Estasentenciaestdivididaentresbloquesobligatorios.UnbloqueUPDATE,alquedebeseguirel
nombre de una clase o de una tabla de objetos, un bloque SET, en el cual se indican los nuevos
valoresparalosatributos,yunbloqueWHERE,cuyofuncionamientoesigualqueelbloqueWHERE
delasentenciaSELECTyquedelimitaelconjuntodeobjetossobreelcualseaplicalaactualizacin.
Veamosunejemplo:
9

Ejemplo para Cach: UPDATE Conductor SET PuntosCarnet=10, direccion_tipovia='Calle',


direccion_nombrevia='Perdida',direccion_numero=33WHERENombre='Juan'.

Ejemplo
para
Oracle:
direccion=tipo_direccion('Calle',
nombre='Juan';.

UPDATE
conductores
SET
puntos_carnet=10,
'Perdida',3,NULL,NULL,NULL,NULL,NULL,NULL)
WHERE

En el ejemplo anterior se modificara la informacin almacenada de aquellos conductores cuyo


nombre es Juan (todos los que se llamen Juan, sin dejar ni uno sin modificar), y se les aadira
informacin sobre los puntos que tienen en el carnet y algunos datos de su direccin. Aqu se ha
hechounamodificacin,queaunquesirvedeejemplo,hapodidoafectaramsdeunregistro,dado
quenombrenoesunallaveprimaria.
EnelbloqueSETsetienequeindicarelvalordecadaatributoamodificar,indicandoelnombredel
atributo,seguidodeunsmbolodeigual,yponiendodetrselnuevovalorparaelatributo.Cuando
haymsdeunamodificacin,estasseseparanporcomas.Fjateenelusodelascomillassimples,
usadasparaindicarelvalordelosatributosquesoncadenasdetexto.
Pero hay una cosa ms, si te fijas con detalle en las sentencias anteriores, y comparas la solucin
paraCachylasolucinparaOracle,versqueladiferenciamsnotableesqueenOracleseusael
constructordeltipodedatotipo_direccion,paracambiarlosvaloresdeladireccin.EnOracle,para
modificar ese tipo de atributos, cuyo tipo es un tipo de dato objeto (como el caso del atributo
direccion), y para modificar los atributos basados en colecciones (tanto VARRAYs como tablas
anidadas), se usan constructores (hay otras tcnicas pero son ms complejas y no abordan aqu).
Veamos un ejemplo de como modificar un atributo tipo VARRAY en Oracle, en este caso
cambiaremoslalistademailsdeunconductor:
UPDATE conductores SET mails=ARRAY_MAILS('mail1@mail','mail2@mail') WHERE

98

nombre like 'Jua_';

DesarrollodeAplicacionesWeb

Tema10

Para las tablas anidadas sera similar al caso anterior. Bueno, sera un poco ms complejo, porque
hayqueusarmsnivelesdeconstructoresanidados,peroafinyalcaboeslamismadinmica.
En el caso de Cach, lo mejor para manipular las colecciones (listas y arrays asociativos) es usar
proyeccionesJava,comoyasecomentantes.Paraello,simplementeaveriguamoselOIDatravs
de una consulta SQL (consultando el campo oculto %ID), y cargamos la proyeccin a travs del
esttico mtodo _open, disponible en cada proyeccin, pasndole como argumento el OID
recuperado.

8.3.Borradodelosobjetosalmacenados.
Elborradodeobjetoseslomssencillo,ylomspeligroso.Paraborrarunobjetodelabasededatos
usamoslasentenciaDELETE.LasentenciaSQLDELETEtienebsicamentedospartes:
DELETE FROM clase o nombre de la tabla WHERE condicion

AunquelasentenciaDELETEpuedesermscomplicada,elusoquevemosaquesrealmentesimple.
EltrminoreservadoFROMesopcional.Habraqueindicarporunladolatabladeobjetosolaclase
de la que se eliminarn objetos, y por otro, una condicin Se trata de eliminar todos aquellos
registrosquecumplanunacondicindeterminada.Lacondicinserdelmismotipoalausadapara
lasentenciaSELECT.Porejemplo:
9

EjemploparaCach:DELETEConductorWHERENombrelike'%uan'.

EjemploparaOracle:DELETEconductoresWHEREnombrelike'%uan';.

Lacondicinpuedesertodolocomplejaquequeramos,peroenelcasoanteriorborraratodoslos
registros cuyo nombre terminara en uan. Esta forma de eliminar objetos funcionar en Cach, y
obviamentetambinenOracle.
Nuevamenteaquhayquetenermuchocuidado,porqueesfcilborrarobjetosquenoqueramossi
usamoscondicionespocofinas.Esconvenientesiempreusarunatributoqueseallaveprimaria,para
asegurarqueestamoseliminandojustoelobjetoquequeremos:
9
9

EjemploparaCach:DELETEConductorWHEREDNI='12345C'.
EjemploparaOracle:DELETEconductoresWHEREDNI='12345C';.

EnCachtambinpuedesusarlaproyeccinJavadelasclasesCachparaeliminarobjetosdelabase
dedatos.Sueliminacinesmuysencilla.Paraello,cadaproyeccinJavatendrunmtodoesttico
llamado_deletealqueselepasarcomoparmetroelOIDdelelementoaeliminar.

Cul de estas sentencias borrara de la base de datos aquellos conductores y aquellas


conductoras que tienen menos de 10 puntos en el carnet?
DELETE*FROMConductorWHEREPuntosCarnet>10
DELETEConductorWHEREPuntosCarnet<=10

DELETEFROMConductorWHEREPuntosCarnet<10
Ningunadelasanteriores

EnelsiguienteenlaceencontrarsmsinformacinacercadelSQLempleadoenbasede
datosCach.
http://docs.intersystems.com/cache20111/csp/docbook/DocBook.UI.Page.cls?KEY=GSQL

99

DAW

Mantenimientodelapersistenciadelosobjetos

8.4.BorrarymodificarobjetosdesdeJDBCyproyecciones.
EnapartadosanterioressehanexplicadolassentenciasSQLdeeliminacinymodificacin,veamos
ahora rpidamente como sera su uso desde JDBC. Su ejecucin desde JDBC es simple, se usan los
interrogantesparaindicarqueenunaposicindeterminadasevaapasarunparmetroatravsde
losmtodossetdelaclasePreparedStatement.Veamosunpequeoejemplodeusodelasentencia
UPDATE a travs de JDBC. El ejemplo propuesto correspondera con el esquema de ejemplo para
Cach, en el caso de Oracle sera igual, pero cambiando el nombre de los atributos y de las tablas
(conncorrespondeconunainstanciadelaclaseJDBCConnection):
SQLu = "UPDATE Conductor SET Nombre=? WHERE DDI=?";
PrepareStatement ps=conn.prepareStatement(SQLu);
ps.setString(1,"Juan"); // Establecemos el parmetro el nuevo valor del nombre a travs de
setString
ps.setString(2,"12345C"); // Indicamos el DNI del conductor a modificar a travs tambin de
setString.
int objetos_modificados=ps.executeUpdate();

Elejemploanterioryatedebesermsomenosconocido.Comosedijoenapartadosanteriores,se
puedenusarparmetros(interrogantes)conlassentenciasUPDATEyDELETE,ysuejecucincorrera
a cargo del mtodo executeUpdate de la clase PreparedStatement. Usarlo para sentencias tipo
DELETE es por tanto, muy parecido. Para conocer el nmero de objetos afectadas por una
modificacin (o una eliminacin) el mtodo executeUpdate retornar un nmero entero que
contendrelnmerodeobjetosmodificados(oeliminadosencasodeunasentenciaDELETE).
UndetalleimportanteesqueenlassentenciasUPDATE,cuandohablamosdeOracle,sepuedenusar
los mtodos setArray y setObject para pasar como parmetro una coleccin entera o un objeto
respectivamente.EsonosevitatenersentenciasUPDATEexcesivamentecomplicadas,dondeseusan
muchosconstructores.SiquieresrecordarelusodelosmtodossetArrayysetObjectechaunvistazo
denuevoalapartadodealmacenamientodeobjetos.
EnelcasodeCach,lamodificacinyelborradodeelementostambinsepuederealizaratravsde
las proyecciones Java. Para ello, es necesario conocer de antemano el OID del objeto u objetos a
modificar o eliminar. Podemos averiguar el OID a travs del campo oculto %ID, en el cual Cach
almacenarelOIDdecadaobjeto.VeamoscomoseralaconsultaparaextraerelOID,lacualesya
conocidadeapartadosanteriores:
String SQLd="SELECT %ID FROM Conductor WHERE DDI='?'";
PrepareStatement ps=conn.prepareStatement(SQLd);
ps.setString(1,"12345C");
ResultSet rs=ps.executeQuery();

EnelcdigoanteriorseejecutaunaconsultaSELECTpararecuperarelOIDdeunobjetoalmacenado.
Ennuestrocaso,laconsultaanteriorgeneraraunnicoresultado,dadoquelacolumnaDDIesclave
primaria y no se puede repetir, pero no obstante, siempre conviene chequear que solo se haya
obtenidounnicoOID(necesitamosexactamenteuno):
rs.last(); // Nos movemos a la ltima fila de la tabla.
String oid=null;
if (rs.getRow()>1) { System.out.println(Error: existe ms de un campo con el mismo DDI. );
}
else {
if (rs.first()) oid=rs.getString(1);
else System.out.println(Error: No existe ningn objeto para el DDI proporcionado.);
}

En el cdigo anterior, se usa el mtodo last() de la clase ResultSet, que permite desplazarse a la
ltima fila del resultado obtenido. Despus se usa el mtodo getRow() de la misma clase, para

100

DesarrollodeAplicacionesWeb

Tema10

obtenerelnmerodefilasobrelaqueseestapuntandoenesemomento.SigetRow()retornaun
valormayorde1,despusdehabernosmovidoalaltimafila,esquetenemosmsdeunresultado,
locualnoesvlido,dadoquenosabramosqueOIDeliminardeentretodoslosobtenidos.
Despusseusalafuncinfirst()delaclaseResultSetparamovernosalaprimerafila.Dichafuncin
retornartruesiexisteunaprimerafila,yfalsesilatablaestvaca.Deesaformanosaseguramos
queefectivamenteelresultadodelaconsultaSQLhapermitidorecuperarelOIDdelobjetobuscado.
UnavezobtenidoelOID,yapodemoseliminarelobjetoatravsdelaproyeccin,usandoelmtodo
esttico_deletequeencontraremosencadaproyeccin:
if (oid!=null) Conductor._delete (conn,new ID(oid));

Esosi,tendrsqueusarelmtodo_deletedelaproyeccincorrespondientealobjetoaeliminar,no
podrsusarcualquierproyeccin.Elmtodo_deletetieneexactamentelosmismosargumentosque
elmtodoesttico_open,disponibletambinenlasproyeccionesJavadelosobjetosCach,perosu
objetivo es diferente, dado que el mtodo _open lo usamos para abrir y modificar una objeto
almacenado,talycomoseexplicoenapartadosanteriores.Veamoscomosera:
if (oid!=null) Conductor c=(Conductor)Conductor._open(conn,new ID(oid));

Elmtodoesttico_opendevolverunainstanciadelaclasecom.intersys.classes.RegisteredObject,
sobrelaquehabrquehacerunaconversindetipos.

101

TEMA11

INDICE

1.Introduccin.......................................................................................................................................2
1.1.Eldesfaseobjetorelacional........................................................................................................................3
1.2.JDBC............................................................................................................................................................4
1.3.ConectoresoDrivers...................................................................................................................................4
1.4.Instalacindelabasededatos...................................................................................................................5
DescargareinstalarMySQL...............................................................................................................................................5
2.Creacindelastablasenunabasededatos...................................................................................11
CREARTABLASCONMySQL..................................................................................................................11
2.1.LenguajeSQL(I)........................................................................................................................................16
COMANDOSSQLMASUSUALES......................................................................................................................................17
2.1.1.LenguajeSQL(II)...................................................................................................................................................18
3.Establecimientodeconexiones.......................................................................................................19
3.1.Instalarelconectordelabasededatos...................................................................................................19
INSTALARCONECTORJDBCPARAMySQL.......................................................................................................................19
3.2.RegistrarelcontroladorJDBC...................................................................................................................22
4.Ejecucindeconsultassobrelabasededatos................................................................................23
4.1.Recuperacindeinformacin(I)...............................................................................................................23
4.1.1.Recuperacindeinformacin(II).........................................................................................................................24
4.2.Actualizacindeinformacin....................................................................................................................25
4.3.Adicindeinformacin.............................................................................................................................25
4.4.Borradodeinformacin.............................................................................................................................25
4.5.Cierredeconexiones................................................................................................................................26
4.6.Excepciones...............................................................................................................................................26

[PROGRAMACIN]
JosLuisComesaaCabeza2011/2012
ProgramacindelcursodeDesarrollodeAplicacionesWeb

DesarrollodeAplicacionesWeb

Tema11

Gestindebasesdedatosrelacionales.
Caso prctico
Ada ha asignado un proyecto a Mara y a Juan. Se trata de un proyecto importante, y puede suponer
muchas ventas, y por tanto una gran expansin para la empresa.
En concreto, un notario de renombre en el panorama nacional, se dirigi a BK programacin para
pedirles que les desarrolle un programa para su notara, de modo que toda la gestin de la misma,
incluyendo la emisin de las escrituras, se informatizaran. Adems, si el programa es satisfactorio, se
encargar de promocionar la aplicacin ante el resto de sus conocidos notarios, pudiendo por tanto
suponer muchas ventas y por ello, dinero.
Una cuestin vital en la aplicacin es el almacenamiento de los datos. Los datos de los clientes, y de
las escrituras debern guardarse en bases de datos, para su tratamiento y recuperacin las veces
que haga falta.
Como en BK programacin trabajan sobre todo con Java, desde el primer momento Juan y Mara
tienen claro que van a tener que utilizar bases de datos relacionales y JDBC y as lo comentan con
Ada.

DAW

Gestindebasesdedatosrelacionales

1.Introduccin.
Hoy en da, la mayora de aplicaciones
informticas necesitan almacenar y gestionar
grancantidaddedatos.
Esos datos, se suelen guardar en bases de
datos relacionales, ya que stas son las ms
extendidasactualmente.
Las bases de datos relacionales permiten
organizarlosdatosentablasyesastablasydatosserelacionanmediantecamposclave.Ademsse
trabajaconellenguajeestndarconocidocomoSQL,parapoderrealizarlasconsultasquedeseemos
alabasededatos.
Unabasededatosrelacionalsepuededefinirdeunamanerasimplecomoaquellaquepresentala
informacinentablasconfilasycolumnas.
Unatablaesunaseriedefilasycolumnas,enlaquecadafilaesunregistroycadacolumnaesun
campo.Uncamporepresentaundatodeloselementosalmacenadosenlatabla(NSS,nombre,etc.)
Cadaregistrorepresentaunelementodelatabla(elequipoRealMadrid,elequipoRealMurcia,etc.)
Nosepermitequepuedaaparecerdosomsveceselmismoregistro,porloqueunoomscampos
delatablaformanloqueseconocecomoclaveprimaria(atributoqueseeligecomoidentificadorenunatabla,de
maneraquenohayadosregistrosiguales,sinoquesediferencienalmenosenesaclave.Porejemplo,enelcasodeunatablaqueguarda
datosdepersonas,elnmerodelaseguridadsocial,podraelegirsecomoclaveprimaria,puessabemosqueaunquehayadospersonas
llamadas,porejemplo,JuanPrezPrez,estamossegurosdequesunmerodeseguridadsocialserdistinto).

El sistema gestor de bases de datos, en ingls conocido como: Database Management System
(DBMS),gestionaelmodoenquelosdatossealmacenan,mantienenyrecuperan.
En el caso de una base de datos relacional, el sistema gestor de base de datos se denomina:
RelationalDatabaseManagementSystem(RDBMS).
Tradicionalmente, la programacin de bases de datos ha sido como una Torre de Babel: gran
cantidad de productos de bases de datos en el mercado, y cada uno "hablando" en su lenguaje
privadoconlasaplicaciones.
Java,medianteJDBC(Java Database Connectivity. API que permite la ejecucin de operaciones sobre bases de datos desde el
lenguajedeprogramacinJava,independientementedelsistemaoperativodondeseejecuteodelabasededatosalacualseaccede),
permite simplificar el acceso a base de datos, proporcionando un lenguaje mediante el cual las
aplicaciones pueden comunicarse con motores de bases de datos. Sun desarroll este API para el
accesoabasesdedatos,contresobjetivosprincipalesenmente:
9

SerunAPIconsoportedeSQL:poderconstruirsentenciasSQLeinsertarlasdentrodellamadasal
APIdeJava,

AprovecharlaexperienciadelosAPIsdebasesdedatosexistentes,

Sersencillo.

JDBC permite acceder a bases de datos relacionales cuando programamos con Java,
pudiendo as utilizar SQL.
Verdadero

JBDCsirveparaaccederabasesdedatosrelacionalesconJava.

Falso

DesarrollodeAplicacionesWeb

Tema11

Si necesitas refrescar o simplemente aprender el concepto de clave primaria, en la


wikipediapuedesconsultarlo.
http://es.wikipedia.org/wiki/Clave_primaria

1.1.Eldesfaseobjetorelacional.
El desfase objetorelacional, tambin conocido como impedancia objetorelacional, consiste en la
diferencia de aspectos que existen entre la programacin orientada a objetos y la base de datos.
Estosaspectossepuedepresentarencuestionescomo:
9

Lenguajedeprogramacin.Elprogramadordebeconocerellenguajedeprogramacinorientada
aobjetos(POO)yellenguajedeaccesoadatos.

Tiposdedatos:enlasbasesdedatosrelacionalessiemprehayrestriccionesencuantoalostipos
dedatosquesepuedenusar,quesuelensersencillos,mientrasquelaprogramacinorientadaa
objetosutilizatiposdedatosmscomplejos.

Paradigma(unapropuestatecnolgica,unmodelo,adoptadaporunacomunidaddeprogramadoresqueunvocamentetratade
resolverunoovariosproblemasclaramentedelimitados.Tieneunaestrecharelacinconlaformalizacindedeterminadoslenguajes
en su momento de definicin. Un paradigma de programacin est delimitado en el tiempo en cuanto a aceptacin y uso ya que
nuevos paradigmas aportan nuevas o mejores soluciones que la sustituyen parcial o totalmente)deprogramacin.Enel

proceso de diseo y construccin del software se tiene que hacer una traduccin del modelo
orientado a objetos de clases al modelo EntidadRelacin (E/R) puesto que el primero maneja
objetosyelsegundomanejatablasytuplasofilas,loqueimplicaquesetenganquediseardos
diagramasdiferentesparaeldiseodelaaplicacin.
El modelo relacional trata con relaciones y conjuntos debido a su naturaleza matemtica. Sin
embargo,elmodelodeProgramacinOrientadaaObjetostrataconobjetosylasasociacionesentre
ellos.Porestarazn,elproblemaentreestosdosmodelossurgeenelmomentodequererpersistir
losobjetosdenegocio
La escritura (y de manera similar la lectura) mediante JDBC implica: abrir una conexin, crear una
sentencia en SQL y copiar todos los valores de las propiedades de un objeto en la sentencia,
ejecutarlayasalmacenarelobjeto.Estoessencilloparauncasosimple,perotrabajososielobjeto
poseemuchaspropiedades,obiensenecesitaalmacenarunobjetoqueasuvezposeeunacoleccin
deotroselementos.Senecesitacrearmuchomscdigo,ademsdeltediosotrabajodecreacinde
sentenciasSQL.
Este problema es lo que denominbamos impedancia ObjetoRelacional, o sea, el conjunto de
dificultades tcnicas que surgen cuando una base de datos relacional se usa en conjunto con un
programaescritoenconulenguajesdeProgramacinOrientadaaObjetos.
Podemos poner como ejemplo de desfase objetorelacional, un Equipo de ftbol, que tenga un
atributo que sea una coleccin de objetos de la clase Jugador. Cada jugador tiene un atributo
"telfono". Al transformar ste caso a relacional se ocupara ms de una tabla para almacenar la
informacin,implicandovariassentenciasSQLybastantecdigo.

Si no has estudiado nunca bases de datos, ni tienes idea de qu es SQL o el modelo


relacional,seraconvenientequetefamiliarizarasconl.Acontinuacinteindicamosun
tutorialbastanteamenosobreSQLyendondedescribebrevementeelmodelorelacional.
http://www.aulaclic.es/sql/

DAW

Gestindebasesdedatosrelacionales

1.2.JDBC.
JDBCesunAPIJavaquehaceposibleejecutarsentenciasSQL.
DeJDBCpodemosdecirque:
9

ConstadeunconjuntodeclaseseinterfacesescritasenJava.

Proporciona un API estndar para desarrollar aplicaciones de bases de datos con un API Java
pura.

ConJDBC,nohayqueescribirunprogramaparaaccederaunabasededatosAccess,otroprograma
distintoparaaccederaunabasededatosOracle,etc.,sinoquepodemosescribirunnicoprograma
conelAPIJDBCyelprogramaseencargardeenviarlassentenciasSQLalabasededatosapropiada.
Adems,ycomoyasabemos,unaaplicacinenJavapuedeejecutarseenplataformasdistintas.
EneldesarrollodeJDBC,ydebidoalaconfusinquehuboporlaproliferacindeAPI'spropietarios
de acceso a datos, Sun busc los aspectos de xito de un API de este tipo, ODBC (Open Database
Connectivity.APIdeaccesoadatos,desarrolladoporMicrosoft.conlaideadetenerunestndarparaelaccesoabasesdedatosenentorno
Windows).

ODBC se desarroll con la idea de tener un estndar para el acceso a bases de datos en entorno
Windows.
Aunque la industria ha aceptado ODBC como medio principal para acceso a bases de datos en
Windows,ODBCnoseintroducebienenelmundoJava,debidoalacomplejidadquepresentaODBC,
yqueentreotrascosashaimpedidosutransicinfueradelentornoWindows.
El nivel de abstraccin (Uno de los objetivos fundamentales de una base de datos es proporcionar a los usuarios una visin
abstractadelosdatos.Esdecir,elsistemaocultaciertosdetallesrelativosalaformaenquesealmacenanymantienenlosdatos.Estose
logra definiendo tres niveles de abstraccin en los que puede considerarse la base de datos: fsico, conceptual y de visin) al que

trabaja JDBC es alto en comparacin con ODBC, la intencin de Sun fue que supusiera la base de
partidaparacrearlibrerasdemsaltonivel.
JDBCintentasertansimplecomoseaposible,peroproporcionandoalosdesarrolladoreslamxima
flexibilidad.

JDBC es la versin de ODBC para Linux.


Verdadero

Falso

ODBCsedesarrollparaserunestndarparaelaccesoabasesdedatosenentornoWindows.

1.3.ConectoresoDrivers.
ElAPIJDBCvienedistribuidoendospaquetes:
9

java.sql,dentrodeJ2SE

javax.sql,extensindentrodeJ2EE

Unconectorodriveresunconjuntodeclasesencargadasdeimplementarlas
interfacesdelAPIyaccederalabasededatos.
Parapoderconectarseaunabasededatosylanzarconsultas,unaaplicacin
necesita tener un conector adecuado. Un conector suele ser un fichero .jar que contiene una
implementacindetodaslasinterfacesdelAPIJDBC.

DesarrollodeAplicacionesWeb

Tema11

Cuandoseconstruyeunaaplicacindebasededatos,JDBCocultalosdetallesespecficosdecada
basededatos,demodoqueleprogramadorseocupeslodesuaplicacin.
Elconectorloproporcionaelfabricantedelabasededatosobienuntercero.
El cdigo de nuestra aplicacin no depende del driver, puesto que trabajamos contra los
paquetesjava.sqlyjavax.sql.
JDBCofrecelasclaseseinterfacespara:
9

Establecerunaconexinaunabasededatos.

Ejecutarunaconsulta.

Procesarlosresultados.

Ejemplo:
// Establece la conexin
Connection con = DriverManager.getConnection (
jdbc:odbc:miBD, miLogin, miPassword);
// Ejecuta la consulta
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(SELECT nombre, edad FROM Jugadores);
// Procesa los resultados
while (rs.next()) {
String nombre = rs.getString(nombre);
int edad = rs.getInt(edad);
}

Enprincipio,todoslosconectoresdebensercompatiblesconANSISQL2EntryLevel(ANSISQL2se
refiere a los estndares adoptados por el American National Standards Institute (ANSI) en 1992.
Entry Level se refiere a una lista especfica de capacidades de SQL). Los desarrolladores de
conectorespuedenestablecerquesusconectoresconocenestosestndares.

ListasobrelosconectoresJDBCparaaccederamuchaslasbasesdedatoslistadas.
http://www.devx.com/tips/Tip/28818

1.4.Instalacindelabasededatos.
Lo primero que tenemos que hacer, para poder realizar consultas en una base de datos, es
obviamente, instalar la base de datos. Dada la cantidad de productos de este tipo que hay en el
mercado,esimposibleexplicarlainstalacindetodas.Asquevamosaoptarporuna,enconcreto
porMySQLyaqueesunsistemagestorgratuitoyquefuncionaenvariasplataformas.
ParainstalarMySQLenWindowspuedesseguirlospasosquetedetallamosacontinuacin

DescargareinstalarMySQL

DAW

Gestindebasesded
datosrelacio
onales

DesarrollodeApllicacionesW
Web

Tema11
1

DAW

Gestindebasesdedatosrelacionales

DesarrollodeAplicacionesWeb

Tema11

DAW

Gestindebasesdedatosrelacionales

Si utilizas Linux, el sitio de descarga es el mismo que el indicado en la presentacin


anterior,ylainstalacinlapuedeshacerconlospasosqueteindicanenelenlace:
http://www.alcancelibre.org/staticpages/index.php/comomysqlquickstart
Para usar programar accesos a MySQL hay que tener el driver JDBC para MySQL en
nuestra aplicacin.
Verdadero

Falso

Denoserasserimposibleconectarnosalabasededatos.

Para probar con otras bases de datos, puedes instalar tambin Oracle. Aqu puedes ver
comoseinstala.
http://abenzoar.wordpress.com/oracle/instalacionbasededatosoracle10g/

10

DesarrollodeAplicacionesWeb

Tema11

2.Creacindelastablasenunabasededatos.
Caso prctico
Mara, Ada y Juan han realizado concienzudamente el diseo de las tablas necesarias para la base
de datos de la aplicacin de notaras.
Tambin se han decantado por el sistema gestor de bases de datos a utilizar. Emplearn un sistema
gestor de bases de datos relacional. Una vez instalado el sistema gestor, tendrn que programar los
accesos a la base de datos para guardar los datos, recuperarlos, realizar las consultas para los
informes y documentos que sean necesarios, etc.

EnJavapodemosconectarnosymanipularbasesdedatosutilizandoJDBC.Perolacreacinensdela
base de datos debemos hacerla con la herramienta especfica para ello. Normalmente ser el
administradordelabasededatos,atravsdelasherramientasqueproporcionanelsistemagestor,
el que crear la base de datos. No todos losdriversJDBC soportan la creacin de la base de datos
medianteellenguajededefinicindedatos(DDL).
Normalmente, cualquier sistema gestor de bases de datos incluye asistentes grficos para crear la
basededatosconsustablas,claves(unsubconjuntodelconjuntodeatributoscomunesenunacoleccindeentidades,que
permiteidentificarunvocamentecadaunadelasentidadespertenecientesadichacoleccin),ytodolonecesario.
Tambin, como en el caso deMySQL, o de Oracle, y la mayora de sistemas gestores de bases de
datos, se puede crear la base de datos, desde lalnea de comandos (mtodo que permite a los usuarios dar
instrucciones a algn programa informtico por medio de una lnea de texto simple)deMySQLo de Oracle, con las
sentenciasSQLapropiadas.
VamosutilizarelsistemagestordebasededatosMySQL,porserunproductogratuitoydefciluso,
ademsdemuypotente.

Puedesdescargarteeinstalarlaherramientagrficaquepermiteentreotrascosastrabajar
para crear tablas, editarlas, aadir datos a las tablas, etc., conMySQL. Aqu puedes
descargarlo:
http://www.mysql.com/downloads/workbench

Unavezdescargadoeinstalado,veamoscmocrearpasoapasounesquemadebasede
datos conMySQL WorkBench, para usar en la aplicacin de notaras, y una tabla, la de
clientes.Lopuedesverenlasiguientepresentacin:

CREARTABLASCONMySQL
9 EjecutamosMySQLWorkbenchynos
apareceelinterfazdelaaplicacinconsu
menytresgrandesbloques:SQL
Development,DataModelingyServer
Administration.
9 EnelprimerbloqueseleccionamosNew
Connectionparacrearunanuevaconexin.
9 Laideaesconectarconelservidordebase
dedatosinstaladoennuestroequipooen
otroequipodelared(inclusointernet),

11

DAW

Gestind
debasesded
datosrelacio
onales
napantallap
pidiendolosdatos
9 Nossapareceun
dellaconexin:
9 Nom
mbredelaco
onexin:led
daremosporr
ejem
mploelnom
mbredenotaaria
9 Mtododeconeexin:dejareemosTCP/IP
Ptaly
com
moest.
9 Hosstname:IPonombredellequipo,en
nue
estrocaso,se
ervidorlocall,bastarco
on
pon
nerlocalhosttodejarcom
mopone
127
7.0.0.1
9 Porrt:EselpuerttoTCP/IPqu
ueutilizael
servvidor.Porde
efectoes330
06.Lodejam
mos
tam
mbin.
9 Esquemapordeefecto:elno
ombredel

esquemadonde
eseguardarrnnuestras
tablas.Lodejam
mosenblancco.
botnOk
9 Pulssaremoselb

9 Nossapareceun
napantallacomolainiciaal
peroconlaconexincreada.
9 PincchamosenO
OpenConnecctiontostarrt
que
eringparaab
brirlaconexin.

9 Nossapareceun
napantallad
donde
sele
eccionamosenunalistadesplegable
ela
con
nexinnotaria.
9 Hayydosbotone
es:OkparaaaceptaryCancel
paracancelarlaaoperacin.
Ok.
9 PincchamosenO

9 Apaarecelapanttallapindin
ndonosla
con
ntraseadeu
usuarioadm
ministrador.
9 Selaintroducim
mosypinchaamosenelb
botn
OK..

12

DesarrollodeApllicacionesW
Web

Tema11
1

9 Nosapareceunapan
ntallaconele
esquema
pordefeccto:test.
9 Creamosunnuevoessquemapincchandoen
eliconoaamarilloconformadebaase4de
datosque
eapareceen
nmitaddep
pantalla.

9 Apareceu
unapantallaaquenospid
deel
nombred
delesquemaaypermitesseleccionar
eljuegod
decaracterees.
9 Escribimo
osnotarbdyypulsamose
enelbotn
Apply

9 Apareceu
unapantallaamostrando
ola
sentenciaaSQLqueseevaaejecutaaryconlos
botonesp
paraaplicarllaocancelarrla.
9 Pulsarem
mosenaplicaarlaparacreaarel
esquemaa.

13

DAW

Gestind
debasesded
datosrelacio
onales

9 Apaareceunapaantallaquen
nosinformadel
xittodelaoperracinynospermiteverrel
log..
9 Pincchamosene
elbotnFinishparasalirrde
ellaa.

9 Apaareceunapaantallaconeelnombrede
el
esquemacreadoytresboto
ones:Apply,,
RevvertyClose.
9 PulssamosClose
eparasalirdeestapantaalla

9 Vem
mosenlapantallaqueapareceel
esquemacreado.
9 Enllapartedelaaderechadeelaventana,bajo
ele
esquemavem
mosqueapaareceunacarrpeta
llam
madatables

14

DesarrollodeAplicacionesWeb

Tema11

9 NossituamossobrelacarpetaTablesy
pulsamoselbotnderechodelratn.
9 Apareceunmenyseleccionamosla
primeraopcin(CrearTable)paracrear
nuestratabla.

9 Aparecelapantallaquenospermitecrear
lastablas.
9 Tienevariaspestaasenlaparteinferior,
pordefectoapareceenlapestaaTable.
9 Enlapartedearribaescribiremosel
nombredelatabla:Cliente

9 Pinchandoenlapestaacolumns,podemos
aadirlascolumnasquesemuestran:
idcliente,nif,nombre,apellidos,direccin,
cdigopostal,telfonoycorreoelectrnico.
9 AparecemarcadaidClientepordefecto,
comolaclaveprimaria.
9 PulsamoselbotndeAplicar

15

DAW

Gestind
debasesded
datosrelacio
onales

9 Apaareceunapaantallainform
mndonosd
dela
sentenciaSQLq
quesevaaeejecutarparaa
creaarlatabla.H
Haydosboto
onesparapu
ulsar:
Can
ncelparacan
ncelaroApplySQLpara
efecctuarlacreaacin.
9 PulssaremosApp
plySQL

9 Apaareceunapaantallainform
mndonosd
del
xittodelaoperracinypulssamosFinish
hpara
salirdeella.
9 Lattablasecre
sinproblem
mas

AqupuedesverunvvdeosobrelainstalaciindelabaasededatosOracleExxpressycreacin
detablas.
http
p://www.yo
outube.com
m/watch?feaature=playe
er_embedded&v=H8KiNPpq73o

2.1.LenguajeSQL
L(I).
Cmo le pedimos
p
al Sistema
S
Gesttor de Bases de Datos Relacional (SSGBDR), en concreto en
n este
caso,aldeM
MySQL,quenosproporccionelainforrmacinquenosinteresaadelabased
dedatos?
SeutilizaellenguajeSQ
QL(StructureedQueryLan
nguage)parainteractuarconelSGBD
DR.
SQL es un lenguajenoprocedimen
ntalen el cual se le indica al SGBDR
Rququerem
mos obtener yno
cmohacerrlo.ElSGBDR
Ranalizanueestraordenyysiescorrecctasintcticaamentelaejeecuta.
Elestudiod
deSQLnosllevaramuch
homsque unaunidad,yesobjetodeestudio enotrosm
dulos
de este cicclo formativvo. Pero com
mo resulta imprescindib
ble para po
oder continu
uar, haremos una
mnimaintrroduccinso
obrel.
Loscomand
dosSQLsepu
uedendividirendosgran
ndesgrupos:
9

Los que se utilizaan paradefinir las esttructuras de


e datos, llaamados com
mandosDDL(Data
DefinitionLanguagee).

16

DesarrollodeAplicacionesWeb

Tema11

9 Los que se utilizan paraoperar con los datos almacenados en las estructuras,
llamadosDML(DataManipulationLanguage).
EnlasiguientetablaencontrarsalgunosdeloscomandosSQLmsutilizados.

CREATETABLE

INSERTINTO

DELETE

UPDATE

SELECT

COMANDOSSQLMASUSUALES
Descripcin:
Seutilizaparacrearunatablaespecificandoelnombredelamisma.Alcrear
latablaesnecesarioespecificarcadaunadelascolumnasquelaformanyel
tipodedatocorrespondiente.
Sintaxis:
CREATETABLE<tabla>(
<columna1><tipodedato>,
<columna2><tipodedato>,,
<columnaN><tipodedato>)
Ejemplo:
CREATETABLEempleado(
nombreCHAR(45),f_nacimientoDATE,departamentoNUMBER(2),
salarioNUMBER(6,2))
Descripcin:
Seutilizaparaaadirregistros(filas)aunatabla.
Sintaxis:
INSERTINTO<tabla>VALUES(
<valorcolumna1>,
<valorcolumna2>,,
<valorcolumnaN>)
Ejemplo:
INSERTINTOempleadoVALUES(JosGmez,10/02/1977,15,1200.00)
Descripcin:
Seutilizaparaborrarregistros(filas)deunatabla.
Sintaxis:
DELETEFROM<tabla>WHERE<condicin>
Ejemplo:
DELETEFROMempleadoWHEREnombre=JosPrez)
Descripcin:
Seutilizaparamodificardatosdeunatabla.
Sintaxis:
UPDATE<tabla>SET<columna>=<expresin>WHERE<condicin>
Ejemplo:
UPDATEempleado
SETsalario=salario+100
WHEREnombre=JosNavarro;
Descripcin:
Seutilizaparalistarunconjuntodedatosdeunaovariastablas.
Habitualmenteseasociaalasconsultassobrelabasededatos.
Sintaxis:
SELECT<listadecolumnas>FROM<tabla>WHERE<condicin>
Ejemplo:
SELECTnombre,salarioFROMempleadoWHEREsalario>1000;
Listanombreysalariodetodoslosempleadosquecumplenlacondicin,es
decir,cuyosalarioessuperiora1000.

17

DAW

Gestindebasesdedatosrelacionales

EnesteenlaceencontrarsdeunamanerabreveperointeresantelahistoriadelSQL
http://www.htmlpoint.com/sql/sql_04.htm
Con las consultas SQL hay que especificar paso a paso cmo recuperar cada dato de la
base de datos.
Verdadero

Falso

Bastacondecirlequdatosqueremosyelsistemagestorseencargadeobtenerlos

2.1.1.LenguajeSQL(II).
La primera fase del trabajo con cualquier base de datos comienza con sentencias DDL, puesto que
antesdepoderalmacenaryrecuperarinformacindebemosdefinirlasestructurasdondeagruparla
informacin.LasestructurasbsicasconlasquetrabajaSQLsonlastablas.
Comohemosvistoantes,unatablaesunconjuntodeceldasagrupadasenfilasycolumnasdondese
almacenanelementosdeinformacin.
Antesdellevaracabolacreacindeunatablaconvieneplanificar:nombredelatabla,nombrede
cada columna, tipo y tamao de los datos almacenados en cada columna, informacin adicional,
restricciones,etc.
Hayquetenerencuentatambinciertasrestriccionesenlaformacindelosnombresdelastablas:
longitud.Normalmente,aunquedependendelsistemagestor,sueletenerunalongitudmximade
30 caracteres, no puede haber nombres de tabla duplicados, deben comenzar con un carcter
alfabtico,permitircaracteresalfanumricosyelguinbajo'_',ynormalmentenosedistingueentre
maysculasyminsculas.
Porejemploparacrearunatabladedepartamentospodramoshacer:
CREATE TABLE departa (
cod_dep number(3),
nombre varchar2(15) not null,
loc varchar2(10),
constraint dep_pk primary key (cod_dep),
constraint dep_loc check
(loc in ('Madrid', 'Barcelona', 'Murcia'))
);

donde creamos la tabla con cod_dep como clave primaria. Adems, se aade una restriccin para
comprobar que cuando se est dando de alta un registro, lo que se escriba en el campo loc sea
Madrid,BarcelonaoMurcia.
Yunatabladeempleados,teniendoencuentaeldepartamentoenelquetrabajen:
CREATE TABLE emp (
cod_emp number(3),
nombre varchar2(10) not null,
oficio varchar2(11),
jefe number(3),
fecha_alta date,
salario number(10),
comision number(10),
cod_dep number(3),
constraint emp_pk primary key (cod_emp),
constraint emp_fk foreign key (cod_dep) references departa(cod_dep)
on delete cascade,
constraint emp_ck check (salario > 0)
);

En el caso de esta tabla, se puede ver que hay una restriccin para comprobar que el salario sea
mayorque0.

18

DesarrollodeAplicacionesWeb

Tema11

3.Establecimientodeconexiones.
Caso prctico
Tanto Juan como Mara saben que trabajar con bases de datos relacionales en Java es
tremendamente sencillo, por lo que establecer una conexin desde un programa en Java, a una base
de datos, es muy fcil.
Juan le comenta a Mara: -Empleando la tecnologa slo necesitamos dos simples sentencias Java
para conectar la aplicacin a la base de datos. Mara, preprate que en un periquete tengo lista la
conexin con la base de datos y salimos a tomar un caf.

Cuandoqueremosaccederaunabasededatosparaoperarconella,loprimeroquehayquehaceres
conectarseadichabasededatos.
En Java, para establecer una conexin con una base de datos podemos utilizar el
mtodo getConnection() de la clase DriverManager . Este mtodo recibe como parmetro la URL de
JDBCqueidentificaalabasededatosconlaquequeremosrealizarlaconexin.
Laejecucindeestemtododevuelveunobjeto Connection querepresentalaconexinconlabase
dedatos.
Cuando se presenta con una URL especfica, DriverManager itera sobre la coleccin
dedriversregistrados hasta que uno de ellos reconoce la URL especificada. Si no se encuentra
ningndriveradecuado,selanzauna SQLException .
Veamosunejemplocomentado:
public static void main(String[] args) {
try {
// Cargar el driver de mysql
Class.forName("com.mysql.jdbc.Driver");
// Cadena de conexin para conectar con MySQL en localhost,
//seleccionar la base de datos llamada test
// con usuario y contrasea del servidor de MySQL: root y admin
String connectionUrl = "jdbc:mysql://localhost/test?" +
"user=root&password=admin";
// Obtener la conexin
Connection con = DriverManager.getConnection(connectionUrl);
} catch (SQLException e) {
System.out.println("SQL Exception: "+ e.toString());
} catch (ClassNotFoundException cE) {
System.out.println("Excepcin: "+ cE.toString());
}
}

SiprobamosesteejemploconNetBeans,ocualquierotroentorno,ynohemosinstaladoelconector
paraMySQL, en la consola obtendremos el mensaje: Excepcin:java.lang.ClassNotFoundException:
com.mysql.jdbc.Driver.

3.1.Instalarelconectordelabasededatos.
En la siguiente tabla vamos a ver cmo descargarnos el conector odriverque necesitamos para
trabajar conMySQL. Como vers, tan slo consiste en descargar un archivo, descomprimirlo y
desdeNetBeansaadirelfichero.jarqueconstituyeelconectorquenecesitamos.
INSTALARCONECTORJDBCPARAMySQL

19

DAW

Gestind
debasesded
datosrelacio
onales

9 Conelnaveegadoracced
demosala
direccin:
9

http://www.m
mysql.com/dow
wnloads/conector/j/

9 Pulsaremossenelbotn
nazulDownlo
oad
quesevealaderechad
delapantallaa.
Estdisponibleen.zipyyen.tar

9 Enlapantallaqueapareecepincham
mosen
lapartedeabajoparap
poderselecciionar
losservidorresdedescarrgadondese
e
alojaelconectorJDBC

9 Elegimosun
nodelosserrvidoresque
aparecenypinchamoseenFTPque
aparecealaaderechadeelapantalla

9 Unavezdesscargadoyd
descomprimidoel
archivo,nossfijamosenelficheroqu
ue
nosinteresaaqueesel.jjarqueapare
ece
sealadoen
nlaimagen

20

DesarrollodeApllicacionesW
Web

Tema11
1

9 EnNeetBeans,situ
undonosen
nelnombre
delproyectopulssamoselbotnderecho
delraatn
9 Enelmenconteextualqueap
parece
selecccionamosPrroperties.

9 SelecccionamosellnododelassLibreras
delproyecto
hamosenelbotnJAR/Folder
9 Pinch
9 Buscaamosyelegimoselfichero
comeentadoanterriormente,el.jar

9 TanssoloquedapulsarOkyhe
emos
acabaado

Portaanto,comoyyahemosco
omentadoan
nteriormente
e,entreelprrogramaJavayelSistem
maGestordee
la Baase de Datos (SGBD) see intercala el
e conector JDBC. Este conector ess el que implementa laa
funcionalidadde lasclasesdeaccesoad
datosyprop
porcionalaccomunicacinentreelA
APIJDBCyell
D.
SGBD
Lafun
ncindelcon
nectorestraaducirloscom
mandosdelA
APIJDBCalp
protocolonaativodelSGB
BD.

21

DAW

Gestindebasesdedatosrelacionales

3.2.RegistrarelcontroladorJDBC.
Al fin y al cabo ya lo hemos visto en el ejemplo de cdigo que ponamos antes, pero incidimos de
nuevo.Registrarelcontroladorquequeremosutilizarestanfcilcomoescribirunalneadecdigo.
Hayqueconsultarladocumentacindelcontroladorquevamosautilizarparaconocerelnombrede
laclasequehayqueemplear.EnelcasodelcontroladorparaMySQLes" com.mysql.jdbc.Driver ",o
sea,quesetratadelaclase Driver queestenelpaquete com.mysql.jdbc delconectorquehemos
descargado,yquehasobservadoquenoesmsqueunalibreraempaquetadaenunfichero.jar.
Lalneadecdigonecesariaenestecaso,enlaaplicacinJavaqueestemosconstruyendoes:
// Cargar el driver de mysql
Class.forName("com.mysql.jdbc.Driver");

Unavezcargadoelcontrolador,esposiblehacerunaconexinalSGBD.
Hay que asegurarse de que sinoutilizramosNetBeansuotroIDE,paraaadirel.jarcomohemos
visto,entonceselarchivo.jarquecontieneelcontroladorJDBCparaelSGBDhabraqueincluirloen
el CLASSPATH que emplea nuestra mquina virtual, o bien en el directorio ext delJREde nuestra
instalacindelJDK.
Hay una excepcin en la que no hace falta ni hacer eso: en caso de utilizar un acceso mediante
puenteJDBCODBC,yaqueesedriverestincorporadodentrodeladistribucindeJava,porloque
noesnecesarioincorporarloexplcitamenteenelclasspath(variabledeentornoqueindicaalamquinavirtualde
Java dnde buscar las clases definidas por el usuario y los paquetes cuando se ejecutan los programas Java)de una aplicacin
Java.Porejemplo,seraelcasodeaccederaunabasededatosMicrosoftAccess.

22

DesarrollodeAplicacionesWeb

Tema11

4.Ejecucindeconsultassobrelabasededatos.
Caso prctico
Ada est echando una mano a Juan y Mara en la creacin de consultas, para los informes que la
aplicacin de notara debe aportar a los usuarios de la misma.
Hacer consultas es una de las facetas de la programacin que ms entretiene a Ada, le resulta muy
ameno y fcil. Adems, y dada la importancia del proyecto, cuanto antes avancen en l, mucho mejor.
Por suerte, los tres: Ada, Mara y Juan tienen experiencia en consultas SQL y saben que, cuando se
hace una consulta a una base de datos, hay que afinar y hacerla lo ms eficiente posible, pues si se
descuidan el sistema gestor puede tardar mucho en devolver los resultados. Adems, algunas
consultas pueden devolver un conjunto de registros bastante grande, que puede resultar difcil de
manejar desde el programa, ya que por norma general tendremos que manejar esos datos registro a
registro.

Para operar con una base de datos ejecutando las consultas necesarias, nuestra aplicacin deber
hacerlasoperacionessiguientes:
9
9
9
9
9

Cargarelconectornecesarioparacomprenderelprotocoloqueusalabasededatosencuestin.
Establecerunaconexinconlabasededatos.
EnviarconsultasSQLyprocesarelresultado.
Liberarlosrecursosalterminar.
Gestionarloserroresquesepuedanproducir.

Podemosutilizarlossiguientestiposdesentencias:
9
9
9

Statement :parasentenciassencillasenSQL.
PreparedStatement :paraconsultaspreparadas,comoporejemplolasquetienenparmetros.
CallableStatement :paraejecutarprocedimientosalmacenadosenlabasededatos.

ElAPIJDBCdistinguedostiposdeconsultas:
9

Consultas: SELECT . Para las sentencias de consulta que obtienen datos de la base de datos, se
emplea el mtodo ResultSet executeQuery(String sql) . El mtodo de ejecucin del comando
SQL devuelve un objeto de tipo ResultSet que sirve para contener el resultado del comando
SELECT ,yquenospermitirsuprocesamiento.
9 Actualizaciones: INSERT , UPDATE , DELETE , sentencias DDL. Para estas sentencias se utiliza el
mtodo executeUpdate(String sql)

Para poder enviar consultas a la base de datos hemos tenido que conectarnos a ella
previamente.
Verdadero

Falso

Ases,hayquecargareldriveryestablecerlaconexin

4.1.Recuperacindeinformacin(I).
Las consultas a la base de datos se realizan con sentencias SQL que van"embebidas"en otras
sentencias especiales que son propias de Java. Por tanto, podemos decir que las consultas SQL las
escribimos como parmetros de algunos mtodos Java que reciben el String con el texto de la
consultaSQL.
Lasconsultasdevuelvenun ResultSet ,queesunaclasejavaparecidaaunalistaenlaquesealojael
resultadodelaconsulta.Cadaelementodelalistaesunodelosregistrosdelabasededatosque
cumpleconlosrequisitosdelaconsulta.
El ResultSet nocontienetodoslosdatos,sinoquelosvaobteniendodelabasededatossegnse
vanpidiendo.Larazndeestoesevitarqueunaconsultaquedevuelvaunacantidadmuyelevadade
registros,tardemuchotiempoenobtenerseysaturelamemoriadelprograma.

23

DAW

Gestindebasesdedatosrelacionales

Conel ResultSet haydisponiblesunaseriedemtodosquepermitenmovernoshaciadelanteyhacia


atrsenlasfilas,yobtenerlainformacindecadafila.
Porejemplo,paraobtener:nif,nombre,apellidosytelfonodelosclientesqueestnalmacenados
enlatabladelmismonombre,delabasededatosnotarbdquesecreanteriormente,haramosla
siguienteconsulta:
// Preparamos la consulta y la ejecutamos
Statement s = n.createStatement();
ResultSet rs = s.executeQuery ("SELECT NIF, NOMBRE,"
+ "APELLIDOS, TELFONO FROM CLIENTE");

Elmtodo next() del ResultSet hacequedichopunteroavancealsiguienteregistro.Siloconsigue,el


mtodo next() devuelve true . Si no lo consigue, porque no haya ms registros que leer, entonces
devuelve false .

Puedesconsultartodoslosmtodosquesoporta ResulSet ,ademsdemsinformacin,en


ladocumentacindeOracle:
http://download.oracle.com/javase/1.4.2/docs/api/java/sql/ResultSet.html

4.1.1.Recuperacindeinformacin(II).
Elmtodo executeQuery devuelveunobjeto ResultSet parapoderrecorrerelresultadodelaconsulta
utilizandouncursor(estaformadoporunconjuntoderegistrosdevueltosporunainstruccinSQLdetipoSELECT).
Paraobtenerunacolumnadelregistroutilizamoslosmtodos get .Hayunmtodo get ...paracada
tipobsicoJavayparalascadenas.
Un mtodo interesante es wasNull que nos informa si el ltimo valor ledo con un mtodogetes
nulo.
Cuando trabajamos con el ResultSet , en cada registro, los mtodos getInt() , getString() ,
getDate() , etc., nos devuelve los valores de los campos de dicho registro. Podemos pasar a estos
mtodos un ndice (que comienza en 1) para indicar qu columna de la tabla de base de datos
deseamos,obien,podemosusarun String conelnombredelacolumna(talcualestenlatablade
basededatos).
// Obtener la conexin
Connection con = DriverManager.getConnection(connectionUrl);
// Preparamos la consulta
Statement s = con.createStatement();
ResultSet rs = s.executeQuery ("SELECT NIF, NOMBRE,"
+ "APELLIDOS, TELFONO FROM CLIENTE");
// Iteramos sobre los registros del resultado
while (rs.next())
System.out.println (rs.getString("NIF") + " " +
rs.getString (2) + " " +
rs.getString (3) + " " +
rs.getString (4)) ;

Para obtener un entero almacenado en uno de los campos de un registro, trabajando con
el ResulSet emplearemos el mtodo getInt().

Verdadero

Esoes.HayungetString()paracadenas,getDate()parafechas,etc.

24

Falso

DesarrollodeAplicacionesWeb

Tema11

4.2.Actualizacindeinformacin.

Respectoalasconsultasdeactualizacin, executeUpdate ,retornanelnmeroderegistrosinsertados,


registrosactualizadosoeliminados,dependiendodeltipodeconsultaquesetrate.
SupongamosquetenemosvariosregistrosenlatablaCliente,delabasededatosnotarbdconlaque
seguimostrabajando.Siquisiramosactualizareltelfonodeltercerregistro,quetieneidCLIENTE=3
yponerlecomonuevotelfonoel968610009tendramosquehacer:
String connectionUrl = "jdbc:mysql://localhost/notarbd?" +
"user=root&password=admin";
// Obtener la conexin
Connection con = DriverManager.getConnection(connectionUrl);
// Preparamos la consulta y la ejecutamos
Statement s = con.createStatement();
s.executeUpdate("UPDATE CLIENTE SET telfono='968610009' WHERE idCLIENTE=3");
// Cerramos la conexin a la base de datos.
con.close();

4.3.Adicindeinformacin.
SiqueremosaadirunregistroalatablaCliente,delabasededatosconlaqueestamostrabajando
tendremos que utilizar la sentencia INSERT INTO de SQL. Al igual que hemos visto en el apartado
anterior, utilizaremos executeUpdate pasndole como parmetro la consulta, de insercin en este
caso.
As,unejemplosera:
// Preparamos la consulta y la ejecutamos
Statement s = con.createStatement();
s.executeUpdate( "INSERT INTO CLIENTE" +
" (idCLIENTE, NIF, NOMBRE, APELLIDOS, DIRECCIN, CPOSTAL, TELFONO, CORREOELEC)" + " VALUES
(4,
'66778998T',
'Alfredo',
'Gates
Gates',
'C/
Pirata
23','20400',
'891222112',
'prueba@eresmas.es' )") ;

Al aadir registros a una tabla de una base de datos, tenemos que pasar como
parmetro al executeUpdate(), una sentencia SQL del tipo: DELETE...

Verdadero

Falso

SeledebepasarunasentenciadetipoINSERTINTO

4.4.Borradodeinformacin.
Cuandonosintereseeliminarregistrosdeunatabladeunabasededatos,emplearemoslasentencia
SQL: DELETE .As,porejemplo,siqueremoseliminarelregistroalatablaCliente,denuestrabasede
datosycorrespondientealapersonaquetieneelnif:66778998T,tendremosqueutilizarelcdigo
siguiente.
// Preparamos la consulta y la ejecutamos
Statement s = con.createStatement();
numReg = res.executeUpdate( "DELETE FROM CLIENTE WHERE NIF= '66778998T' " );
// Informamos del nmero de registros borrados
System.out.println ("\nSe borr " + numReg + " registro\n") ;

25

DAW

Gestindebasesdedatosrelacionales

Al ejecutar el borrado de un registro mediante executeUpdate(), no podemos saber si


el borrado elimin alguna fila o no.

Verdadero

Falso

Efectivamentepodemossaberloporquesedevuelveelnmeroderegistrosborrados,comohemosvistoenelcdigodelejemplo
anterior

4.5.Cierredeconexiones.
Lasconexionesaunabasededatosconsumenmuchosrecursosenelsistemagestorporendeenel
sistema informtico en general. Por ello, conviene cerrarlas con el mtodo close() siempre que
vayanadejardeserutilizadas,enlugardeesperaraqueelgarbagecollectordeJavalaselimine.
Tambin conviene cerrar las consultas ( Statement y PreparedStatement ) y los resultados ( ResultSet )
paraliberarlosrecursos.

Noblecosaes,aunparaunanciano,elaprender.
Sfocles.

EnelsiguienteenlacepuedesvercmoserealizaunagestindelaconexinconOracle,
desde el registro del conector hasta el cierre de la misma. Tambin se comenta
sobreMySQL.
http://casidiablo.net/javadatabaseconnectivity/

4.6.Excepciones.
Entodaslasaplicacionesengeneral,yportantoenlasqueaccedenabasesdedatosenparticular,
nospuedeocurrirconfrecuenciaquelaaplicacinnofunciona,nomuestralosdatosdelabasede
datosquedesebamos,etc.
Es importante capturar las excepciones que puedan ocurrir para que el programa no aborte de
manera abrupta. Adems, es conveniente tratarlas para que nos den informacin sobre si el
problema es que se est intentando acceder a una base de datos que no existe, o que el
servicioMySQLnoestarrancado,oquesehaintentadohaceralgunaoperacinnopermitidasobre
labasededatos,comoaccederconunusuarioycontraseanoregistrados,...
Por tanto es conveniente emplear el mtodo getMessage() de la clase SQLException para recoger y
mostrar el mensaje de error que ha generadoMySQL, lo que seguramente nos proporcionar una
informacinmsajustadasobreloqueestfallando.
Cuandoseproduceunerrorselanzaunaexcepcindeltipo java.sql.SQLException .
9

Es importante quelas operaciones de acceso a base de datosestndentro de un bloque trycatch quegestionelasexcepciones.


9 Losobjetosdeltipo SQLException tienendosmtodosmuytilesparaobtenerelcdigodelerror
producidoyelmensajedescriptivodelmismo, getErrorCode() y getMessage() respectivamente.
Elmtodo getMessage() imprimeelmensajedeerrorasociadoalaexcepcinquesehaproducido,
queaunque esteningls,nosayudaasaberquhageneradoelerrorquecauslaexcepcin.El
mtodo getErrorCode() , devuelve un nmero entero que representa el cdigo de error asociado.
Habrqueconsultarenladocumentacinparaaveriguarsusignificado.

26

DesarrollodeAplicacionesWeb

Tema11

El cierre de las conexiones y la gestin de excepciones slo hay que efectuarla con bases
de datos MySQL.

Verdadero

Falso

EnelsiguienteenlacepuedesvermssobrelasexcepcionesenJava.
http://zarza.usal.es/~fgarcia/doc/tuto2/II_8.htm

27

S-ar putea să vă placă și