Libro JAVA 2.pdf

ciacion Actualizado a J2SE 5.0 Conceptos fundamentales del lenguaje Programación orientada a objetos Subprocesos Aplica

Views 70 Downloads 0 File size 66MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

ciacion Actualizado a J2SE 5.0

Conceptos fundamentales del lenguaje Programación orientada a objetos Subprocesos Aplicaciones GUI Acceso a base de datos Uso de sochets

AppletsyJSP

-

Código fuente de este libro disponible en el sitio web de www.inforbooks.oonn

Edgar D'Andrea f 'I

Java 2 Curso de Iniciación

Edgar D'Andrea

Java 2, Curso de iniciación © Edgar D'Andrea © De la edición: INFORBOOK'S, S.L. Se ha puesto el máximo interés en ofrecer al lector una información completa y precisa. Sin embargo, INFORBOOK'S, S.L. no asume ninguna responsabilidad derivada de uso, ni tampoco por cualquier violación de patentes y otros derechos de terceras partes que pudie ran ocurrir estando este libro destinado a la utilización de aficionados o a la enseñanza. Las

marcas o nombres mencionados lo son únicamente a título informativo, siendo propiedad de sus legales registradores. Reservados todos los derechos.

Ninguna parte de este libro puede ser reproducida, grabada en sistema de almacena miento o transmitida en forma alguna ni por cualquier procedimiento, ya sea electrónico, mecánico, reprográfico, magnético o cualquier otro. Asimismo queda prohibida la distribu ción, alquiler, traducción o exportación sin la autorización previa y por escrito de INFORBOOK'S, S.L.

Editado por:INFORBOOK'S, S.L. c/ Muntaner, 181 08036 BARCELONA 934 391 575

email: [email protected] web: http://www.inforbooks.com ISBN: 84-96097-66-8

Depósito legai: B-30313-2006 Diseño cubierta: ABISA

IMPRESO EN ESPAÑA - PRINTED IN SPAIN

CONSULTE NUESTRO CATÁLOGO POR INTERNET: http://www.inforbooks.com

Dedico este libro a mi esposa Susana

y a mis hijos lUdael, Cecilia, Inés y Lucía.

/

El contenido de un vistazo

1:

Introducción

17

2:

Programación orientada a objetos

31

3:

Conceptos básicos de diseño

43

4:

JDK - Java Development Kit

51

5:

IDE NetBeans

67

6:

Variables y constantes

105

7:

Sentencias dellenguaje

135

8:

Clases,interfaces y paquetes

149

9:

Cadenas, matrices y fechas

203

10:

Gestión de excepciones

253

11:

Entrada-Salida

265

12:

Interfaz gráfica de usuario

299

13:

Componentes GUI

329

14:

Componentes Swing

393

15:

Subprocesos (Threads)

433

16:

Bases de datos

467

17:

Appletsy JSP

487

18:

Redes

509

19:

JavaMaU y XML

527

Contenido Capítulo 1: Introducción

17

Objetivo del libro

17

Estructura del libro

18

El lenguaje Java

20

Para los programadores C/C++ Tipos de datos Convenciones de estilo utilizadas en el libro

25 26

28

Código fuente del libro, erratas y actualizaciones

29

Cómo comunicarse con el autor

30

Capítulo 2:

Programación orientada a objetos

31

Terminología de la programación orientada a objetos

31

Propiedades y métodos Comunicación entre objetos

33 37

Clases

37 38

Accesibilidad

Creación de ejemplares de una clase

39

Herencia

39

Jerarquía de clases

41

Capitulo 3: Conceptos básicos de diseño

43

Applets Diseño previo Poniéndose en el lugar del usuario

44 44 45

Ratón

45

Teclado

46

Fuentes

46

Los límites del ancho de banda

46

■>'

8

Java 2. Curso de iniciación

Sonido

47

Gráficos Las imágenes y la plataforma Tiempo de procesamiento La animación y el procesamiento

47 48 49 49

Piense, piense, piense luego codifíque

50

Capítulo 4: JDK - Java Developrnent Kit

51

Instalación en Windows

52

Instalación en Solaris (SPARC) Instalación en Solaris (x86)

52 53

Instalación en Linux

53

Documentación del JDK

54

Herramientas básicas del JDK

54

Compilación de Java

55

Edición del código fuente Compilación y ejecución desde la línea de comandos Opciones del compilador Ejemplos de compilación Variable de entorno Classpath Compilación con un IDE Ejecución de aplicaciones Java desde la línea de comandos Ejecución de applets con el visor de applets

55 56 57 59 60 61 62 65

Capítulo 5: IDE NetBeans 67 Creación de un proyecto de aplicación Java paso a paso....68 Classpath con el IDE Edición de código de la clase Argumentos para la ejecución en entorno de prueba Ejecución del proyecto principal

72 75 79 80

Creación de un proyecto Web Java paso a paso

81

Registro del servidor Proyecto de aplicación Web Creación de un componente Java y de una componentejavaBeans

81 83 85

Indice de contenido

"

Edición del componente Edición de la páginajsp predeterminada Creación de una nueva páginajsp Generación y ejecución de la aplicación Web

87 90 91 93

Asistentes de proyectos NetBeans

94

Categoría General Categoría Web Categoría Enterprise Asistentes de archivos de NetBeans Nueva clase Java(New Java Class) Nueva aplicación Java (New Java Aplication) Nueva clase principal(New Main Class)

94 95 95 95 96 96 99

Capítulo 6: Variables y constantes

105

Tipos de datos

106

Valores

106

Tipos y valores primitivos

107

Generación de un proyecto para los ejemplos

108

Declaración de variables

111

Declaración de constantes

112

Nomenclatura de las variables Acceso de una variable Ambito de una variable

113 114 115

Operadores Java Precedencia de operadores

117 124

Conversiones de tipos primitivos

125

Conversiones explícitas (cast) Conversiones implícitas a cadena Conversiones implícitas de menor a mayor Promoción numérica implícita Conversión implícita para invocación a un método Prácticas Respuestas a las prácticas

126 129 130 131 131 132 132

10

Java 2. Curso de iniciación

Capítulo 7: Sentencias del lenguaje

135

if-else

136

switch

138

while

139

do

140

for

141

Etiquetas

142

break

142

continué

145

return

146

Prácticas Respuesta a las preguntas

147 148

Capítulo 8:

Clases, Interfaces y Paquetes Declaración de una clase Modificadores

149 150 154

extends

154

implements Uso de modificadores Cuerpo de la clase Uso de un objeto

155 156 160 168

Clases interiores

169

Interfaces Creación de una interfaz Uso de una interfaz

170 170 173

Paquetes

174

Acceso a las clases de los paquetes Archivos JAR Clase Object

174 175 177

Algunas de las clases de Java

Paquetes en mayor detalle Subpaquetes

777

189 192

índice de contenido Paquetes según su funcionalidad Documentación con Javadoc Prácticas Respuestas a las preguntas

11 198 199 200 201

Capítulo 9:

Cadenas, matrices y fechas String

203 204

Constructores de la clase String Métodos de la clase String

206 207

Escapes de cadena

224

StringBuffer Constructores de la clase StringBuffer Métodos de la clase StringBuffer

225 225 226

StringBuilder

236

Matrices

237

Declaración de una matriz

238

Asignación de valores en una matriz Recuperación de valores de una matriz

238 239

Matrices de dos dimensiones

240

Vector

241

Enumeraciones

242

StringTokenizer

243

Fechas y horas Clase Date Clase Calendar

Conversión String a Date Práctica Respuestas a las preguntas

Capítulo 10: Gestión de excepciones ¿Qué se hace con las excepciones generadas?

244 245 246

249 250 251

253 254

Clase Throwable

254

Captura de excepciones Pila de llamadas (stack)

257 260

12

Java 2. Curso de iniciación

Creación de una clase Exception personalizada Práctica

Respuestas a las preguntas

261 263

263

Capítulo 11: Entrada-Salida Streams

InputStream Clases derivadas de InputStream Ejemplo de uso deflujos de datos de entrada OutputStream Clases derivadas de OutputStream Ejemplo de uso deflujos de datos de salida

Flujos de caracteres

265 266

267 268 269 272 274 274

277

Reader

277

Clases derivadas de Reader

278

Ejemplo de uso deflujos de caracteres de entrada

279

Writer

280

Clases derivadas de Writer

282

Ejemplo de uso deflujos de caracteres de salida Interrelación entre bytes y caracteres

289 284

Sistema de archivos y directorio Métodos de la clase File

Señalización

285 285

289

La clase serializable

290

Una aplicación usuaria que serializa Una aplicación usuaria que deserializa

291 292

Excepciones

292

Práctica

294

Respuestas a las preguntas

Capítulo 12: Interfaz gráfica de usuario Aplicación gráfíca básica Métodos y propiedades heredados dejava.awt.Frame Métodos heredados dejava.awt Window Métodos heredados dejava.awt.Container

295

299 300 301 302 302

índice de contenido Métodos y propiedades heredados dejava.awtComponent Métodos heredados dejava.lang.Object Desarrollo de la primera aplicación con ventana Distribución de los componentes en el contenedor Práctica Respuestas a las preguntas

Capítulo 13: Componentes GUI Por dónde empezar Paquete java.awt y javax.swing Clase Component

13 303 304 305 310 327 328

329 330 331 332

Clase Button Clase Checkbox Clase Cholee Clase List

335 339 343 347

Clase Scrollbar Clase Label

353 357

Clase TextComponent

357

Clase TextField

358

Clase TextArea Clase Canvas

364

Contenedores Clase Panel Clase Window Clase Frame

Clase Dialog Clases para menús Práctica Respuestas a las preguntas

Capítulo 14: Componentes Swing

361

365 365 369 373

374 378 383 384

393

Resumen de clases Swing Paquetes Swing

395 397

Clase AbstractButton

398

14

Java 2. Curso de iniciación

Menús en el paquete swing

420

ToolTips

424

Práctica Respuestas a las preguntas

426 427

Capítulo 15:

Subprocesos(Threads)

433

Uso de subprocesos

434

Características de los subprocesos Subprocesos agrupados Los problemas de sincronización Clase Thread

436 439 439 440

Constructores de la clase Thread

440

Principales métodos de la clase Campos de la clase Thread Ciclo de vida del objeto Thread.

441 443 443

Uso de subprocesos

444

Cuatro subprocesos paralelos(con clase Thread) Cuatro subprocesos paralelos (con interfaz Runnable) Detención segura de un subproceso Join() de subprocesos ¿Quépuede pasar por no sincronizar? Primera ejecución (ConjoinO) Segunda ejecución (sin join()) Un cajero sincronizado Práctica Respuestas a las preguntas

444 446 448 451 454 454 457 460 464 464

Capítulo 16: Bases de datos Conceptos básicos sobre base de datos

467 468

Tablas

469

Campos

471

Sistemas de gestión de base de datos Bases de datos relaciónales Guía de normalización de base de datos

Java y los SGBD

472 472 473

474

índice de contenido Controladores JDBC Conexión a una base de datos

Práctica Respuestas a las preguntas

Capítulo 17: Applets y JSP Aplicación o Applet Composición de un applet Clase Applet Clase JApplet Un applet básico

15 475 475

483 484

487 488 489 489 492 493

Creación de applets con NetBeans

495

Creación del archivo de código del applet Modificación de los parámetros del applet Inclusión del applet en una aplicación Web Creación y ejecución de un archivo JSP

495 502 502 505

JSP (Java Server Pages)

506

Práctica Respuestas a las preguntas

507 507

Capítulo 18: Redes

509

Las comunicaciones en Internet

510

Sockets

512

Clase InetAddress

512

Conexión cliente-servidor

514

Errores de red

516

Programa cliente con la clase Socket Programa servidor con la clase ServerSocket

516 519

Servidores y subprocesos

522

Práctica Respuestas a las preguntas

524 525

16

Java 2. Curso de iniciación

Capítulo 19: JavaMaíl y XML

527

Instalación del Paquete JavaMaíl

528

Uso de paquetes externos con NetBeans JavaMail

529 530

Clase Session

531

Clase Message Clases Folder y Store Clase Transport

532 532 533

Clase Address

533

Clase BodyPart Resumen de pasos para el uso de la API JavaMail Envío de email con JavaMaíl

533 533 534

Recepción de email con JavaMail

536

XML Ejemplo de serialización XML Práctica Respuestas a las preguntas

538 538 541 541

índice

543

Introducción

CA|ritMlo

1 Contenido:



Objetivo y estructura del libro



Principales características de Java



Comparación con C/C++

Objetivo del libro Este libro se ha diseñado como un curso de iniciación al lenguaje Java, con la teoría necesaria y, luego de expuestos los conceptos teóricos, con abundante prác tica, especialmente a partir del capítulo en que se comienza de lleno con el lengua je, y trata de todos sus aspectos fundamentales: concepto de la programación orien tada a objetos, estructura y sintaxis del lenguaje, desarrollo applets y servlets para páginas Web, programación de aplicaciones Java, uso del IDE NetBeans para ace lerar el proceso de desarrollo, acceso a bases de datos con JBDC, uso de subprocesos, desarrollo de servidores y clientes de red y comunicaciones en red, es decir, todo lo necesario para que el lector pueda dominar rápidamente al lengua je actualmente más solicitado dentro del ámbito laboral informático.

Queremos que este sea un libro práctico, por ese motivo a partir del capítulo 6 se incluye una sección de Prácticas en la que se debe comprobar si se han enten dido los aspectos teóricos.

18

Java 2. Curso de iniciación

Estructura del libro ■

Capítulo 1 Introducción. Es un capítulo en el que se expliea la estructura general del libro y se realiza una definición general del lenguaje de programación Java.



Capítulo 2 Programación orientada a objetos. Aunque se intenta entrar en los aspectos prácticos lo más pronto posible es imprescindible tra tar el tema de la POO para que el lector adquiera los coneeptos básicos necesarios para enfrentarse a un lenguaje en el que todo son objetos.



Capitulo 3 Conceptos básicos sobre diseño de programas. Éste es un capitulo corto y de rápida leetura especialmente dedicado para los lectores que no han tenido experiencias en el diseño de progra mas. Los programadores que ya hayan programado en otros len guajes podrían saltarse este capitulo, aunque deben tener en euenta que nunca viene mal un repaso de ciertos eonceptos básieos.



Capitulo 4 JDK - Java Development Kit. No podemos comenzar a pro gramar si no tenemos instaladas las herramientas básieas y el compilador del lenguaje. En este capitulo se explica cómo instalar y cómo empezar a utilizar el JDK.



Capitulo 5 IDE NetBeans. Casi con seguridad no programaremos utilizan do simplemente un editor de texto para introdueir el eódigo fuente y tampoco utilizaremos el compilador desde la linea de comandos, especialmente después de conocer la potencia y las funcionalidades de NetBeans, un IDE gratuito y de fáeil uso.



Capitulo 6 Variables y constantes. Éste es realmente el primer capitulo sobre el lenguaje de programaeión. Lo siento pero no podíamos obviar los capítulos anteriores pero es aquí en donde empieza la tarea de programación. Los tipos de datos representan un aspecto funda mental y este capitulo está dedicado a este tema.



Capitulo 7 Sentencias del lenguaje. Para trabajar eon los datos explicados en el capitulo previo se precisan instrucciones, estructuras de control

de flujo y de bucles. Éste es el tema de este capitulo: las instruc ciones del lenguaje Java.



Capitulo 8 Clases, interfaces y paquetes. En Java todos son objetos, los objetos pertenecen a una clase. En este capitulo se aprenderá a crear clases, definir métodos y propiedades y a utilizar los objetos creados apartir de las clases definidas.

Introducción

19

Capítulo 9 Cadenas, matrices y fechas. En Java las cadenas son objetos definidos por la clase String y por lo tanto eon métodos diseñados para su creación y manipulación, como cualquier otra clase en la POO.Dada su importancia, a la clase String le dedicamos casi un capítulo; el resto del capítulo está dedicado a las matrices y a los vectores.

Capítulo 10 Gestión de excepciones. Java gestiona las excepciones mediante una estructura try-catch-finally. Cuando se genera una excepción,

el tiempo de ejecución recibe una indicación que se ha produeido una situación excepcional, en este eapítulo aprenderemos a defi nir, detectar y gestionar excepciones.

Capitulo 11Entrada y Salida. Éste es otro capítulo fundamental: debemos aprender a gestionar los flujos de datos, que se transmiten tanto desde arehivos o desde una red, y también debemos conoeer los métodos que nos ayudan a investigar el sistema de archivos y carpetas.

Capitulo 12 Interfaz gráfica de usuario. Java desde su inicio fue un lenguaje con capacidad para crear interfaces gráficas, en este capítulo es tudiaremos la estructura básica de una aplicaeión GUI Capitulo 13Componentes GUI. En este capítulo estudiaremos el conjunto de elases básico awt, que sirvió para desarrollar los componentes gráfieos. Capitulo 14 Componentes Swing. La evolución del paquete awt dio lugar al paquete Swing. En este eapítulo el programador Java tomará con ciencia de lo que implica serlo: continuamente se enfrentará a nuevos paquetes de clases y deberá utilizar esas elases de la mejor manera posible. En este capítulo se explica cómo se hace para "abrir" un paquete de clases, ver qué hay en su interior y cómo utilizar sus clases e interfaees.

Capitulo 15 Subprocesos (Threads). El subprocesamiento es la eapacidad de realizar dos o más acciones simultáneamente. En este capítulo estudiaremos las clases Java que debemos utilizar para utilizar esta funcionalidad en nuestras aplicaciones. Capitulo 16 Bases de datos. En este capítulo estudiaremos cómo podemos utilizar bases de datos desde las aplieaciones y applets Java me diante JDBC.

Capitulo 17 Applets y JSP. Un applet está compuesto por código Java embe bido en una página HTML mediante la ayuda de una etiqueta es-

J

20

Java 2. Curso de iniciación pecial: y se ejecuta en el eliente. JSP es código Java que se utiliza en el servidor para generar código HTML que viaja hasta el equipo cliente.

I

Capítulo 18 Redes. En este capítulo se aprenderá a utilizar soekets y a desa rrollar clientes y servidores.

I

Capítulo 19 JavaMail y XML. El paquete JavaMail nos permite incluir la funcionalidad del correo electrónico dentro de nuestras aplicacio nes Java, en este capítulo aprenderemos a hacerlo.

El lenguaje Java Java tiene unas características definidas que lo diferencian de muchos lenguajes de programación. Si tuviéramos que destacar una característica elegiríamos su simplieidad. La simplicidad es un factor de diseño de Java: desde el inicio se buscó la creación de un lenguaje potente que estuviese libre de elementos confusos o de poco uso que a veces complican innecesariamente a los lenguajes. Pero esa simplicidad no implica que sea un lenguaje con carencias funcionales, por ejemplo, incluye un recolector de elementos no necesarios o basura que no existe en otros lenguajes de uso muy extensivo, como C++. El recolector de basura se encarga de liberar la memoria ocupada por elementos que ya no son necesarios. Para analizar qué es Java veamos la definición oficial del lenguaje Java propuesta por Sun. Para Sun, Java es un lenguaje simple, orientado a objetos, distribuido, in terpretado y compilado, fiable, seguro, independiente de la plataforma de ejecución, transportable, de gran rendimiento, multiproceso y dinámico. Como definición re sulta ambiciosa, especialmente si le agregamos el adjetivo de económico, algo de que otras plataformas comparables no pueden preciarse. Sí, me refiero a .NET.

Un lenguaje simple Convengamos que la programación es una tarea que dista de ser simple, incluso la programación en lenguaje BASIC exige una serie de conocimientos básicos y una cierta capacidad lógica para lograr desarrollar un mínimo programa que haga algo productivo. ¿Java es más simple que BASIC? La respuesta es: Java no se compara con BASIC porque el potencial de Java es tremendamente superior a BASIC. Al decir que Java es simple se lo está comparando con el lenguaje C o C++; que precisa mente no son lenguajes simples, pero son lenguajes realmente profesionales y po tentes con una amplia base de programadores. De hecho. Java tiene su origen en

Introducción

21

C++, del que ha tomado gran parte de sus características, y a los programadores C y C++ no les costará nada pasar a programar en Java. Especialmente a los progra madores C++ habituados a la programación orientada a objetos. Obviamente, al programador que no conozca C o C-h- Java no le resultará tan simple, pero el aprendizaje le resultará extremadamente más simple que si tuviese que enfrentarse con C-H-. Los diseñadores de Java tomaron como modelo C++ pero le quitaron muchas de las "espinas": elementos confusos (herencia múltiple, sobre carga de operador, etc.) y elementos proclives a generar problemas (uso de punte ros) y le añadieron funcionalidades para simplificar el desarrollo (recolección de elementos no utilizados). No sólo es más fácil de programar, también es más difícil que nos equivoquemos.

No se ha mencionado Visual Basic .NET. Pero la pregunta es que acaso ¿Vi sual Basic .NET es tan sencillo de programar como Visual Basic 6? Creemos que la complejidad de Visual Basic .NET es similar a la de Java, ya que la dificultad no reside en el juego de instrucciones (reducido en ambos casos) sino en la capacidad para programar con objetos.

Un lenguaje orientado a objetos No hay que engañarse: para el programador que sólo ha conocido lenguajes orientados a procedimientos, la tecnología de la orientación a objetos es un nuevo desafio que deberá superar. Desgraciadamente la programación orientada a obje tos tiene "mala prensa": se la suele presentar como algo complicado cuando en rea lidad es todo lo contrario y cuando se domina el concepto resulta casi doloroso(una pesada carga) volver a tener que diseñar un programa orientado a procedimientos. Los fundamentos de la programación orientada a objetos son simples y lógicos: todas las tareas de programación se consideran en términos de objetos y de las relaciones entre los objetos. En este libro dedicaremos una sección a la explicación de los conceptos básicos y luego se reafirmarán los conocimientos a fuerza de ejem plos prácticos. Lo principal es no temer por anticipado y estar abierto positivamen te al aprendizaje de este nuevo paradigma. En el mundo de la programación orientada a objetos todo se percibe como obje tos, y objeto es precisamente eso: algo, una cosa. Nada nos limita al definir algo como objeto: una cuenta corriente, un edificio, un empleado, un coche, un animal, un dispositivo, etc. Y los objetos tienen propiedades o atributos que los definen mejor: color, altura, capacidad, potencia, etc. Pero no todos los objetos comparten las pro piedades: un coche tiene motor pero un empleado no, un empleado tiene sueldo pero un edificio no, etc.

Una propiedad o atributo es cualquier característica que permite definir un obje to.

22

Java 2. Curso de iniciación

Además de poseer propiedades, los objetos pueden hacer cosas: un objeto co che se puede mover, un objeto empleado se puede tomar vacaciones, etc. Nueva mente, no todos los objetos tienen capacidad para hacer determinadas cosas. Para quienes conocen la programación clásica puede servir esta comparación: una propiedad de un objeto es similar a un dato y una acción de un objeto es similar a una función, también denominada método. Es decir, un objeto posee datos y fun ciones.

Un objeto queda definido por sus propiedades (datos) y sus métodos (funcio nes).

Un lenguaje distribuido Esta característica suele ser mejor valorada por los programadores que provie nen de C o C-H- que por los propios programadores noveles que empiezan con Java como su primer lenguaje de programación. Java se diseñó desde su inicio teniendo en cuenta la necesidad de la comunicación en red. Java posee una amplia bibliote ca de funciones para gestionar los problemas de los protocolos de red (TCP/IP, HTTP, FTP, etc.). Quienes hayan tenido que desarrollar o implementar rutinas C y C++ para abrir archivos o para acceder a objetos remotos saben todo lo que signi fica eso: en Java un archivo en Internet se abre con la misma facilidad que un ar chivo local.

Un lenguaje Interpretado y compilado Sí, Java es un lenguaje interpretado y compilado. Java se ejecuta compilado, ya que su código fuente se convierte en código de máquina, que se denomina bytecodes. Este código se puede ejecutar en distintas plataformas y cada plataforma tiene su intérprete. Para que se pueda ejecutar un programa Java en una máquina determinada debe existir un intérprete para esa arquitectura de hardware y sistema operativo. Pero no nos pongamos en guardia por el hecho de sentir el término "lenguaje interpreta do", este intérprete no funciona del modo que nos tienen acostumbrados los intér pretes tradicionales, famosos por la lentitud del procesamiento, ya que, como men cionamos anteriormente, no trabaja con código fuente (texto puro) sino con la sali da de un proceso de precompilación (bytecode). Todo este milagro se logra me diante el uso de la máquina virtual Java, que nos permite acceder a diversas plata formas y, simultáneamente, a superar las limitaciones de la interpretación del códi go-

Introducción

23

Nota: no nos confundamos con el término, la máquina virtual Java no es una máquina, es simplemente software que se instala en un equipo con un sistema operativo determinado (luego veremos una amplia lista de sistemas operativos, seguramente incompleta, que admiten la instalación del entorno

Java o máquina virtual Java). Este software sabe cómo entender el código bytecode y cómo ejecutarlo en un sistema operativo determinado.

Un lenguaje fiable Los profesionales informáticos siempre intentar trabajar con herramientas fia bles. La profesión ya es por sí sola es lo bastante exigente como para dar ventajas y utilizar herramientas que nos puedan traicionar en el peor momento. Pero, ¿cómo nos puede traicionar un lenguaje de programación?

Muchas veces, quizá por comodidad, utilizamos lenguajes de programación que no nos obligan a ciertas cosas (a trabajar correctamente) y, quizá por pereza o por las prisas, producimos software poco fiable. ¿Quién no se ha visto tentado a utilizar datos Variant en Visual Basic? Pues bien, un dato Variant es una bomba de reloje ría dentro de nuestros programas: acepta cualquier tipo de dato y no se queja nun ca. Eso sí, el día que el programa funciona mal sólo nos enteramos cuando nos lle ga la carta de despido. Java nunca nos haría eso: nos obliga a definir los tipos, se queja rápidamente cuando los tipos de datos que queremos procesar no son compa tibles y no realiza conversiones automáticas de tipos. Las conversiones de datos deben ser explícitas. Otra característica relevante de Java orientada a producir software más fiable es la que elimina la posibilidad del direccionamiento por punteros, que produce tantos errores (humanos,pero errores alfin) en programas Cy C++.

Un lenguaje seguro El principal entorno de ejecución de Java es Internet, esto implica que la segu ridad es un elemento fundamental, desde el inicio de la concepción del lenguaje. ¿Qué éxito podría tener un lenguaje cuyo código normalmente se descarga de In ternet para ejecutarse en el cliente si tuviese brechas de seguridad? Sabiendo esto, los diseñadores consideraron que la seguridad es un elemento crítico del entorno Java y decidieron eliminar la posibilidad de reservar áreas de memoria antes del tiempo de ejecución y dotaron al intérprete de rutinas de verificación del código bytecode antes de la ejecución, evitando la ejecución de código Java que no sea válido. Estas medidas impiden la aparición de situaciones de riesgo: acceso ilegal a

24

Java 2. Curso de iniciación

direcciones de memoria, violación de privilegios de acceso, accesos y conversiones ilegales. Como medida de seguridad adicional, los applets descargados se consideran como código no fiable, lo que implica que en el equipo cliente no pueden acceder al sis tema de archivos del equipo local ni establecer nuevas conexiones de red excepto la del propio servidor Web del que provienen.

Un lenguaje Independiente de la plataforma Para cumplir con este objetivo fundamental para un lenguaje que debe ejecutar se en redes de ordenadores de distinto tipo Sun apeló a la idea del precompilado bytecode, que no es otra cosa que un archivo de objeto que se utiliza en todas las plataformas que saben interpretarlo. Estos archivos bytecode se procesan, en cada plataforma con sendos entornos de ejecución Java. El entorno de ejecución Java es un intérprete que convierte el archivo bytecode independiente de la plataforma en código máquina nativo dependiente de la plata forma.

Un lenguaje transportable La transportabilidad del lenguaje complementa la independencia de la platafor ma. También existen lenguajes que se pueden ejecutar en diversas plataformas, por ejemplo C, pero que, por determinados detalles, no nos aseguran la independencia de la plataforma. Por ejemplo, los tipos de datos de C no siempre se interpretan de la misma manera en todas las plataformas. Esto no nos sucedería con Java, sus tipos de datos primitivos tienen el mismo tamaño en todas las plataformas, lo que nos permite declarar que es un lenguaje transportable.

Un lenguaje de gran rendimiento Java utiliza un compilador JIT (just in time) que procesa bytecode sobre la mar cha. El rendimiento obtenido, considerando que se trata de un lenguaje interpreta do, es excepcional. Otros fabricantes de software (Borland, Microsoft, etc.) han desarrollado nuevas alternativas para acelerar el procesamiento de Java, basándo se en la compilación del código bytecode a código máquina nativo antes de su eje cución. .NET se ha desarrollado teniendo en cuenta el esquema de Java.

Un lenguaje multisubproceso Java soporta la sincronización de múltiples procesos de ejecución para optimizar las aplicaciones de red distribuidas o las propias aplicaciones de escritorio. Los

Introducción

25

ejecutables Java tienen la capacidad de gestionar y mantener varios subprocesos simultáneos, esto permite un gran incremento en el rendimiento. Imaginemos la di ferencia de rendimiento que puede presentar la ejecución lineal instrucción por ins trucción comparado con la posibilidad de crear un subproceso para cada instruc ción para luego sincronizar la finalización de todos esos subprocesos, y todo eso sin

demasiado esfuerzo de programación. Éste seria un ejemplo extremo, pero lo que sí es más lógico es mantener subprocesos simultáneos para las acciones de lectura, de proceso de cálculo y de escritura.

Cabe señalar que los subprocesos se pueden ejecutar con diferente prioridad: existen tareas que nos interesa realizar pero que no tenemos ninguna prisa (por ejemplo, una impresión muy voluminosa), éste es el caso típico de un subproceso de baja prioridad que permite que otros subprocesos se ejecuten más rápidamente. Aunque casi todos los sistemas operativos actuales soportan multisubprocesos, no todas las plataformas los implementan,por lo que el modo de ejecución de Java también depende de la capacidad de la plataforma en la que se ejecuta.

Un lenguaje dinámico El lenguaje Java y su sistema de ejecución en tiempo real permiten el enlazado dinámico con bibliotecas. Ésta es una característica fundamental de los entornos distribuidos. El uso de bibliotecas nos evita tener que recodificar rutinas que ya están resueltas por nosotros mismos o por terceros y Java posee extensas bibliotecas de clases que nos permiten ampliar fácilmente las funcionalidades de los programas. El uso de bibliotecas en aplicaciones distribuidas genera un problema potencial. Es evidente que el desarrollador no puede tener control sobre la actualización de las bibliotecas en los clientes, tal como quizá lo tendría en un entorno local. En los entornos distribuidos se puede presentar la situación que las bibliotecas del equipo cliente pueden actualizarse antes que el programador tenga la oportunidad de recompilar las aplicaciones que las utilizan. Esto podría crear un serio problema, pero Java tiene la capacidad de enlazar dinámicamente en tiempo de ejecución.

Para los programadores C/C++ Java se creó a partir de C++ tratando de superar ciertos aspectos negativos para los objetivos del nuevo lenguaje. Como seguramente muchos lectores de este libro provienen del entorno C/C-H- vale la pena realizar una rápida revisión de las cosas que en Java se hacen de otra manera que en C/C++.

26

Java 2. Curso de iniciación

Tipos de datos Java no implementa tres tipos de datos soportados por C/C++; punteros, uniones y estrueturas. Punteros

Pareee casi una falta de respeto ai programador C/C++, que considera que el sabio uso de los punteros es lo que define a un programador experto. Pues bien, los desarrolladores del lenguaje Java consideraron que el uso de punteros es un arma de doble filo y un riesgo potencial evitable. Los punteros permiten el acceso directo a posiciones de memoria y ésta es una capacidad tan poderosa como peligrosa. Se debe tener en cuenta que un fallo en el uso de los punteros puede ser sin intención de hacer daño, pero también existen personas con malas intenciones. La decisión de Sun fue algo así como "muerto el perro se acabó la rabia". Obviamente la funcionalidad que otorga el uso de los punteros es necesaria y Java la suple parcialmente con el pase de datos por referencias obteniendo así un mecanismo seguro y menos propenso a los errores humanos.

Uniones y estructuras Las clases en Java suministran todas las funcionalidades de las uniones y es tructuras, omitidas en la implementación de Java, con la ventaja de hacerlo de un modo más claro y aprovechando los conceptos de la programación orientada a ob jetos.

Operadores Java decidió dar soporte a casi todos los operadores del lenguaje C, mantenien do también el orden de precedencia entre ellos. No obstante existen algunos añadi dos y algunas desapariciones. Java presenta varios operadores nuevos: ■

+

Concatenación de cadenas. No debe confundirse con el operador + aritmético que también sigue existiendo pero que representa otro operador totalmente diferente (a pesar de compartir el mismo sím bolo).



»>

Desplazamiento de caracteres hacia la derecha con extensión de signo.



&yI

Java trata a los datos booleanos como Truc y False, no como C que los trata como valores enteros. Ante esta diferencia. Java implementa estos dos operadores(OR y AND)para el tratamiento de datos booleanos, actuando del modo habitual para C cuando se encuentra con valores enteros.

Introducción

27

InstanceOf Se utiliza para determinar si un objeto fue creado a partir de una clase específica.

Java hace desaparecer algunos operadores:



&

Dereferencia. Java no trabaja con punteros por lo tanto este operador es innecesario.



*

Referencia. Idem anterior.

Argumentos en la línea de comandos El lenguaje C nos permite pasar argumentos por la línea de comandos al ejecu tar un programa y esto lo realiza mediante el uso de dos variables de argumento

que le pasa el sistema operativo: argc (indica la cantidad de argumentos que se incluyen en la línea de comandos) y argv (referencia a una matriz de cadenas que contiene los argumentos). Por su parte, el lenguaje Java gestiona los argumentos de un modo más sencillo, simplemente le pasa al programa una matriz de argumen tos y si queremos averiguar cuántos argumentos hay en la matriz utilizamos el método length (del objeto args) y lo sabremos. Cadenas

¿Qué pueden ser las cadenas sino simples secuencias de caracteres terminadas con un carácter nulo? Pues bien, en Java las cadenas son objetos y para ello se han definido dos clases.

El tratamiento de las cadenas como objetos presenta grandes ventajas respecto al modo tradicional: es bien sabido que la gestión de cadenas en C/C++ es un tema que no es trivial. En primer término, al programador se le ha simplificado su trabajo con una serie de métodos incorporados a las clases String y StringBuffer, y en segundo término, las cadenas se tratan de modo consistente en todos los sis temas y sin problemas de localización. Comentarlos

Los comentarios es texto que se añade al código del programa para describir lo que se está haciendo y que el intérprete o el compilador no toma en cuenta. Java soporta los dos estilos de comentarios de C/C++ además de implementar un nuevo modo de comentario. Veamos los tres tipos de comentarios que se pue den utilizar: oant = 1; /* comentario estilo C */

cant = 1; // comentario estilo C++, para una línea de texto cant = 1; /** comentario estilo Java para varias líneas de text */

28

Java 2. Curso de iniciación

Tal como se puede observar el comentario estilo C y el estilo Java no presenta grandes diferencias. Sin embargo, el comentario estilo Java además de servir como comentario se puede utilizar para la generación automática de documentación. Por ese motivo, a este estilo de comentario también se lo conoce con el nombre de

comentario Doc y normalmente lo encontraremos al inicio de una definición de una clase o de un método para generar la documentación de la clase. * Definición de la clase Empleado * fecha 20/04/2006 * ©versión 1.1.4 *

©Autor ED

*/

class Empleado{

Una de las herramientas que genera la documentación se denomina javadoc y ésta utiliza las etiquetas de documento (@...) para ampliar la documentación auto mática.

Otras diferencias entre Java y C/C++ Ya hemos analizado las diferencias más evidentes e importantes entre estos len guajes. No obstante hay otros detalles para señalar: ■

Java no implementa la instrucción goto, aunque la mantenga como palabra re servada.



Java no implementa los mecanismos de preprocesamiento #defíne e #include.



Java no implementa los tipos enumerados.



Los tipos de datos booleanos de Java no se pueden convertir a valores ente ros.

Convenciones de estilo utilizadas en el li bro A lo largo del libro utilizaremos un estilo determinado para destacar distintas si tuaciones:

Nota compiementaria o referencia a otra documentación adicionai: Todo el párrafo tiene este estilo.

Introducción

29

Palabra importante o que es relevante en el contexto: La palabra que se quiere resaltar tiene este estilo.

Nombres de elementos aue aparecen en pantalla: Tienen este estilo: pulsar el botón Aceptar.

Nombres de funciones o archivos dentro de un párrafo normal tie nen este estilo:

Al utilizar la función start() se resuelve el uso de las comillas. Código en aeneral:

La línea de código tiene este estilo.

^Select * From User;

^

Código fuente del libro, erratas y actualiza ciones En el sitio Web de Inforbooks (www.inforbooks.com) se encontrará todo el código fuente de los proyectos desarrollados en el libro en forma de un archivo zip que se puede descargar en cualquier momento.

Para acceder al codigo fuente deberá realizar los pasos siguientes: 1.

Entre en la página www.inforbooks.com.

2.

Haga clic en el enlace Libros online.

3.

De los enlaces que aparecerán haga clic en Internet.

4.

Pulse en el enlace Programación.

5.

Haga clic en Java 2. Curso de iniciación.

A continuación, aparecerá un icono, pulse sobre él y empezará a descargar el archivo .zip. También se encontrará un archivo de texto con las posibles erratas que se va yan detectando en el libro después de su publicación.

30

Java 2. Curso de iniciación

Cómo comunicarse con el autor Si se tuviese alguna pregunta o alguna duda al leer el texto del libro, el lector me puede enviar un mensaje a mi dirección de correo electrónico ([email protected]) que me complacerá resolver las dudas dentro de lo que esté a mi alcance. Estas consultas quizá alimenten al archivo de erratas que espe remos que no supere lo previsible.

Resumen En este capítulo se ha hecho una presentación de las principales características generales del lenguaje y se han citado las diferencias respecto a C/C++, lenguajes que han servido de modelo para el desarrollo de Java.

Programación

Capitulo

orientada a

objetos

2

Contenido:



Conceptos de la POO



Terminología

Java es un lenguaje que permite la programación orientada a objetos y es nece sario, desde el mismo inicio del aprendizaje del lenguaje, que el lector conozca sus fundamentos y que confirmemos la terminología que utilizaremos a lo largo del libro. Obviamente, éste es un tema teórico que muchos programadores pueden co nocer aunque no hayan programado aún en Java, en tal caso la lectura de este ca pítulo podría omitirse o realizarse de modo rápido simplemente para actualizar co nocimientos y para comprobar qué terminología se empleará en el texto del libro. Por lo contrario, para el resto de los lectores este capítulo es de lectura más que obligatoria.

Terminología de la programación orientada a objetos Los programadores que utilizan la metodología de la orientación a objetos ob servan todo en términos de objetos: analizan el aspecto del objeto, cómo actúan y cómo se relacionan con otros objetos. Pero... ¿qué es un objeto?

La respuesta es tan simple que nos deja perplejos: estamos rodeados de objetos y todo lo que tocamos y lo que no tocamos puede ser visto o considerado un obje to. Todo lo que necesitemos para resolver nuestro problema lógico se puede defi-

32

Java 2. Gurso de iniciación

nir como objeto. Si estamos definiendo un programa de nómina tendremos un ob jeto Empleado, un objeto Cuenta, un objeto Empresa, un objeto Liquidación, etc. Los objetos que implementaremos no son fijos, nuestra solución de la aplicación Nómina quizá utilice otros objetos diferentes y seguirá siendo una aplicación igual mente válida y funcional. En la definición de nuestros programas representaremos los objetos en forma de código y para ello crearemos lo que se denominan entidades.

Cada objeto tiene características propias que lo distingue del resto. Veamos un objeto Empleado;

Tiene un nombre y apellido Tiene un estado civil Tiene un domicilio

Tiene un documento de identidad

Tiene un color de ojos determinado Tiene un peso determinado Tiene un sueldo determinado

Pertenece a un departamento de la empresa

Sabe hacer determinadas cosas (programar, conducir, enseñar, etc.)

Todas estas caraeterísticas, y muchas otras que no se mencionan, definen a un objeto Empleado. En la programación orientada a objetos estas características se denominan: estado y comportamiento. Un concepto fundamental de la programación orientada a objetos es su capaci dad para representar los datos y las funciones que operan sobre esos datos en un elemento de software que se denomina objeto. Justamente al unir en un único en voltorio los datos y las funciones(o dicho en otros términos, las propiedades y los métodos, o lo que es lo mismo, el estado y el comportamiento) estamos creando un objeto único. Tal como puede verse estamos utilizando la palabra dato de un objeto como si nónimo de propiedad y de estado: son tres maneras de referimos a lo mismo. Del mismo modo, al utilizar la palabra función la empleamos como sinónimo de méto do y comportamiento.

Programación orientada a objetos 33 En la bibliografía de la programación orientada a objetos nos encontraremos estas variantes de terminología (para las acciones: método,función, compor tamiento y para las descripciones: dato, propiedad, estado)pero no nos con fundamos:son distintas maneras de decir lo mismo.

No sólo un objeto Empleado tiene estado y comportamiento, si lo analizamos detenidamente todos los objetos tienen alguna clase de estado y de comportamien to. Obviamente, no todos los objetos comparten las mismas propiedades y méto dos. Un coche se mueve pero no vuela (salvo desgraciadas excepciones) pero un avión hace ambas cosas y una pirámide ninguna de esas dos. Estos tres objetos tan diferentes entre sí pueden tener más de una propiedad en común (peso y color, por ejemplo) y más de un método en común (abrir y cerrar).

En términos generales, estado o propiedad o dato del objeto, es lo que define lo que es o posee un objeto mientras que comportamiento, función o método del ob jeto es lo que define lo que puede hacer el objeto. El éxito de un buen diseño de los objetos dependefundamentalmente de la capacidad de abstracción que logremos para reconocer qué objetos definire mos para resolver nuestro problema.

Propiedades y métodos En Java, tal como se puede prever por lo visto en la sección anterior, el estado de un objeto queda definido por el valor de unas variables especiales denominadas propiedades. Por su parte, el comportamiento se implementa al desarrollar los mé todos de un objeto. En realidad se podría pensar que esto de la programación orien tada a objetos no ha inventado nada, ya que variables y funciones existen desde que se creó el primer programa informático. No es así, el aporte de la POO es que combina estos dos conceptos en un único objeto. Los programas tradicionales, no POO, también utilizan funciones para realizar acciones que generalmente se definen al principio o al final del programa y se las llama cada vez que sean necesarias mientras que en la POO las funciones (méto dos) están incrustadas dentro de los propios objetos.

Supongamos que tenemos que codificar un programa POO que modela o simu la el comportamiento de un objeto Televisor. Por supuesto al recibir este requeri miento comenzamos a pensar sobre qué es un televisor, qué podemos ordenarle que haga y qué logramos con esas órdenes. Al diseñar objetos de software debemos hacer un profundo ejercicio de abstrac ción, ir a lo fundamental del objeto y no perdemos en los detalles de la implemen-

34

Java 2. Curso de iniciación

tación. Aunque es un ejercicio que practicamos a cada momento sin damos cuenta a veces es difícil abstraer lo importante de un objeto y descartar lo trivial, pero si no lo hacemos adecuadamente nuestros objetos quedarán diseñados con gran can tidad de datos irrelevantes y de métodos prescindibles o que no corresponden a comportamientos naturales del objeto. Por ejemplo, podríamos llegar al absurdo de implementar el método LevarAnclas para un objeto de clase Avión. Prime ro debemos identificar las funciones esenciales del objeto y después elegir sólo los datos que son importantes y necesarios para realizar esas funciones. Siguiendo con nuestro ejemplo práctico y esquematizando el funcionamiento de un televisor podríamos decir que:

Está encendido/apagado Tiene un programa Tiene un volumen de sonido Tiene un contraste

Tiene un brillo

Estas características definen el estado de un televisor. Pero para cambiar estos estados necesitamos poder realizar ciertas acciones:

Encender/Apagar Cambiar de programa Modificar el volumen Modificar el contraste Modificar el brillo

Podríamos decir entonces que cada estado del televisor queda bajo la protec ción o control de una acción. En este ejemplo queda claro que lo descriptivo es el estado y lo operativo es la acción. Si tuviésemos que desarrollar este programa simulador sin seguir las técnicas POO ya estaríamos codificando funciones para sacamos de encima el problema. Este sería un grave error en POO: en POO tenemos que ser mucho más reflexivos y analizar el objeto a fondo antes de crear la clase que lo definirá.

Programación orientada a objetos 35 CLASE

MÉTODO

M

É T

/

\

/

\\

O

®

T O

D

O

^

\

/

®

/

®

MÉTODO

Este dibujo esquematiza el ideal en la definición de objetos(no siempre se cum ple): a los datos no se accede directamente desde fuera del objeto, sino que se debe pasar por los métodos "protectores" que saben cómo tratar sus propiedades y cómo validar su contenido.

Volvamos al ejemplo del televisor. Supongamos que queremos cambiar de pro grama, para ello tenemos un método denominado "Cambiar el programa" que sabe perfectamente qué programas tiene disponible el objeto Televisor al que pertenece. Este pseudo-código puede hacer esa acción: TV.CambiarPrograma(6);

Y el método CambiarPrograma(6) verificará el valor de la propiedad Programa y la asignará al valor disponible siguiente, pasando por ejemplo del canal 5 al 6. El método CambiarPrograma()jamás asignará un valor incorrecto a la propiedad Programa porque sabe perfectamente el rango de valores válidos de los programas de televisión (por ejemplo, las cadenas válidas sólo son 1,2,3,5,6,7). Si el parámetro pasado hubiese estado fuera de los valores correctos la acción se habría rechazado y la propiedad Programa habría quedado indemne manteniendo su valor anterior.

36

Java 2. Curso de iniciación

Ahora veamos un caso en el que el programador quiere acceder directamente al dato del objeto sin pasar por los métodos "protectores". Supongamos que en este pseudo-código se intenta cambiar la propiedad Programa: TV.Programa = 94;

El programador desconoce si el programa 94 existe o no en el televisor y pro bablemente tendremos un error de ejecución. La notación utilizada en este pseudo-código es similar a la empleada por el len guaje C para acceder a un elemento de una estructura. El punto se utiliza para se parar al objeto del método y los parámetros, cuando los hay, se pasan entre parén tesis.

¿Puede un programador modificar un dato de un objeto evitando el uso de los métodos del propio objeto? Si el objeto estuviese bien definido los datos tendrían que ser inaccesibles y sólo podrían ser modificados mediante un método del obje to. Esta capacidad para ocultar la información de un objeto se denomina encapsulación y es uno de los pilares de la POO. Encapsulación es la capacidad para ocultar los datos de un objeto para que sean inaccesibles a todo el mundo salvo a los métodos del propio objeto.

La encapsulación no sólo afecta a los datos, también se aplica a los detalles de la implementación de los métodos. Un objeto se comunica con el resto del mundo mediante su ínterfaz, que no es otra cosa que la lista de métodos y propiedades que hace públicos. A nadie le interesa cómo hace una determinada acción sino sim plemente que la haga. Así como al usuario típico del televisor no le importa en absoluto todo lo que ocurre en el televisor cuando cambia de cadena con el control remoto, simplemente quiere que se visualice lo más pronto posible la cadena bus cada, a los usuarios de los objetos no les preocupa la implementación interna de un método, sólo que exista y que en el futuro no cambie. ¿Qué se quiere decir con que en el futuro no cambie? ¿Acaso los programas son inmodificables? Todos sabemos que no. Pero cuando se trabaja en un entorno distribuido y dinámico modificar un objeto en producción puede ser un problema. Una vez que hacemos público un objeto con una determinada ínterfaz, por ejem plo, el objeto Televisor con sus métodos Apagar, Encender, CambiarPrograma, etc., y después que ese objeto se utiliza en infinitos programas ya no podemos eliminar alegremente un método del objeto. La ínterfaz del objeto debe mantenerse (puede tener más métodos pero no eliminar los existentes) para que siga existiendo la com patibilidad con todos los que utilicen el objeto.

Programación orientada a objetos 37 Está claro que una vez que publiquemos el objeto Televisor no podremos eli minar, por ejemplo, el método CambiarPrograma() si no queremos tener la captura recomendada de la comunidad de desarrolladores. Pero, ¿a quién le interesa o le preocupa la implementación interna del método CambiarPrograma()? A nadie, siem pre que el método haga lo que se espera. Esto también es encapsulación, es lo que permite que los objetos puedan ser vistos como "cajas negras".

Comunicación entre objetos En un programa en donde todo son objetos ¿cómo se realizan las tareas? He mos visto que los objetos reaccionan a las órdenes que saben procesar. De nada sirve que ejecutemos el método Lavar() en el objeto Televisor ya que no pasare mos de la etapa de compilación. Sólo podemos utilizar lo que la interfaz del objeto nos permita. Pero los objetos para realizar sus funciones también necesitan de la colaboración de otros objetos y éstos por su parte de otros objetos: este encadena miento de funciones se logra mediante el envío de mensajes entre los objetos que no son otra cosa que invocaciones a métodos con los parámetros que cada método necesita.

Lo más interesante de este modo de comunicación mediante mensajes es que cualquier objeto puede enviar un mensaje a cualquier otro sin importarle dónde re side el objeto, puede estar en el propio servidor o en un servidor en las antípodas, el formato del mensaje será el mismo y la complejidad de la programación tam bién.

Clases La clasificación es la tarea de agrupar cosas según sus características y sus ca pacidades y es otro de los conceptos fundamentales de la POO. Somos incapaces de omitir la clasificación de las cosas, cualquier nuevo elemento se debe clasificar en algún sitio, es una actividad inherente al ser humano. Si se descubre un nuevo elemento químico inmediatamente se lo colocará en la tabla de elementos. Si se descubre una nueva especie animal, el biólogo de tumo se encargará de clasificar lo correspondientemente. En la POO ocurre lo mismo, todo debe estar clasificado, es decir, cada objeto debe pertenecer a una clase específica de acuerdo a sus características y si esa clase no existe, se crea.

Muchas veces se verá que se utiliza la palabra Objeto y Clase de modo indis tinto e intercambiable. No es incorrecto pero en realidad hay un matiz que diferen cia a estos dos conceptos. Una clase es algo así como una plantilla o molde a par tir de la que se crean los objetos. Esta clase posee todas las variables y funciones

38

Java 2. Curso de iniciación

que debe tener un objeto de su clase, luego el objeto tendrá valores propios en esas variables cuando el objeto se haya creado. Por lo tanto, un objeto no es una clase, sino que es el resultado de crear un ejemplar de esa clase.

La estructura del lenguaje C se puede comparar a un objeto, ya que después de su definición podemos crear todas las variables del tipo de la estructura definida, pero para ser realmente una clase le falta la capacidad para tener funciones incrus tadas y una interfaz para que los otros objetos sepan comunicarse con ella. En Java una clase toma este formato: class Nombre{ ...

variables

...

métodos

Vj

. La palabra clave class siempre encabeza la definición de una clase y la de

finición de variables y métodos queda encerrada entre llaves.

Accesibilidad Ya sabemos que la encapsulación es la capacidad de ocultar los miembros de una clase, y al usar la palabra miembros nos referimos tanto a las propiedades como a los métodos de una clase. Para que los métodos actúen como "protectores" del contenido de las propiedades es preciso impedir que un programador utilice una instrucción como esta:

TV.Programa(94);

Y para evitarlo se restringe la accesibilidad a los datos (también puede hacerse a los métodos)definiéndolos como prívate (lo contrario sería public). Cuando se crea un objeto de una clase, desde afuera del objeto sólo podemos acceder o usar sus miembros públicos, por lo tanto, como regla general se definen las varíables como prívate y los métodos como public (salvo que también nos interese im pedir el uso de un método, en tal caso también lo tendríamos que definir como prívate). Pero esto sólo es una regla general para lograr la encapsulación sin es fuerzo.

En realidad. Java afina mucho más la puntería sobre este tema y tiene cuatro niveles de acceso: public, prívate, protected y fiiendly.

Por el momento es suficiente con percibir la diferencia entre public y prívate.

Programación orientada a objetos 39 Creación de ejemplares de una clase La definición de una clase es una acción declarativa, es decir, en el programa no sucede nada hasta que no creamos un objeto tomando como plantilla una clase determinada (definida por Java, por terceros o por nosotros). La creación de un ejemplar de una clase se suele denominar instanciación, palabra que proviene del inglés instantiate y que da lugar al uso de la palabra instancia para denominar un ejemplar de una clase. La comodidad de los traductores o la facilidad que tene mos los informáticos de habla hispana a crear neologismos dio lugar a la aparición de la palabra instancia que puede confundir a los menos expertos. Para crear un ejemplar de la clase TV se utiliza esta sintaxis: TV miTV = new TV();

El operador new seguido con el nombre de una clase válida crea un objeto de dicha clase en una posición de memoria a la que nos referiremos con el nombre miTV.

Cuando se ejecuta esta instrucción se produce una invocación al constructor de la clase (TV()), que no es otra cosa que un método de la clase que se encarga de las tareas de inicialización del ejemplar. Después de la creación del ejemplar de la clase TV podemos usarlo libremente siempre dentro de lo que nos permita su interfaz, por ejemplo: miTV.Encender(); // uso el método para encender el televisor miTV.CambiarPrograma(2); // sintoniza la cadena 2 miTV.Apagar O ; // como de costumbre, no hay nada para ver

Es un ejemplo simple pero da una idea básica sobre cómo se crea y utiliza un objeto. Herencia Dejamos para el final el concepto más interesante de la POO: la herencia. Ya sabemos que en la POO podemos crear objetos a partir de la nada, ahora es el momento de saber aprovechar los objetos que se han creado de la nada para crear objetos más complejos o especializados. Esto se logra con el mecanismo de la he rencia: la mejor solueión para la reutilización del código. Supongamos que hemos creado una espléndida clase para definir una persona, con todos los datos que comparten todas las personas y todas los métodos necesa-

40

Java 2. Curso de iniciación

rios para gestionarlas, y posteriormente nos toca desarrollar una aplicación de nó minas. En las nóminas hay empleados y los empleados son, antes que nada, perso nas. ¿Qué más fácil que definir la clase Empleado basada en la clase Persona? La clase Empleado es una especialización de la clase Persona, es decir, tiene todos los miembros de la clase Persona más los miembros propios de la clase Empleado (por ejemplo, el sueldo). Todas las personas tienen nombre y apellido y documento pero no todas tienen sueldo: por eso es preciso ampliar la clase Persona y crear la clase Empleado, pero al hacerlo no lo hacemos desde cero, aprovechamos todo el códi go ya escrito y probado de la clase Persona; ¿y cómo se aprovecha este código? Muy fácil:

class Empleado extends Persona{ int Sueldo;

Así de simple. Y si en otra aplicación de alumnos nos encontramos con una si tuación parecida podemos reutilizar la clase Persona nuevamente:

class

Alumno

extends

Persona{

int Nivel;

Por su parte, una clase hija, como Empleado o Alumno, se puede transformar en clase base de otra nueva clase:

class Gerente extends Empleado{ int Area;

No todos los empleados son gerentes, pero algunos tienen esa suerte. Los ge rentes también tienen sueldo, como los empleados (por supuesto, no el mismo), y también tienen nombre y apellido como todas las personas. Por lo tanto, la clase Gerente es una clase especializada de las clases Empleado y Persona. La gran virtud del uso de la herencia es que permite la reutilización del código de un modo simple y dinámico (las clases pueden ser modificadas pero el enlace se mantiene y mientras la interfaz sea la misma no se presentarán problemas de compatibilidad de versiones). No sólo se reutiliza el código sino que el código re sultante tiene mayor fiabilidad ya que se minimiza la codificación.

Programación orientada a objetos 41 Una clase no está restringida al comportamiento de su clase base (o padre), sino que además define un comportamiento propio(que no tiene su clase base) que hace que la clase sea más especifica.

Jerarquía de clases La subclasifícación es la especialización de una clase mediante la creación de una clase hija basada en una clase madre. Este proceso lleva a lo que se denomina árbol de herencia o jerarquía de clases. En el nivel superior la clase es más ge nérica y a medida que se realizan subclasificaciones se convierte en una entidad más especializada: una persona es más genérica que un empleado y éste es más genérico que un gerente.

Persona

Empleado

Gerente

Resumen Java es un lenguaje que se adhiere plenamente a los preceptos de la programa ción orientada a objetos. Por esta razón es imprescindible que el aprendizaje del lenguaje Java sea precedido con una revisión de los conceptos relacionados a la POO y a su terminología. En este capítulo hemos visto que: •

La POO no es tan compleja ni confusa y que antes que nada es lógica.



La POO se basa en una corta lista de conceptos fundamentales: abstracción, estado, comportamiento, encapsulación y herencia.



Los objetos se comunican entre sí por medio de mensajes de acuerdo a sus interfaces.

42 •

Java 2. Curso de iniciación

La POO tiene en la herencia un mecanismo sobresaliente para la reutilización del código.

Más adelante, al analizar la implementación práctica de las clases, volveremos sobre este tema.

Conceptos

CA|Htii1o

básicos de diseño

3

Contenido:

Diseño de programas Applets Diseño previo Punto de vista del usuario

Los dos tipos fundamentales de programas Java son las aplicaciones y los applets. Cuando decimos aplicaciones Java nos referimos a los programas escritos en len guaje Java que tienen la capacidad para ejecutarse fuera del contexto de un nave gador Web. Las aplicaciones Java es igual a las aplicaciones clásicas que todos conocemos, aunque se diferencian de ellas en algo muy importante: para su ejecu ción requiere que el equipo tenga instalado el entorno de tiempo de ejecución de Java, tal como también sucede con los applets. No obstante, las aplicaciones Java se diferencian de los applets en su propósito: los applets son pequeñas aplicaciones que se ejecutan en Internet bajo el entorno de un navegador Web, en cambio, las aplicaciones Java son aplicaciones de uso general que se ejecutan en equipos locales, tal como un programa Excel o Word, siempre mediante el uso de un intérprete (por ejemplo, java). Los applets están incrustados, rodeado por etiquetas que los identifican, como y ,como código cjccutablc dentro de una página Web y están estructurados de modo totalmente diferente a un programa clásico. Además, al ser un programa que se ejecuta en la Web, los applets residen siempre en un servidor Web a la espera de entrar en acción dentro de un navegador. El código de un applet también es bytecode aunque para su ejecución no invoca directamente al intérprete

44

Java 2. Curso de iniciación

sino que lo hace indirectamente mediante el navegador o una herramienta como appletviewer (que analizaremos posteriormente).

Applets Puede resultar prematuro analizar detalles de diseño de applets cuando aún no hemos codificado casi ninguna instrucción de Java, pero existen razones por las que se tratan estos temas generales en este punto y no como apéndice del libro o en los capítulos finales. La principal razón es que estos detalles generales son im portantes y no deben omitirse. Si estos conceptos quedan escondidos en la parte final del libro, más de un programador C/C++ se verá tentado a leer rápidamente los elementos básicos de la programación Java y en cuestión de días estará codifi cando sus programas Java sin ni siquiera haberse enterado de la existencia de es tos conceptos. Como no quiero que suceda esto, coloco este material en un lugar relevante del libro. Además, como prácticamente no utilizaremos sentencias Java sino que conceptos de diseño y programación, este capítulo será perfectamente entendióle aunque parezca demasiado avanzado para el supuesto estado de apren dizaje del lector en esta fase del libro. En los capítulos siguientes se volverán a tratar algunos de estos temas, pero con la visión general que se desarrollará en este capitulo se podrá ser más ágil al entrar en los detalles de la implementación alya saber claramente qué puede y qué no puede hacer un applet.

Diseño previo Muchos programadores tienen la sensación de que cuando no están codificando no están siendo productivos. No es poco habitual ver a un programador codifican do mientras está aún recibiendo los requerimientos del usuario. Ese software apa rentemente altamente productivo (al menos esa es la impresión que se suele llevar el asombrado usuario ante la demostración técnica del programador) suele acabar en la papelera ya que se creó sin la debida abstracción del problema. Java es un lenguaje POO y por lo tanto nuestros programas estarán compuestos por objetos que interactúan entre sí. Mucho antes de abrir nuestro editor de código fuente preferido tendremos que haber decidido cuáles serán los objetos principales y cómo se relacionarán con el resto de los objetos. Ahorraremos mucho tiempo si esquematizamos los objetos y decidimos sus interfaces (el modo en que se relacio nan con el exterior) y si revisamos ese esquema a conciencia antes de pensar en el código Java. Se debe evitar en lo posible caer en la tentación de pensar "este

Conceptos básicos de diseño 45 tema lo dejo abierto para decidirlo mientras codifico". A medida que se empieza a codificar vamos perdiendo, sin damos cuenta, la libertad de pensar y nos enfrasca mos en los detalles: el momento de pensar libre y globalmente es antes de codifi car. Esta recomendación es válida para casi todos los casos, quizá con la excep ción de los programas de lógica extremadamente simple.

Poniéndose en el lugar del usuario La utilización de nuestros programas genera reacciones en los usuarios. Todo lo que se ve en la pantalla y los sonidos que se oyen conforman la experiencia del usuario de la interfaz que hemos diseñado, es fundamental que al diseñar primero nos sepamos colocar en el lugar del usuario en lugar de darle prioridad a los deta lles técnicos de cómo vamos a resolver nuestro problema. Debemos tener en cuen ta que no siempre nuestros gustos coinciden con el de los usuarios y, salvo aplica ciones web muy específicas, es preferible ser cautelosamente innovador.

Como las preferencias de los usuarios es muy variada, siempre que en la inter faz añadamos elementos adicionales, como fondo de sonido, o cierto tipo de ani mación, debemos tener la delicadeza de incluir una opción de desactivación de lo prescindible: no podemos asumir que a todos les encanta oír una música determi nada mientras navegan por nuestra página. El modo en que se ofrezca la opción de desactivación debe ser fácil de encontrar: nada molesta más que no poder desactivar algo que resulta desagradable, este pecado nos puede hacer perder muchas visitas a un sitio web.

Existen varios aspectos generales que debemos considerar al analizar cómo se navegará en nuestra página: por ejemplo, cómo se controlará el ratón, cómo nos apoyaremos en el uso del teclado para determinadas acciones, etc.

Ratón El control del ratón puede parecer una obviedad, pero no su funcionalidad no es la misma en una aplicación de escritorio que en una aplicación web. Para empe zar, Java no brinda un soporte directo al doble clic, por lo que uno de los principa les mecanismos de comunicación usuario-aplicación merece un pequeño análisis. Java detecta sin problemas el clic simple, el movimiento del ratón y la liberación del botón de la operación de arrastrar y soltar, pero si queremos emplear el doble clic tendremos que estructurar una función (o buscarla en las bibliotecas Java) para que detecte el tiempo transcurrido entre dos clics y determine que ha sido un doble clic, algo farragoso, especialmente para implementar algo que en el mundo web no es habitual.

46

Java 2. Curso de iniciación

Otro detalle que se debe tener en cuenta es que aunque en Java se tiene acceso a las acciones de los tres botones del ratón, los usuarios web tienden a utilizar sólo

el botón principal. Como alternativa, para dar más funcionalidad a la entrada por

ratón, se puede combinar el clic del ratón con la pulsación de la tecla Mayús o CTRL.

Teclado

Java no nos permite codificar applets con soporte para los botones adicionales del ratón, por lo que debemos apoyamos en el uso del teclado para posibilitar en tradas altemativas con el ratón. Cuando llega el momento de decidir qué teclas se eligen para acompañar al clic del botón principal del ratón no es conveniente que nos apartemos de las clásicas teclas: Mayús y CTRL. No conviene sorprender a los usuarios con otras combinaciones.

Fuentes Muchas veces diseñamos cuidadosamente una interfaz de usuario eligiendo la fuente más elegante o impactante y con el resultado quedamos orgullosos por la elección. Pero al desarrollar para un entorno Web y multiplataforma las cosas no son tan simples: no todas las fuentes están instaladas en todos los equipos y para evitar sorpresas en la presentación del texto debido a una sustitución automática de fuentes debemos determinar si la fuente elegida está disponible en los sistemas en donde queremos utilizarlas. Obviamente, si utilizamos las fuentes comunes (Arial, Times New Román, Courier, y alguna más) no tendremos ningún problema.

Los límites del ancho de banda En Java resulta muy fácil producir páginas con imágenes y sonidos: tan fácil que se suele sobrecargar la página con estos elementos como si se tratase de un agujero negro que lo puede absorber todo. A veces se prueba una página en un equipo local y parece que su rendimiento es aceptable, la sorpresa viene luego en el entorno real. En primer término, no todos los usuarios web tiene la suerte de contar con una conexión TI o ADSL, y en segundo término, no nos interesa en absoluto perder mercado de usuarios porque nuestras páginas tardan minutos en cargarse.

Cuando probemos el rendimiento de nuestras páginas deberíamos hacerlo eli giendo el entorno más habitual de nuestra red de usuarios. En España, actualmente el ADSL se está imponiendo progresivamente pero es más realista pensar que el usuario promedio accede a la web utilizando un módem de 56 kbps. Esto depende rá totalmente de quienes serán los destinatarios de nuestras aplicaciones, especial-

Conceptos básicos de diseño 47 mente se debe tener en cuenta su ubicación regional (hay países en donde la co nexión ADSL o el cable sigue siendo un privilegio de pocos).

Los applets en sí mismos son extremadamente pequeños y se descargan por la red sin causar el más mínimo problema; las cosas cambian radicalmente cuando se trata de gráficos y sonidos. Afortunadamente existen algunos consejos para dismi nuir al mínimo el tiempo de descarga de esta clase de archivos. Sonido

Los sonidos permiten llamar la atención de los usuarios de nuestra página y es indudablemente un buen mecanismo para estos fines siempre que no se abuse de él. Y no sólo por el ancho de banda que ocupan sino por la reacción negativa del usuario, tal como se mencionó en la sección anterior.

Java trabaja con archivos de sonido con formato au, lo que nos obliga a con

vertir nuestras grabaciones a este formato para poder oírlas en un applet. Este tipo de formato ocupa relativamente menos espacio que los otros formatos de sonido, pero esto lo logra perdiendo calidad.

Todos los archivos de sonido incluyen al principio y al final unos segundos mu dos, estos segundos aunque sean mudos ocupan ancho de banda en la descarga, por lo que es aconsejable recortarlos. La desventaja de este recorte es que el soni do puede eomenzar muy bruscamente causando una sensación desagradable y a veces lo mejor es suavizar el comienzo con una entrada progresiva (fade-in) y sua vizar también el final (fade-out). Otro modo inteligente de dar sonido a una página sin tener que pagar demasia do peaje por el tiempo de descarga es utilizar bucles de sonido que se repiten inde finidamente hasta que se lo detiene. El secreto es saber elegir el fragmento de so nido para que éste no resulte cansador y para que su reiteración no resulte molesta para los usuarios con sentido musical. Dado que es posible superponer dos o más sonidos, se puede crear una combinación escalonada de sonidos en donde la repe tición pasa desapercibida.

Gráficos Dada la frecuencia de su utilización, en comparación con los sonidos, los archi vos gráficos son los principales culpables del tiempo de descarga de las páginas. Java soporta desde su origen el uso de archivos GIF (Graphic Interehange Format) y JPEG (Joint Photographic Experts Group) y podremos utilizarlos en nuestros applets. Independientemente del formato utilizado las imágenes gráficas son todas consumidoras de ancho de banda. Si nuestro problema es tener que reducir el an cho de banda utilizado por una página con imágenes tenemos varias alternativas.

48

Java 2. Curso de iniciación

El primer paso para la reducción del tiempo de descarga del gráfico es ajustar su tamaño a lo estrictamente necesario mediante herramientas de recorte que se pueden encontrar en cualquiera de los programas de gestión de imágenes (Photoshop, IQuick, etc.).

El segundo paso para la reducción del tiempo de descarga del gráfico es dismi nuir la cantidad de colores en la visualización de la imagen. En lugar de utilizar

una paleta completa de colores, se puede definir una paleta reducida con los colo res más utilizados y con ello se logran tiempos de descarga más reducidos. Al uti lizar una paleta reducida se fuerza a la imagen a que utilice el color más aproxima do, perdiendo fidelidad en los colores a cambio de menor tiempo de descarga, siem pre se trata de buscar un punto de equilibrio. Las imágenes de formato GIF poseen ciertas ventajas muy valiosas, además de ser imágenes almacenadas con un buen grado de compresión permiten la transpa rencia, que es la capacidad de definir un color de la imagen como transparente, y el entrelazado, que es la capacidad de ir apareciendo en la pantalla a medida de que se va transmitiendo (en contraposición de la aparición brusca de la imagen com pleta al finalizar toda la transmisión). Por su parte, las imágenes JPEG tienen un grado de compresión mayor y permiten una mayor cantidad de colores que los grá ficos GIF, pero no admiten transparencia. El entrelazado es una capacidad muy im portante ya que tranquiliza al usuario que está observando la descarga de una pági na, ya que le permite comprobar visualmente que la transmisión de datos se está efectuando y evaluar el tiempo faltante de la descarga. La elección del formato de los gráficos no permite una regla fija: todo depen derá de lo que se está visualizando, la cantidad de kilobytes de las imágenes origi nales, de la cantidad de colores realmente necesarios y de la cantidad de imáge nes. Es muy común llegar a la conclusión de una elección combinada: algunas imágenes se visualizan bien con GIF y en otras es necesario apelar a JPEG.

Hace unos años la cantidad de colores más habitual que se podía representar en una pantalla era de 256 colores, por lo que producir imágenes con mayor cantidad de colores representaba un esfuerzo sin recompensa; sin embargo, actualmente lo habitual es que las pantallas de los ordenadores puedan representar millones de colores, por lo que la restricción de colores no la determina la incapacidad del equipo del usuario medio para representar esos colores sino en el tiempo de descarga de las imágenes.

Las imágenes y la plataforma Java es un lenguaje independiente de la plataforma. Esto significa que nuestro programa se utilizará en diversos sistemas operativos y ya se sabe por experiencia que las imágenes no se muestran de igual manera en las distintas plataformas, ni incluso en distintos equipos de una misma plataforma. A medida que Java se im-

Conceptos básicos de diseño 49 planta en nuevas plataformas más variedad de presentación de una misma imagen tendremos. Este es un problema que se combate adhiriéndonos lo más posible a paletas básicas de colores consolidados. De poco valdrá nuestro esfuerzo por bus car un color determinado, éste seguramente se verá como queremos en algunas plataformas y en el resto quedará modificado por un color parecido.

Tiempo de procesamiento Cuando desarrollamos un applet, además del ancho de banda que requiera su ejecución, también se debe tener en cuenta el tiempo de procesamiento. Lo nor mal es que los usuarios de nuestra página Web posean equipos menos potentes que los que empleamos para el desarrollo de software: esto significa que los tiempos de respuesta que obtenemos en nuestro entomo de desarrollo será en general y sal vo excepciones bastante menor que el tiempo real en producción en los equipos de los navegantes. Otro dispositivo que también presentará diferencias será la panta lla. Por lo tanto, no debemos perder de vista que estamos desarrollando para los usuarios y no para nuestro equipo de gama alta: los tiempos de respuesta válidos tendremos que valorarlos en la ejecución en equipos medios o lentos con conexio nes de módem estándar, no en nuestro equipo que seguramente contará con un procesador de última generación (o casi). Si el applet funciona bien en esos equi pos medios podremos quedamos tranquilos.

La animación y ei procesamiento La animación forma parte de los elementos que suelen capturar la atención de los navegantes de la Web, por ese motivo su uso cada vez se extiende más en el diseño de páginas web. Es difícil escapar al embmjo de una animación bien logra da. Ahora bien, debemos tener en cuenta que la animación exige capacidad de pro cesamiento y no tendrá el mismo atractivo si se ejecuta en un equipo de la gama alta de procesamiento que si se ejecuta en un equipo antiguo. Pero el mismo pro blema lo tenemos al revés: una animación diseñada para un equipo poco potente prácticamente volará en un equipo moderno. ¿Qué hacer ante este dilema? ¿Dise ñamos para todos o sólo para un sector del mercado? Para ser coherentes deberíamos tratar de diseñar para el mercado más amplio de usuarios. Afortunadamente podemos controlar el ritmo de visualización de los frames y ajustarlo, insertando demoras si es necesario, a la velocidad del procesador que nos toque en suerte. En Java esto se implementa de modo muy simple median te un bucle que simplemente verifica si es el momento de dibujar un nuevo frame o si hay que seguir mostrando el anterior. Esta solución es válida pero no nos exi me del intento de reducir al máximo el proceso que se realiza dentro de la rutina de animación y del ajuste del tamaño de cada imagen al mínimo posible. Todo lo que hemos explicado anteriormente sobre la optimización del tratamiento de imá-

50

Java 2. Curso de iniciación

genes tiene validez aquí: cada detalle que haga que las imágenes sean más ligeras no sólo favorecerá al ancho de banda disponible sino que también contribuirá a descargar la tarea del procesador. Las rutinas de animación son firmes candidatas a resolverse mediante

subprocesos para distribuir mejor el procesamiento. Java afortunadamente es un lenguaje que implementa el uso de subprocesos con relativa facilidad y de esa manera podemos tener varias tareas en ejecución simultánea.

Piense, piense, piense iuego codifique Como regla general es preferible hacer un esquema de la interfaz de usuario antes de codificar nada y pensar profundamente en el aspecto y en las acciones que se podrán efectuar desde la interfaz. Por supuesto ese esquema inicial se mo dificará varias veces antes que nos satisfaga plenamente como usuario y que satis faga también al usuario real. Cuando ya estamos satisfechos con la interfaz de usua rio ha llegado el momento en pensar en los objetos que necesitará el programa.

Es cierto que no habremos escrito aún ni una línea de código pero nos sorpren derá todo lo que sabremos sobre nuestro programa. Lo que no resultará ninguna sorpresa es que los programas diseñados de esta manera resultarán más limpios, claros, flexibles, estructurados y fáciles de mantener y, pese a que empezaremos a codificar mucho después que siguiendo la nada recomendable técnica de codificar ahora y pensar después, estarán realmente terminados mucho antes.

Resumen Antes de comenzar a codificar nuestro primer applet es preciso que conozca mos ciertos detalles que se podrían denominar de "culturilla general" para saber en qué terreno nos adentramos. Así es como hemos visto la problemática del tiempo de descarga del applet y de su tiempo de proceso. También hemos visto que es necesario tener muy clara la estructura del programa y los objetos que utilizará: todo esto nos ayudará a crear un programa más fácil de entender, de ampliar y de mantener.

JDK - Java

CAfHtwlo

Development Kit

4

Contenido: Instalación

Documentación JDK Herramientas básicas

Compilación de Java Línea de comandos/IDE

Instalación del JDK Para desarrollar applets y aplicaciones Java es necesario instalar el kit de desa rrollo Java de Sun que encontraremos en uno de los sitios Web de Sun (http:// java.sun.com/j2se). La distribución vigente del JDK incluye opcionalmente un en torno de desarrollo integrado (IDE) gratuito que se denomina NetBeans.

El paquete es multiplataforma, lo que nos permite instalarlo en distintos entornos (Windows, Solaris (versión SPARC),Solaris (versión x86), Linux). Según la plataforma elegida tendremos que descargar el instalador correspon diente:



Windows



Linux



Solaris (SPARC)



Solaris (x86) Los tamaños de los archivos de instalación varían en la versión actual entre 120

MB y 132 MB según la plataforma.

52

Java 2. Curso de iniciación

Instalación en Windows Los requerimientos mínimos de hardware son los siguientes: ■

Procesador: Pentium III 500 MHz



Memoria:



Disco libre: 415 MB (235 MB permanentes y 180 MB temporales para la ins

512 MB

talación)

Después que hayamos descargado el paquete JDK + NetBeans su instalación es muy simple ya que se suministra con un instalador y solamente tendremos que: ■

Tener privilegios de administrador



Estar de acuerdo con la licencia



Elegir la carpeta en donde se instalará el paquete de componentes



Pulsar el botón Next (Siguiente) para iniciar el proceso de instalación

El proceso de instalación incluye la instalación del J2SE JDK 5.0, del IDE NetBeans 5.0 y del entorno de ejecución J2SE RE (runtime environment). Si lue go observamos la lista de software instalado en nuestro Panel de control podremos comprobar que el proceso de desinstalación permite quitar estos paquetes por se parado.

El IDE que utilicemos puede ser cualquiera de una amplia variedad disponible, por lo que podríamos reemplazar NetBeans por Eclipse u cualquier otro de nuestra preferencia. Si decidimos desinstalar el JDK tendremos que modificar un parámetro de NetBeans para que pase a apuntar a una instalación alternativa del JDK. El parámetro es -jdkhome en el archivo netbeans.conf.

Instalación en Solaris (SPARC) Los requerimientos mínimos de hardware son los siguientes: ■

Procesador: Ultra 10 workstation, 450 MHz



Memoria:



Disco libre: 415 MB (235 MB permanentes y 180 MB temporales para la ins

512 MB

talación)

JDK

53

Después que hayamos descargado el paquete JDK + NetBeans la instalación es similar a lo ya explicado para el sistema Windows, salvo que sólo es necesario ser usuario root si se realiza la instalación en una ubicación para todo el sistema. Navegar hasta el archivo descargado y cambiarle los permisos:



Teclear: chmod 755 jdk-l_5_0_06-nb-5_0-solsparc.bin Luego ejecutar el archivo de instalación:

./jdk-l_5_0_06-nb-5_0-solsparc.bin

Instalación en Solarla (x86) Los requerimientos mínimos de hardware son los siguientes: ■

Procesador: Pentium III 500 MHz



Memoria:



Disco libre: 415 MB (235 MB permanentes y 180 MB temporales para la ins

512 MB

talación)

Después que hayamos descargado el paquete JDK + NetBeans la instalación es similar a lo ya explicado para el sistema Windows, salvo que sólo es necesario ser usuario root si se realiza la instalación en una ubicación para todo el sistema. Navegar hasta el archivo descargado y cambiarle los permisos:



Teclear: chmod 755 jdk-I_5_0_06-nb-5_0-solx86.bin Luego ejecutar el archivo de instalación:

./jdk-l_5_0_06-nb-5_0-solx86.bin

Instalación en Linux Los requerimientos mínimos de hardware son los siguientes: ■

Procesador: Pentium III 500 MHz



Memoria:



Disco libre: 415 MB (235 MB permanentes y 180 MB temporales para la ins

512 MB

talación)

Después que hayamos descargado el paquete JDK + NetBeans la instalación es similar a lo ya explicado para el sistema Windows, salvo que sólo es necesario ser usuario root si se realiza la instalación en una ubicación para todo el sistema.

Navegar hasta el archivo descargado y cambiarle los permisos:

54 ■

Java 2. Curso de iniciación

Teclear: ehmod 755 jdk-l_5_0_06-nb-5_0-linux.bin Luego ejeeutar el arehivo de instalaeión: ./jdk-1_5_0_06-nb-5_0-1inux.bin

Documentación del JDK La documentación del JDK no forma parte del archivo de instalación, por lo que se debe descargar independientemente (44 MB)y está formado por un amplio conjunto de archivos HTML que se puede desempaquetar en cualquier carpeta del equipo. Para visualizar la documentación se utiliza cualquier navegador.

Herramientas básicas del JDK Al instalar JDK nos encontraremos con un grupo básico de herramientas: javac:

Compilador del lenguaje Java. Convierte código fuente en bytecode.

java:

Lanzador de aplicaciones Java. Es el intérprete que sabe procesar bytecode.

javadoc:

Generador de documentación Java a partir del fuente Java.

apt:

Herramienta de procesamiento de anotaciones.

appletviewer:

Ejecuta y depura applets sin necesidad de un navegador web que sepa procesar Java.

jar:

Crea y gestiona archivos JAR, que permiten combinar múl tiples archivos en un único archivo JAR.

jdb:

Depurador Java para la línea de comandos.

javah:

Generador de cabeceras C y archivos fuente. Usado para codificar métodos nativos.

javap:

Desensamblador de archivos de clases (de bytecode a tex to).

extcheck:

Usado para detectar conflictos Jar.

JDK

55

Compilación de Java En primera instancia no utilizaremos el IDE y haremos las tareas de compila ción y ejecución utilizando la línea de comandos; aunque resulte una tarea pesada es preciso que los programadores dominen también el uso de los comandos. Cuando hayamos instalado el lenguaje Java veremos que en la carpeta principal aparece una carpeta bin en la que encontraremos los distintos ejecutables de Java.

En esta fase del estudio nos interesa presentar los tres siguientes:



java.exe

Ejecuta aplicaciones Java.



javac.exe

Compilador de Java.



javaw.exe

Ejecuta aplicaciones gráficas en Windows.

A modo de comprobación, y simultáneamente para empezar a conocer el kit de desarrollo JDK, realizaremos la primera compilación con el compilador javac.

Éste es un compilador desarrollado en lenguaje Java y por lo tanto, al interpretarse en tiempo de ejecución, no es especialmente rápido. El comando para compilar en la línea de comandos es javac y el comando para ejecutar es java. Antes de compilar es preciso que tengamos algo de código, para ello desarro llaremos un programa mínimo.

Edición dei código fuente Podemos utilizar cualquier editor de texto para crear este código fuente: public class HolaJava {

// primer programa Java public static void main(String argv[]) {

/* instrucción ejecutable método println */ System.out.println("Hola, Java"); }

La extensión del archivo de código fuente debe ser java y el formato debe ser ASCII. Se guarda este archivo con el nombre HolaJava.java (tener en cuenta que se hacen diferencias entre mayúsculas y minúsculas) y ahora podremos com probar el entorno Java compilando y ejecutando. Aprovechemos este código fuente para tomar un primer contacto con la estruc tura de un programa Java, La primera línea define el nombre de la clase que esta mos creando (Java es un lenguaje POO, por lo que un programa también es un

56

Java 2. Curso de iniciación

objeto). La segunda línea de instrucciones define el procedimiento main, que es el punto de entrada del la aplicación. Los bloques de ejecución se encierran entre llaves y estos bloques también, tal como aprenderemos más adelante, determinan el alcance o visibilidad de las variables. Las instrucciones ejecutables se finalizan con punto y coma, en este programa hay una única instrucción ejecutable que es la que imprime el texto "Hola, Java" utilizando el método println de la clase System.out.

El nombre del archivo de la clase(HolaJavaJava)debe coincidir exactamen te con el nombre de la clase(HolaJava)definida en el códigofuente cuando se trate de una clase public (tal como sucede en este ejemplo).

Tal como se puede observar en este código, por razones de legibilidad se pue den utilizar sangrías o indentado. Los comentarios pueden tomar tres formatos di ferentes y en el ejemplo hemos utilizado dos, el restante es el que se emplea para documentación: /★* Autor:

ED

Versión:

xx

V

^

Todos los IDE incorporan su editor de texto para introducir el código fuente pero también existen editores que, sin pertenecer a un IDE, brindan ciertas funcio nalidades que nos ayudan en la tarea de codificación. Un editor realmente intere sante que reconoce el formato Java es TextPad Iwww.textpad.comL que si bien no es gratuito es de coste muy reducido. Al reconocer los elementos del lenguaje, TextPad utiliza diversos colores para indicar las palabras clave, los comentarios, etc. TextPad incluso incluye la posibilidad de ejecutar comandos, lo que nos per mite iniciar compilaciones desde el propio editor.

Compilación y ejecución desde ia línea de comandos c:\javadir>javac

HolaJava.java

c:\javadir>java HolaJava Hola, Java

c:\javadir>

La compilación con javac sigue la premisa de no informar nada cuando todo

ha ido bien. El compilador tiene un parámetro opcional CLASSPATH que permite indicar el lugar en donde Java buscará las clases.

JDK

57

Tal como hemos mencionado, javac es sólo uno de los muchos compiladores Java, existen otros compiladores escritos en C/C++ que son más rápidos, al no re querir interpretación. Entre estos compiladores destaca Jikes, que está disponi ble para Linux y Windows, con un mejor sistema de mensajes que javac.

Opciones del compllador La sintaxis del comando de compilación es la siguiente: javac [opciones] [fuente.java] [Sarchivoargs] Siendo:



opciones:

opciones de la línea de comandos.



fuente:

uno o más archivos fuente para compilar. Los sufijos de los archivos de código fuente deben ser java y para los archi vos de clases debe ser class. se



@archivoargs

uno o más archivos que listan las opciones.

Cuando se quieren compilar varios archivos fuente se utiliza un archivo para incluir los nombres de archivo, separando los nombres por espacios o fin de línea y luego se utiliza el archivo en el comando javac, precedido con un carácter @. De modo predeterminado, el compilador coloca la salida compilada en la mis ma carpeta que el código fuente. Esto se puede modificar con el parámetro -d. Veamos ahora las principales opciones del comando javac. Podemos pasar parámetros en la línea de comandos, pero eso no significa que elprograma los utilizará con seguridad. Si la aplicación no contempla el uso de parámetros, los datos que pasemos desde la linea de comandos no tendrán ningún efecto.

-classpath rutaacceso La opción olasspath especifica en dónde debe buscar javac las clases que no son extensiones de Java y que están referenciadas en el código fuente que se quiere compilar. Las clases pueden estar en carpetas o en archivos zip dentro de la ruta de acceso especificada. En el parámetro rutaacceso se pueden especificar varias carpetas; en Unix separadas por dos puntos y en Windows por punto y coma. En la opción classpath colocada en el comando javac se superpone a lo espe cificado en la variable de entorno CLASSPATH.

58

Java 2. Curso de iniciación

Lo normal es que si se especifica classpath entre las rutas de acceso indi cadas en el parámetro se incluya la carpeta predeterminada de clases, además de las rutas de acceso que se quieran añadir. Si se omite esta opción se utiliza el valor de la variable de entorno CLASSPATH y si ésta no se especificó se utiliza la car peta vigente. Cuando en la opción -classpath o en la variable de entomo CLASSPATH

se especifican varias rutas de acceso, la búsqueda comienza con la primera ruta de acceso especificada y después sigue en orden; cuando se encuentra lo buscado, se interrumpe la búsqueda seeuencial, por lo que el orden de codificación es impor tante.

-d carpeta La opción -d especifica la carpeta raíz en la que javac colocará los archivos compilados. Esta opción se utiliza cuando se quiere colocar los archivos compila dos en una carpeta diferente a la del código fuente.

-encoding nombre Especifica el nombre de la codificación del archivo fuente, por ejemplo, UTF8. Si no se especifica se usa el convertidor predeterminado de la plataforma. -9

La opción -g añade información de depuración, incluyendo variables locales. De manera predeterminada, sólo se genera información de los números de línea y del archivo fuente.

También admite el formato -g;(palabraClave): siendo palabraClave uno de es tos valores:



none:

No genera ninguna información de depuración.



source:

Información de depuración del archivo fuente.



lines:

Información de depuración del número de línea.



vars:

Información de depuración de las variables locales.

-nowarn

Desactiva los mensajes de advertencia. -source versión

Especifica la versión del código que se debe aceptar. Los valores del parámetro versión son los siguientes:

JDK

59

1.3:

El compilador no acepta aserciones y otras funcionalidades del lenguaje incluidas después de la versión JDK 1.3.

1.4:

El compilador acepta aserciones, las que se incluyeron en el JDK 1.4.

1.5:

El compilador acepta genéricos y otras funcionalidades incluidas en la versión 1.5. Es el valor predeterminado.

5:

Otro modo de indicar 1.5.

-/opcion-java Javac pasa al intérprete la cadena opción-java. Esta opción no se puede incluir en los archivos de argumentos.

Ejemplos de compilación Ya hemos visto cómo se compila un único programa. Ahora veremos cómo rea lizar una compilación múltiple. Primero los haremos con un comando javac con dos parámetros (los nombres de los programas) y después haremos la misma com pilación pero utilizando un archivo de argumentos. El resultado es el mismo en ambos casos.

C:>javac Holal.java Hola2.java

Si esos dos programas fuesen los únicos en la carpeta podríamos utilizar este comando:

C:>javac *.java

Utilizando un archivo de argumentos: C:>javac @archivol

El contenido del archivo archivo 1 es el siguiente: Holal.java Hola2.java

Si quisiéramos definir opciones podríamos hacer lo siguiente: C:>javac @opciones1 @archivol

60

Java 2. Curso de iniciación

El contenido del archivo opciones1 puede ser el siguiente: -grsource

-d c:\misclases -nowam

El contenido del archivo archivo 1 puede ser el siguiente: Holal.java Hola2.java

Variable de entorno Classpath La ruta de acceso a las clases se puede establecer de dos maneras: ■

Con la opción -classpath del compilador.



Con la variable de entomo classpath.

El resultado de ambas alternativas es equivalente pero la opción del compilador

permite una mejor personalización, ya que la segunda alternativa actúa de modo general.

Para asignar la variable de entomo se utiliza: C:>set

CLASSPATH=rutaaccesoI;rutaacceso2...

Las mtas de acceso corresponden a archivos .jar, .zip o .class.

En el caso de archivo .jar o .zip que contienen archivos de clases, la mta de acceso corresponde al archivo contenedor. En el caso de archivo .class pueden presentarse dos alternativas: ■

Si las clases se encuentran en un paquete con nombre, la mta de acceso co rresponde a la carpeta que contiene el paquete raíz (el primer paquete en el nombre completo del paquete).



Se indica directamente la carpeta en donde se encuentran las clases. Para limpiar la variable de entomo CLASSPATH:

C:>set

CLASSPATH=

En Windows también se puede asignar o desasignar la variable CLASSPATH desde el Panel de control.

La variable de entomo Classpath tiene menor prioridad que la opción en el propio comando. Por otra parte, el orden de búsqueda de las clases es el siguiente:

JDK

61

1. Clases de la plataforma Java 2. Clases de extensión Java

3. Classpath.

Compilación con un ¡DE Un entorno de desarrollo integrado (IDE, del inglés Integrated Development Environment) incorpora en un único programa las herramientas básicas para reali zar todo el proceso de desarrollo: como mínimo, el editor de texto, el compilador, el ejecutor y el depurador. Todo el conjunto de herramientas en una única interfaz.

En la actualidad existen muchos IDE para Java que incorporan no sólo un gru po básico de herramientas sino que incluyen muchas extensiones de diverso nivel de utilidad. El programador Java ya muy acostumbrado a la línea de comandos a veces no incrementa su productividad mediante el uso del IDE, pero por lo general permite un desarrollo más organizado y se logra un mejor rendimiento general. NetBeans es un IDE que se descarga junto con el JDK y tiene la ventaja de ser bueno, gratuito y sirve para Unix y Windows. Es el IDE que utilizaremos en este libro.

Eclipse es otro IDE para Java, y otros lenguajes, utilizable en varias platafor mas, desarrollado originalmente por IBM y es la base de un producto comercial denominado WebSphere. La elección del IDE es muchas veces una cuestión de preferencias personales; Eclipse tiende a poseer más funciones que NetBeans pero ése no es el único factor de elección. Para la plataforma Windows existen numerosos IDE para Java, ade más de los mencionados (JBuilder, Visual Cafe, Sun Studio, etc.). La tarea de compilación utilizando un IDE se reduce a abrir un archivo fuente y buscar el botón de compilación. Ningún parecido al uso de la línea de comandos y cuesta creer que siga habiendo programadores que prefieren la línea de coman dos a un buen IDE.

Ésta es la interfaz de NetBeans en el momento de compilar un programa, en la parte inferior se pueden observar los mensajes producidos por el compilador;

62

Java 2. Curso de iniciación

^ iiilfc

]E^tíi$ JSSntkK'' i$^

9^ Maieter

^

P -á -fí i> V V I

JSTLExample

c >^.

^

y

:+; L;^ WebPages ;

Web Services

Configuration Files :

Server Resources

:♦:•

Libraiies

L+"; -Ja Test LIbraries

parkage Pruebas;

íaU' ptiblic class Pruebal

pvfolic etatic voi« malníStríng argv[])

■OaOMi

KTJ£>f«wpfei3 i OpUov:^ fiad i-jcace ciis taaplace 'jnd&t

^ org.ed.mfcb

r^je Sour.'js Zxf.ivii'rii. and ?í.iaiaí;f:a'?n^ nci1-T.

S-^'''UtiIStringl.iava ;

i?r3.S

'■.hí

arad

• Ojiñíí. Vou