La Biblioteca Estándar

Objetivos: Mostrar como se programa una aplicación estándar de Java, cuando no se dispone de la biblioteca del curso.

Temas:


Programación de aplicaciones que sólo usan la biblioteca estándar

Cuando por alguna razón no se dispone de la biblioteca del curso, hay que evitar el uso de la mayoría de las funciones, procedimientos y clases que se usaron en el curso porque de usarlas el compilador desplegará un mensaje de error. Ejemplos de funciones de la biblioteca del curso son: print, equals, compare, length, substring, sin, cos, exp, etc. Ejemplos de clases son Program, TextReader, TextWriter, Array, etc.

A continuación se entrega en forma resumida los cambios que hay que hacer a los programas para poder trabajar sin la biblioteca del curso.


Ejecución de programas

Para ejecutar un programa se debe invocar:

    java MiClase arg0 arg1 ...
MiClase debe ser el nombre de una clase que tiene definido un método con nombre main y que recibe un arreglo de strings como parámetro. Es decir, la clase debe tener la siguiente forma:

    public class MiClase {
      ...
      public static void main(String[] args) {
        ...
      }
      ...
    } 
El método main debe ser static y debe recibir como parámetros un arreglo de strings. El comando java invoca este método estático pasándole como parámetro un arreglo con los argumentos arg0, arg1, etc.

Por ejemplo el siguiente programa despliega los argumentos que se especifica al invocar el programa:

    public class Echo {
      public static void main(String[] args) {
        for (int i= 0; i<args.length; i++)
          System.out.println(args[i]);
      }
    } 
Observaciones:


Aplicaciones gráficas

Para programar aplicaciones gráficas se usa el siguiente patrón:

    public class MiVentana extends Frame {
      ... declaración de widgets ... (no se declara la ventana)
      public MiVentana() { // constructor
        setLayout(...);    // establece organizador
        setTitle("...");   // titulo de la ventana
        ... crear widgets ...
        ... agregar widgets con add(...) ...
        ... capturar eventos ...
      }
      public static void main(String[] args) {
        Frame vent= new MiVentana(); // (*)
        vent.pack();
        vent.show();
      }
    }
Observe que la clase que implementa la aplicación extiende de la clase Frame y por lo tanto representa la ventana que se muestra en pantalla. La ventana se crea típicamente en el método main en (*). El resto de la interfaz se crea en el constructor de la clase.

En la clase no es necesario declarar una variable de instancia con nombre vent como se hacía antes, porque la ventana está siempre referenciada por el identificador this. Por esta misma razón, no se debe invocar vent.setLayout(...) o vent.add(...). Cuando el objeto de la invocación es la ventana se puede colocar this.setLayout(...) o simplemente setLayout(...).

Ejercicio:

Estudie el programa StdGui.java que ha sido programado utilizando exclusivamente clases de la biblioteca estándar. Compile y ejecute el programa.


Conversión de programas a la biblioteca estándar

Además de println, la clase Program también suministra otras funciones y/o procedimientos como readLine, readInt, sin, cos, trunc, substring, etc. El siguiente cuadro muestra como reemplazar algunas de estas expresiones por métodos que sí están en la biblioteca estándar de clases:

con la biblioteca de CC10A con la biblioteca estándar Significado
println(...); System.out.println(...); despliega en pantalla
Tipo x= readTipo(); No hay equivalente simple Lectura de la pantalla
max(..., ...) Math.max(..., ...) Calcula el valor máximo
min(..., ...) Math.min(..., ...) Calcula el valor mínimo
abs(...) Math.abs(...) Calcula el valor absoluto
otros(...) Math.otros(...) Idem para otras funciones matemáticas como sin, cos, log, etc.
length(s) s.length() calcula el largo de un string
substring(s, ini, len) s.substring(ini, ini+len) entrega un substring de s
compare(r, s) r.compareTo(s) compara strings
equals(r, s) r.equals(s) determina si r y s son iguales
otros(s, ...) s.otros(...) Idem para otras funciones con strings
parseInt(...) Integer.parseInt(...) convierte de string a entero
parseDouble(...) new Double(...).doubleValue() convierte de string a real
exit(); System.exit(0); termina el programa
fatalError("..."); throw new Error("...") termina el programa con un mensaje de error

Las clases que aparecen mencionadas son parte del paquete java.lang. No es necesario hacer un import de este paquete porque el compilador lo agrega automáticamente. Para usar clases que se encuentren en cualquiera de los demás paquetes es necesario hacer explícitamente el import.

La biblioteca estándar

La biblioteca estándar de Java es un conjunto de paquetes de clases que deben estar en todas las instalaciones de Java (no así la biblioteca del curso). Esta biblioteca se va enriqueciendo con el tiempo, pero no todas las instalaciones se han actualizado a la última versión de la biblioteca. Por ejemplo, la versión de la biblioteca que está instalada en el Centro de Computación de la facultad es la 1.1 (publicada el año 97). La versión más reciente es la 1.2 (publicada el año 99) y la versión 1.3 está en fase de prueba.

La API de la versión 1.1 se encuentra disponible localmente en http://sunsite.dcc.uchile.cl/SunSITE/java/docs/jdk1.1.8/docs/api/packages.html y la versión 1.2 en http://sunsite.dcc.uchile.cl/SunSITE/java/docs/jdk1.2.2/docs/api/overview-summary.html.

La biblioteca se organiza en paquetes. Los nombres de estos paquetes tienen la forma ``java.nombre'' porque ésta es la forma de distinguir los paquetes estándares de los que no son estándares.

En la documentación cada paquete aparece como un link. Si Ud. sigue el link asociado a java.lang aparecerán todas las clases de el paquete java.lang. Por ejemplo aparecerán las clases Math y String. Si Ud. sigue estos links aparecerán el conjunto de constructores, métodos y otra información asociada a estas clases.

Cuando se programa en Java es imprescindible tener a mano esta documentación puesto que se requiere frecuentemente para consultar acerca de los métodos que ofrece una clase, o su clase base, etc. Consulte el rincón de Java para obtener esta documentación. La misma documentación se puede obtener directamente de Sun en http://java.sun.com/.


Entrada y salida estándar en Java

Por entrada/salida se entiende todo lo que es lectura y escritura en archivos u opcionalmente en la pantalla. La entrada/salida se implementa por medio de las clases ubicadas en el paquete java.io. Aquí se encuentra un número interminable de clases para leer y escribir de mil formas los archivos. Lamentablemente todas estas formas resultan más complicadas que la que se vió en el curso. Por ejemplo para leer líneas de la pantalla use:

    public static void main(String[] args) throws IOException {
      BufferedReader in=
                  new BufferedReader(new InputStreamReader(System.in), 1);
      for(;;) {
        String lin= in.readLine();
        if (lin==null)
          break;
        ... // procesar la línea
      }
      in.close();
    }
Lamentablemente el objeto in no posee métodos readInt o readDouble para leer enteros reales de la consola. Ud. debe descomponer las líneas en tokens por medio de la clase StringTokenizer (en java.util). Esta última clase es similar a la clase WordParser que se usó en el curso (pero no equivalente). El resultado son strings que debe convertir a números usando los métodos Integer.parseInt() o new Double(...).doubleValue().

Observe que el método main necesita una cláusula throws IOException porque de otra forma se producirá un error en la compilación del programa. Esto se debe a que Java requiere que los programas capturen las excepciones. Las excepciones son condiciones de borde que ocurren rara vez pero que los programas deben considerar para evitar errores indeseados durante la ejecución.

Estudie el programa Lee.java. Este programa lee una línea de la consola y la repite en la misma consola.


Más información

Si Ud. necesita alguna vez programar en Java usando sólo la biblioteca estándar le recomiendo hacer los ejercicios propuestos que se ubican en http://www.dcc.uchile.cl/~lmateu/Java/Transparencias/index.htm. Ud. podrá repasar en estas páginas varios de los conceptos vistos en el curso usando la biblioteca estándar. También se explica lo mínimo que Ud. debe saber acerca de las excepciones para escribir programas que lean y escriban archivos en disco.

La información más completa acerca de como programar en el lenguaje Java es el tutorial oficial de Java auspiciado por Sun (en Inglés). Este tutorial se encuentra en: http://sunsite.dcc.uchile.cl/SunSITE/java/docs/tut-java122-sun/ Yo aprendí Java de este tutorial y nunca he terminado de leerlo. Cuando Ud. desee saber como se hace en Java para ..., entonces le recomiendo visitar este tutorial, porque es altamente probable que ahí sale como hacerlo.