Você está na página 1de 21

ALGORTMICA II

SEMANA 3

Tema: Mensajes,
excepciones y mtodos estticos

Docente:
ALONSO RAL MELGAREJO
UNMSM Facultad de Ingeniera de Sistemas e Informtica EAP de Ingeniera de Sistemas

GALVN

KAIZEN [MEJORA

Ciclo 2013-II

ALGORTMICA II UNMSM

PALABRAS CLAVE Mensajes, mtodos, visibilidad, constructores, destructores, excepciones, clases y mtodos estticos. 1. Introduccin Hasta el momento comprendemos muy bien qu es una clase, cules son sus partes, y cmo podemos obtener instancias a partir de ellas. Extendamos ahora ms nuestros conocimientos sobre la POO formalizando algunos conceptos que ya hemos estado usando al programar. 2. Mensajes En el mundo real estamos rodeados de muchos objetos, donde cada uno puede quedar bien definido al listar sus atributos y mtodos, sin embargo, los objetos no son entidades aisladas, sino que tienen un entorno en donde existen e interactan con otros objetos, esta interaccin entre objetos es posible gracias al paso de mensajes. Un mensaje es un paso de informacin entre un objeto emisor hacia un objeto receptor, donde el objeto receptor recibe, interpreta y responde al mensaje, sin la necesidad de que el objeto emisor conozca la forma en cmo el objeto receptor procesa su solicitud. Todo mensaje tiene tres partes bien definidas: El objeto receptor del mensaje El mtodo que debe ejecutar el objeto receptor Los parmetros del mtodo

Veamos un ejemplo en donde podamos ver claramente estas tres partes, para esto definimos dos clases: la clase Programa y la clase Calculadora: Calculadora.java
public class Calculadora{

Hoy mejor que ayer, maana mejor que hoy

ALGORTMICA II UNMSM

/*Atributo que almacena todos los resultados que se han obtenido hasta ahora*/ private double[] historicoDeResultados; /*Atributo que indica cuntos resultados como mximo podr almacenar la calculadora*/ private int capacidadDeMemoria; /*Atributo que indica en que casilla de la memoria de histrico de resultados estamos*/ private int casillaDeMemoriaActual; /*Constructor por defecto*/ public Calculadora(){ /*Colocamos una capacidad mxima de memoria por defecto*/ this.capacidadDeMemoria = 10; /*Inicializamos el vector de histrico de resultados*/ this.historicoDeResultados = new double[this.capacidadDeMemoria]; /*Inicialmente estamos en la casilla cero*/ this.casillaDeMemoriaActual = 0; } /*Otro constructor*/ public Calculadora(int capacidadDeMemoria){ /*Colocamos la capacidad mxima de memoria*/ this.capacidadDeMemoria = capacidadDeMemoria; /*Inicializamos el vector de histrico de resultados*/ this.historicoDeResultados = new double[this.capacidadDeMemoria]; /*Inicialmente estamos en la casilla cero*/ this.casillaDeMemoriaActual = 0; } /*MTODOS PBLICOS*/ public double sumar(double a, double b){ double resultado = a+b; this.almacenarResultadoEnMemoria(resultado); return resultado; } public double restar(double a, double b){ double resultado = a-b; this.almacenarResultadoEnMemoria(resultado); return resultado; } public double multiplicar(double a, double b){ double resultado = a*b; this.almacenarResultadoEnMemoria(resultado); return resultado; } public double dividir(double a, double b){

Hoy mejor que ayer, maana mejor que hoy

ALGORTMICA II UNMSM

double resultado = a/b; this.almacenarResultadoEnMemoria(resultado); return resultado; } /*MTODOS PRIVADOS*/ private void almacenarResultadoEnMemoria(double resultado){ /*Verificamos si an hay espacio de memoria disponible*/ if(this.casillaDeMemoriaActual < this.capacidadDeMemoria){ /*Asignamos el resultado en la casilla actual*/ this.historicoDeResultados[this.casillaDeMemoriaActual] = resultado; /*Avanzamos en una unidad a la siguiente casilla de memoria disponible*/ this.casillaDeMemoriaActual++; }else{ /*Mostramos un mensaje sobre la memoria llena*/ System.out.println("La memoria se ha llenado, no se almacenar el resultado."); } } /*MTODOS GET Y SET*/ /* * Anlisis de qu mtodos get y set son necesarios: * * Para este problema en particular slo nos interesar * mostrar la capacidad total de la memoria y la casilla * de memoria actual de la calculadora, por lo tanto * slo necesitamos los mtodos GET de los atributos * "capacidadDeMemoria" y "casillaDeMemoriaActual", el * resto de mtodos GET Y SET no los necesitaremos. */ public int getCapacidadDeMemoria(){ return this.capacidadDeMemoria; } public int getCasillaDeMemoriaActual(){ return this.casillaDeMemoriaActual; } }

Programa.java
public class Programa { public static void main(String[] args){ /*Instanciamos una calculadora, con una capacidad de memoria de 100*/ Calculadora miCalculadora = new Calculadora(100); /* * Le envamos un mensaje al objeto "miCalculadora" para el * mtodo "sumar" con los parmetros "7" y "19" */ double resultado = miCalculadora.sumar(7, 19);

Hoy mejor que ayer, maana mejor que hoy

ALGORTMICA II UNMSM

} }

Analicemos esta lnea de nuestra clase Programa:


double resultado = miCalculadora.sumar(7, 19);

Aqu claramente podemos ver un mensaje enviado desde el objeto programa hacia el objeto miCalculadora, en donde vemos sus partes: Objeto receptor del mensaje: miCalculadora Mtodo que ejecuta el objeto receptor: sumar Parmetros del mtodo: 7; 19 Ahora, veamos el detalle interno del mtodo sumar: Mtodo sumar
public double sumar(double a, double b){ double resultado = a+b; this.almacenarResultadoEnMemoria(resultado); return resultado; }

Vemos que en la primera lnea se realiza la operacin de suma y se almacena en una variable llamada resultado, luego llamamos al mtodo del objeto llamado almacenarResultadoEnMemoria y le pasamos como parmetro el resultado, para que finalmente hagamos un return del resultado, sin embargo: AL OBJETO programa NO LE INTERESA NINGUNO DE ESTOS PASOS ALGORTMICOS DE CMO ES QUE INTERNAMENTE EL OBJETO miCalculadora EJECUTA LA OPERACIN DE SUMA Y ALMACENA EL RESULTADO EN LA MEMORIA, SIMPLEMENTE LE INTERESA SABER QU HACE EL MTODO Y QUE ESTE LO HACE DE FORMA CORRECTA. Esto ltimo es un gran ejemplo de encapsulacin, recordando que la encapsulacin es el ocultamiento de informacin de detalles innecesario de un objeto a otro objeto. Como hemos podido observar con este ejemplo, los mensajes son conceptos con los que anteriormente ya habamos trabajado, y slo los hemos definido formalmente.

Hoy mejor que ayer, maana mejor que hoy

ALGORTMICA II UNMSM

Algo ms que debemos notar en el ejemplo anterior es la declaracin del mtodo almacenarResultadoEnMemoria, lo cual nos lleva a nuestra siguiente punto de estudio, la visibilidad y su utilidad para poder encapsular nuestros objetos de forma correcta. 3. Visibilidad Primero entendamos de forma prctica este concepto por medio de nuestra clase Calculadora, especficamente enfoqumonos en sus mtodos: Calculadora.java
/*MTODOS PBLICOS*/ public double sumar(double a, double b){ double resultado = a+b; this.almacenarResultadoEnMemoria(resultado); return resultado; } public double restar(double a, double b){ double resultado = a-b; this.almacenarResultadoEnMemoria(resultado); return resultado; } public double multiplicar(double a, double b){ double resultado = a*b; this.almacenarResultadoEnMemoria(resultado); return resultado; } public double dividir(double a, double b){ double resultado = a/b; this.almacenarResultadoEnMemoria(resultado); return resultado; } /*MTODOS PRIVADOS*/ private void almacenarResultadoEnMemoria(double resultado){ /*Verificamos si an hay espacio de memoria disponible*/ if(this.casillaDeMemoriaActual < this.capacidadDeMemoria){ /*Asignamos el resultado en la casilla actual*/ this.historicoDeResultados[this.casillaDeMemoriaActual] = resultado; /*Avanzamos en una unidad a la siguiente casilla de memoria disponible*/ this.casillaDeMemoriaActual++; }else{ /*Mostramos un mensaje sobre la memoria llena*/ System.out.println("La memoria se ha llenado, no se almacenar el resultado.");

Hoy mejor que ayer, maana mejor que hoy

ALGORTMICA II UNMSM

} }

Vemos claramente dos divisiones, una llamada MTODOS PBLICOS, en donde cada mtodo es antecedido por la palabra reservada public y otra llamada MTODOS PRIVADOS en dnde el nico mtodo que hay es antecedido por la palabra reservada private. Recordemos la definicin de estos dos tipos de visibilidad que habamos estudiado anteriormente: Visibilidad public: El mtodo (o atributo) es accesible tanto dentro como fuera del objeto. Visibilidad private: El mtodo (o atributo) slo es accesible dentro del objeto. Modifiquemos nuestra clase Programa para ver qu pasa si tratamos de llamar al mtodo almacenarResultadoEnMemoria Programa.java
public class Programa { public static void main(String[] args){ /*Instanciamos una calculadora, con una capacidad de memoria de 100*/ Calculadora miCalculadora = new Calculadora(100); /*Tratamos de almacenar un resultado que no fue calculado por alguna de nuestras cuatro operaciones*/ miCalculadora.almacenarResultadoEnMemoria(33); } }

Como salida por consola obtenemos: Salida desde consola:


Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - almacenarResultadoEnMemoria(double) has private access in aplication.Calculadora at aplication.Programa.main(Programa.java:20) Java Result: 1

Hoy mejor que ayer, maana mejor que hoy

ALGORTMICA II UNMSM

Enfoqumonos en esta parte del texto: almacenarResultadoEnMemoria(double) application.Calculadora Este error nos est indicando que el mtodo almacenarResultadoEnMemoria tiene una visibilidad del tipo privada, y no podemos acceder a este mtodo desde afuera del objeto. Ahora, pensemos lo siguiente: nosotros queremos que nuestra calculadora almacene los resultados que obtenemos al realizar una de las cuatro operaciones, pero nada ms!, no queremos que el usuario pueda almacenar desde afuera algn nmero en nuestro espacio de memoria destinado a almacenar slo resultado de operaciones, por lo que inmediatamente nosotros pensamos en un mtodo private que se encargue de realizar el almacenamiento en memoria y no pueda ser llamado desde el exterior. Un claro ejemplo de ocultamiento de la informacin (encapsulacin) Por otro lado, s queremos que nuestro usuario pueda realizar las operaciones de suma, resta, multiplicacin y divisin, por lo que los mtodos que se encarguen de hacer esto debern de ser public, es decir, podrn ser accesados desde afuera de la clase. 4. Constructores y destructores Ya hemos trabajado con nuestros constructores de forma prctica en Java, y tambin ya sabemos que un constructor es un mtodo especial que nos sirve para poder inicializar los valores de los atributos del objeto. Ahora nos toca analizar ms detalladamente su naturaleza. Enfoqumonos en los constructores de nuestra clase Calculadora. Constructores de la clase Calculadora
/*Constructor por defecto*/ public Calculadora(){ /*Colocamos una capacidad mxima de memoria por defecto*/ this.capacidadDeMemoria = 10;

has

private

access

in

Hoy mejor que ayer, maana mejor que hoy

ALGORTMICA II UNMSM

/*Inicializamos el vector de histrico de resultados*/ this.historicoDeResultados = new double[this.capacidadDeMemoria]; /*Inicialmente estamos en la casilla cero*/ this.casillaDeMemoriaActual = 0; } /*Otro constructor*/ public Calculadora(int capacidadDeMemoria){ /*Colocamos la capacidad mxima de memoria*/ this.capacidadDeMemoria = capacidadDeMemoria; /*Inicializamos el vector de histrico de resultados*/ this.historicoDeResultados = new double[this.capacidadDeMemoria]; /*Inicialmente estamos en la casilla cero*/ this.casillaDeMemoriaActual = 0; }

Vemos que tenemos dos constructores: un constructor por defecto, y otro constructor que recibe un parmetro. Notemos algunas cosas: En primer lugar, el nombre para cada constructor es el mismo que el nombre de la clase. Tambin, gracias al concepto de polimorfismo podemos tener a estos dos constructores (mtodos) con el mismo nombre y diferente nmero y tipo de parmetros. Finalmente, cada uno se encarga de construir un objeto calculadora de diferentes formas, el primero lo construye con una capacidad de memoria de 10, mientras que el segundo con una capacidad de memoria que es ingresada. Ahora modifiquemos totalmente el constructor por defecto de la siguiente manera: Constructores de la clase Calculadora
/*Constructor por defecto*/ public Calculadora(){ this(10); } /*Otro constructor*/ public Calculadora(int capacidadDeMemoria){ /*Colocamos la capacidad mxima de memoria*/ this.capacidadDeMemoria = capacidadDeMemoria;

Hoy mejor que ayer, maana mejor que hoy

ALGORTMICA II UNMSM

/*Inicializamos el vector de histrico de resultados*/ this.historicoDeResultados = new double[this.capacidadDeMemoria]; /*Inicialmente estamos en la casilla cero*/ this.casillaDeMemoriaActual = 0; }

El funcionamiento de nuestra calculadora no ha variado en nada, sin embargo, ahora cuando se llama al constructor por defecto, este llamar al constructor que recibe como parmetro un entero, y le pasar como valor al nmero 10. Gracias a esto podemos ahorrar algunas lneas de cdigo. Ahora, regresemos a nuestro main: Programa.java
public class Programa { public static void main(String[] args){ /*Instanciamos una calculadora, con una capacidad de memoria de 100*/ Calculadora miCalculadora = new Calculadora(100); /* * Le envamos un mensaje al objeto "miCalculadora" para el * mtodo "sumar" con los parmetros "7" y "19" */ double resultado = miCalculadora.sumar(7, 19); /*Mostramos el resultado*/ System.out.println("El resultado es "+resultado); /*Liberamos la memoria de un objeto que ya no necesitamos*/ miCalculadora = null; } }

Y enfoqumonos en esta lnea:


miCalculadora = null;

Con esta lnea le estamos diciendo a Java que el objeto calculadora a partir de ahora no apunta a ninguna zona de memoria. Java trabaja con referencias hacia los objetos, al asignarle el valor de null le estamos diciendo a Java que ese objeto ya no ser utilizado y que ya no necesitamos acceder a la zona de memoria en dnde este objeto est asignado, pero: Una cosa es decirle a Java que ya no queremos acceder

Hoy mejor que ayer, maana mejor que hoy

ALGORTMICA II UNMSM

a la zona de memoria en dnde est el objeto, y otra cosa diferente es liberar (eliminar) de la memoria a ese objeto! Tradicionalmente en C tendramos que escribir un mtodo especial que se encargue de liberar esta zona de memoria, sin embargo Java utiliza el Garbage Collector, el cual es un mecanismos propio de Java que cada cierto tiempo busca zonas de memoria que contengan objetos los cuales ya no tengan ninguna referencia hacia ellos, es decir, que estn en null. Una vez que encuentra qu objetos estn sin referencias (es decir, en null), Java procede a liberar ese especio de memoria. En pocas palabras, nosotros no nos preocupamos de liberar la memoria, Java se encargar de hacerlo por s mismo. 5. Excepciones Las excepciones son flujos anormales de comportamiento de nuestros programas. Al programar es probable que en tiempo de ejecucin ocurran estas excepciones, por lo que debemos de tener una herramienta para manejarlas, por suerte Java nos brinda esta herramienta. Definamos una nueva clase llamada CalculadoraDeEnteros, con slo un mtodo, el de dividir: CalculadoraDeEnteros.java
public class CalculadoraDeEnteros { public int dividir(int a, int b){ int resultado = 0; resultado = a/b; return resultado; } }

Ahora definamos nuestro main: Programa.java


public class Programa { public static void main(String[] args){ /*Instanciamos una calculadora de enteros*/

Hoy mejor que ayer, maana mejor que hoy

ALGORTMICA II UNMSM

CalculadoraDeEnteros calculadora = new CalculadoraDeEnteros(); /*Realizamos la operacin de divisin*/ int resultado = calculadora.dividir(20, 5); /*Mostramos el resultado*/ System.out.println("El resultado es: "+resultado); } }

Como resultado por consola obtenemos: Salida desde consola:


El resultado es: 5

Ahora, probemos una nueva divisin, una en el cual el dividendo es cero. Programa.java
public class Programa { public static void main(String[] args){ /*Instanciamos una calculadora de enteros*/ CalculadoraDeEnteros calculadora = new CalculadoraDeEnteros(); /*Realizamos la operacin de divisin*/ int resultado = calculadora.dividir(20, 0); /*Mostramos el resultado*/ System.out.println("El resultado es: "+resultado); } }

Como salida obtenemos: Salida desde consola:


Exception in thread "main" java.lang.ArithmeticException: / by zero at application.CalculadoraDeEnteros.dividir(CalculadoraDeEnteros.java:16) at application.Programa.main(Programa.java:19) Java Result: 1

Veamos esta lnea: Exception in thread "main" java.lang.ArithmeticException: / by zero

Hoy mejor que ayer, maana mejor que hoy

ALGORTMICA II UNMSM

Java nos est indicando que se ha producido una excepcin de divisin por cero, ya que es imposible dividir un nmero por cero. Una forma correcta de poder evitar esto es por medio de un if: CalculadoraDeEnteros.java
public class CalculadoraDeEnteros { public int dividir(int a, int b){ int resultado = 0; if(b != 0){ resultado = a/b; }else{ System.out.println("No puede realizar una divisin por cero"); } return resultado; } }

Con lo cual obtenemos como salida: Salida desde consola:


No puede realizar una divisin por cero El resultado es: 0

Otra forma correcta de hacer esto es por medio de una excepcin, tal como se muestra ahora: CalculadoraDeEnteros.java
public class CalculadoraDeEnteros { public int dividir(int a, int b){ int resultado = 0; try{ resultado = a/b; }catch(Exception e){ System.out.println("Se ha producido una excepcin, el detalle es el siguiente: "+e); } return resultado; } }

Con lo que ahora por la consola obtenemos:

Hoy mejor que ayer, maana mejor que hoy

ALGORTMICA II UNMSM

Salida desde consola:


Se ha producido una excepcin, el detalle es el siguiente: java.lang.ArithmeticException: / by zero El resultado es: 0

La diferencia con el if es que aqu obtenemos un detalle de la excepcin producida, sin embargo ambas formas son vlidas y depende del enfoque que le de cada programador. Analicemos la estructura de este nuevo bloque de cdigo que describe el tratamiento de excepciones: Bloque try - catch
try{ /*Cdigo que se trata (try) de ejecutar*/ }catch(Exception e){ /*Cdigo que captura (catch) las excepciones y trata de resolverlas*/ }

El tratamiento de las excepciones es todo un tema aparte que ser estudiado en su momento, sin embargo, por ahora nos basta con entender esto. 6. Una clase reusable que no necesita ser instanciada: los mtodos estticos A continuacin definiremos una clase muy til que nos permitir leer valores desde consola y tambin generar nmeros aleatorios entre cierto rango. La implementacin de esta clase es como sigue: Utilitarios.java
public class Utilitarios { public int generarAleatorioInt(int desde, int hasta){ if(hasta >= 0){ return (int) generarAleatorioDouble(desde, hasta+1); }else{ return (int) generarAleatorioDouble(desde-1, hasta); } } public double generarAleatorioDouble(int desde, int hasta){ if(desde*hasta >= 0){ return (Math.random()*(hasta - desde) + desde); }else{ return (Math.random()*(hasta - (desde - 1)) + desde - 1);

Hoy mejor que ayer, maana mejor que hoy

ALGORTMICA II UNMSM

} } public String leerString(String mensaje){ Scanner scanner = new Scanner(System.in, "ISO-8859-1"); System.out.print(mensaje.trim()+" "); return scanner.nextLine(); } public double leerDouble(String mensaje){ return Double.parseDouble(leerString(mensaje)); } public int leerInt(String mensaje){ return Integer.parseInt(leerString(mensaje)); } public boolean leerBoolean(String mensaje){ return Boolean.parseBoolean(leerString(mensaje)); } }

No nos interesa saber cmo trabaja internamente esta clase, slo sabemos que cada mtodo cumple con su objetivo. Probemos ahora algunos de nuestros mtodos: Programa.java
public class Programa { public static void main(String[] args){ /*Instanciamos un utilitario*/ Utilitarios miObjetoUtilitario = new Utilitarios(); /*Generaremos un nmero aleatorio*/ /*Leemos los datos desde consola*/ System.out.println("Datos del rango"); int desde = miObjetoUtilitario.leerInt("Ingrese la cota inferior del rango:"); int hasta = miObjetoUtilitario.leerInt("Ingrese la cota superior del rango:"); /*Generamos el nmero aleatorio*/ System.out.println("Nmero aleatorio generado: "+miObjetoUtilitario.generarAleatorioInt(desde, hasta)); } }

Con lo que deberamos de obtener por salida un nmero aleatorio que est entre el rango ingresado.

Hoy mejor que ayer, maana mejor que hoy

ALGORTMICA II UNMSM

Ahora, mejoremos nuestra clase Utilitarios, emulando la implementacin de la clase Math de java. Sabemos que con la clase Math de java podemos generar un nmero aleatorio entre [0;1> con el mtodo random de la siguiente manera:
System.out.println("Nmero aleatorio: "+Math.random());

Claramente podemos notar que llamamos directamente al mtodo random desde la clase Math, sin la necesidad de instanciar un objeto de la clase Math, ya que el mtodo random no es un mtodo propio de un nico objeto, sino que es un mtodo de clase, es decir, un mtodo que puede ser accedido directamente desde la clase sin la necesidad de instanciar un objeto. A estos mtodos de clase los conocemos como mtodos estticos. Adaptemos nuestra clase Utilitarios para que posea mtodos estticos como la clase Math de Java: Utilitarios.java
public class Utilitarios { public static int generarAleatorioInt(int desde, int hasta){ if(hasta >= 0){ return (int) generarAleatorioDouble(desde, hasta+1); }else{ return (int) generarAleatorioDouble(desde-1, hasta); } } public static double generarAleatorioDouble(int desde, int hasta){ if(desde*hasta >= 0){ return (Math.random()*(hasta - desde) + desde); }else{ return (Math.random()*(hasta - (desde - 1)) + desde - 1); } } public static String leerString(String mensaje){ Scanner scanner = new Scanner(System.in, "ISO-8859-1"); System.out.print(mensaje.trim()+" "); return scanner.nextLine(); } public static double leerDouble(String mensaje){ return Double.parseDouble(leerString(mensaje)); } public static int leerInt(String mensaje){ return Integer.parseInt(leerString(mensaje)); }

Hoy mejor que ayer, maana mejor que hoy

ALGORTMICA II UNMSM

public static boolean leerBoolean(String mensaje){ return Boolean.parseBoolean(leerString(mensaje)); } }

Para declarar a un mtodo como esttico en una clase, debemos de colocar la palabra reservada static despus del tipo de visibilidad que tiene el mtodo. Ahora ya podemos llamar a nuestros mtodos sin la necesidad de instanciar un objeto de la clase Utilitarios. Programa.java
public class Programa { public static void main(String[] args){ /*Generaremos un nmero aleatorio*/ /*Leemos los datos desde consola*/ System.out.println("Datos del rango"); int desde = Utilitarios.leerInt("Ingrese la cota inferior del rango:"); int hasta = Utilitarios.leerInt("Ingrese la cota superior del rango:"); /*Generamos el nmero aleatorio*/ System.out.println("Nmero aleatorio generado: "+Utilitarios.generarAleatorioInt(desde, hasta)); } }

Como vemos, ya no hemos instanciado un objeto de la clase Utilitarios, sino que llamamos directamente al mtodo desde la clase. As como los mtodos pueden ser declarados estticos, los atributos tambin pueden serlo y es lo que veremos a continuacin. 7. Atributos estticos Al igual que los mtodos estticos, los atributos estticos son atributos que no pertenecen a un determinado objeto, sino que pertenecen a toda la clase y objetos que de ella se instancien, por eso tambin son conocidos como atributos de clase.

Hoy mejor que ayer, maana mejor que hoy

ALGORTMICA II UNMSM

Modifiquemos nuestra clase Utilitarios para agregarle un atributo esttico:

Utilitarios.java
public class Utilitarios { private static double pi = 3.1416; public static double getPi(){ return Utilitarios.pi; } public static int generarAleatorioInt(int desde, int hasta){ if(hasta >= 0){ return (int) generarAleatorioDouble(desde, hasta+1); }else{ return (int) generarAleatorioDouble(desde-1, hasta); } } public static double generarAleatorioDouble(int desde, int hasta){ if(desde*hasta >= 0){ return (Math.random()*(hasta - desde) + desde); }else{ return (Math.random()*(hasta - (desde - 1)) + desde 1); } } public static String leerString(String mensaje){ Scanner scanner = new Scanner(System.in, "ISO-8859-1"); System.out.print(mensaje.trim()+" "); return scanner.nextLine(); } public static double leerDouble(String mensaje){ return Double.parseDouble(leerString(mensaje)); } public static int leerInt(String mensaje){ return Integer.parseInt(leerString(mensaje)); } public static boolean leerBoolean(String mensaje){ return Boolean.parseBoolean(leerString(mensaje)); } }

Programa.java
public class Programa { public static void main(String[] args){ /*Valor de PI*/ System.out.println("Valor de PI: "+Utilitarios.getPi());

Hoy mejor que ayer, maana mejor que hoy

ALGORTMICA II UNMSM

} }

Hemos agregado un atributo esttico que almacena el valor de pi y su correspondiente mtodo get para obtener el valor, sin embargo no posee mtodo set ya que eso implicara que podemos modificar el valor de pi. Tambin sabemos que pi ms que una variable, es una constante, ya que siempre mantendr su valor original, y Java nos permite crear constantes, as que podemos modificar nuevamente nuestro cdigo. Utilitarios.java
public class Utilitarios { public static final double PI = 3.1416; public static int generarAleatorioInt(int desde, int hasta){ if(hasta >= 0){ return (int) generarAleatorioDouble(desde, hasta+1); }else{ return (int) generarAleatorioDouble(desde-1, hasta); } } public static double generarAleatorioDouble(int desde, int hasta){ if(desde*hasta >= 0){ return (Math.random()*(hasta - desde) + desde); }else{ return (Math.random()*(hasta - (desde - 1)) + desde 1); } } public static String leerString(String mensaje){ Scanner scanner = new Scanner(System.in, "ISO-8859-1"); System.out.print(mensaje.trim()+" "); return scanner.nextLine(); } public static double leerDouble(String mensaje){ return Double.parseDouble(leerString(mensaje)); } public static int leerInt(String mensaje){ return Integer.parseInt(leerString(mensaje)); } public static boolean leerBoolean(String mensaje){ return Boolean.parseBoolean(leerString(mensaje)); }

Hoy mejor que ayer, maana mejor que hoy

ALGORTMICA II UNMSM

Programa.java
public class Programa { public static void main(String[] args){ /*Valor de PI*/ System.out.println("Valor de PI: "+Utilitarios.PI); } }

Analicemos esta lnea de nuestra clase Utilitarios:


public static final double PI = 3.1416;

Vemos que ahora la visibilidad del atributo de clase es del tipo public, por lo que podemos acceder a l sin la necesidad de un mtodo get, y tambin podemos asignarle valores sin la necesidad de un mtodo set, sin embargo, tambin vemos la palabra reservada final. Esta palabra reservada le indica a Java que el valor con el que est siendo inicializada la variable no cambiar nunca durante la ejecucin del programa, en otras palabras, no ser una variable, sino una constante. Si ahora tratamos de asignarle un valor a nuestra constante de esta manera: Programa.java
public class Programa { public static void main(String[] args){ /*Valor de PI*/ Utilitarios.PI = 2.71; } }

Obtendremos el siguiente error: Salida desde consola


Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - cannot assign a value to final variable PI at application.Programa.main(Programa.java:16) Java Result: 1

Hoy mejor que ayer, maana mejor que hoy

ALGORTMICA II UNMSM

cannot assign a value to final variable PI: No se puede asignar un valor a la variable final PI.

Hoy mejor que ayer, maana mejor que hoy

Você também pode gostar