Está en la página 1de 8

Algunas clases del API

Como se mencionó en un material anterior, el API facilita el trabajo de los desarrolladores


proporcionándoles clases que ya están construidas y que solo deben integrar en sus programas
sin necesidad de programar todo su comportamiento.

En este material se presentarán algunas clases ampliamente utilizadas del API de Java, con
métodos que pueden ser útiles en la mayoría de los programas. Las clases que se mostrarán
se encuentran en el paquete java.lang, por lo que no es necesario usar el import para trabajar
con ellas.

1. Clase Object

Esta clase es la clase padre de todas las clases en el sistema, incluso si no se indica con la
palabra extends.
Como todas las clases son hijas de Object todas pueden usar sus métodos y sobrescribirlos, si
es necesario. Algunos de los métodos de Object son:

 boolean equals(Object)

Este método se utiliza para comparar dos objetos. Por defecto se realiza la comparación de
acuerdo a las posiciones en memoria de los objetos, es decir, determina si dos variables están
referenciando al mismo objeto. Sin embargo, lo que se requiere normalmente es comparar los
valores de los objetos, y no solo sus referencias, por lo que debe sobrescribirse.

Por ejemplo, si se tiene una clase Rectángulo es posible sobrescribir este método para que
permita comprar dos rectángulos y retorne verdadero si las dimensiones de los rectángulos son
iguales.

Otro ejemplo de sobrescritura del método equals se encuentra en la clase String, y por eso para
comparar dos cadenas generalmente se usa el método equals y no el operador “==”.

Ejemplo:

/**
* La figura geométrica de un rectángulo, con largo y ancho.
* Esta clase no sobrescribe el método equals
* @author Sandra V. Hurtado
* @version 2016-05-09
*/
public class RectánguloSinEquals
{
private int largo
private int ancho;

1
/**
* Constructor de un objeto RectánguloSinEquals
* @param largo el largo, en centímetros, del rectángulo
* @param ancho el ancho, en centímetros, del rectángulo
*/
public RectánguloSinEquals(int largo, int ancho)
{
this.largo = largo;
this.ancho = ancho;
}
}

/**
* La figura geométrica de un rectángulo, con largo y ancho.
* Esta clase sobrescribe el método equals
* @author Sandra V. Hurtado
* @version 2016-05-09
*/
public class RectánguloConEquals
{
private int largo
private int ancho;

/**
* Constructor de un objeto RectánguloConEquals
* @param largo el largo, en centímetros, del rectángulo
* @param ancho el ancho, en centímetros, del rectángulo
*/
public RectánguloConEquals(int largo, int ancho)
{
this.largo = largo;
this.ancho = ancho;
}

/**
* Compara este rectángulo con otro, definiendo que
* son iguales si su largo y ancho son iguales
* @param objeto otro objeto que se comparará con este
* @return un true si los objetos son iguales, false si no.
*/
public boolean equals(Object objeto)
{
// primero valida que el objeto sea rectángulo
if ( !(objeto instanceof RectánguloConEquals) )
{
return false;
}

2
RectánguloConEquals otro = (RectánguloConEquals)objeto;
if (largo == otro.largo && ancho == otro.ancho)
{
return true;
}
else
{
return false;
}
}
}

/**
* Programa que prueba comparar rectángulos
* @author Sandra V. Hurtado
* @version 2016-05-09
*/
public class EjemploEquals
{
public static void main(java.lang.String[] args)
{
// Se crean dos objetos RectánguloSinEquals y se comparan
RectánguloSinEquals rectángulo1 = new RectánguloSinEquals(10,5);
RectánguloSinEquals rectángulo2 = new RectánguloSinEquals(10,5);

if (rectángulo1.equals(rectángulo2))
{
System.out.println("Los rectángulos 1 y 2 son el mismo");
}
else
{
System.out.println("Los rectángulos 1 y 2 no son el mismo");
}

// Se tiene una nueva referencia al objeto rectángulo1


RectánguloSinEquals rectángulo3 = rectángulo1;

if (rectángulo1.equals(rectángulo3))
{
System.out.println("Los rectángulos 1 y 3 son el mismo");
}
else
{
System.out.println("Los rectángulos 1 y 3 no son el mismo");
}

3
// Se crean dos objetos RectánguloConEquals y se comparan
RectánguloConEquals rectánguloA = new RectánguloConEquals(10,5);
RectánguloConEquals rectánguloB = new RectánguloConEquals(10,5);

if (rectánguloA.equals(rectánguloB))
{
System.out.println("Los rectángulos A y B son iguales");
}
else
{
System.out.println("Los rectángulos A y B son diferentes");
}
}

La salida de este programa es:


Los rectángulos 1 y 2 no son el mismo
Los rectángulos 1 y 2 son el mismo
Los rectángulos A y B son iguales

Como puede verse, en el primer caso las variables rectángulo1 y rectángulo2 referencian
objetos diferentes y por lo tanto al compararlos dice que no son el mismo, aunque tengan el
mismo valor en sus atributos. Sólo cuando las variables que se comparan referencian al mismo
objeto (el caso de rectángulo1 y rectángulo3), el método equals retorna verdadero.

En el último caso, como se redefinió el método equals, se comparan los valores de los atributos,
y por lo tanto la comparación indica que los objetos rectánguloA y rectánguloB son iguales.

 int hashCode()

Este método retorna un número entero, denominado código hash, que es un valor utilizado para
encontrar rápidamente un objeto dentro de un grupo.

El código hash, para todo objeto, debe cumplir con las siguientes condiciones:
- Es un valor que depende únicamente del objeto, no de elementos externos (como otros
objetos).
- Debe ser compatible con la definición de “igualdad” entre dos objetos que se ha dado en el
método equals, es decir, si dos objetos son iguales deben retornar el mismo código hash.

El método hashCode definido en la clase Object retorna un valor que depende de la posición de
los objetos en memoria, pero esto hace que dos objetos con valores iguales en sus atributos
tengan códigos hash diferentes. Por esta razón, siempre que se sobrescribe el método equals
debería sobrescribirse también el método hashCode, y viceversa.

En el caso de la clase Rectángulo, por ejemplo, si se definió que dos rectángulos son iguales
cuando tienen los mismos valores en su alto y ancho, entonces debe redefinirse el código hash
para que sea un valor entero que dependa de estos dos valores.

Ejemplo:

Suponga que tiene las mismas clases del ejemplo anterior, pero ahora la clase
RectánguloConEquals sobreescribe el método hashCode, como se observa a continuación:

4
/**
* La figura geométrica de un rectángulo, con largo y ancho.
* Esta clase sobrescribe los método equals y hashCode
* @author Sandra V. Hurtado
* @version 2016-05-09
*/
public class RectánguloConEquals
{
private int largo
private int ancho;

/**
* Constructor de un objeto RectánguloConEquals
* @param largo el largo, en centímetros, del rectángulo
* @param ancho el ancho, en centímetros, del rectángulo
*/
public RectánguloConEquals(int largo, int ancho)
{
this.largo = largo;
this.ancho = ancho;
}

/**
* Compara este rectángulo con otro, definiendo que
* son iguales si su largo y ancho son iguales
* @param objeto otro objeto que se comparará con este
* @return un true si los objetos son iguales, false si no.
*/
public boolean equals(Object objeto)
{
// primero valida que el objeto sea rectángulo
if ( !(objeto instanceof RectánguloConEquals) )
{
return false;
}

RectánguloConEquals otro = (RectánguloConEquals)objeto;


if (largo == otro.largo && ancho == otro.ancho)
{
return true;
}
else
{
return false;
}
}

/**
* Para obtener el código hash para un rectángulo,
* a partir de sus valores de largo y ancho.

5
* @return Un valor entero único para cada rectángulo
*/
public int hashCode()
{
String concatenación = "" + largo +"0"+ ancho;
return Integer.parseInt(concatenación);
}

Este método es compatible con el método equals, y por lo tanto, es posible determinar si dos
elementos son iguales comparando sus código hash.

Ejercicio

Escriba una clase con el método main donde cree dos objetos de la clase RectánguloSinEquals
con el mismo largo y ancho, y luego muestre el hashCode de cada uno.
Posteriormente, en el mismo método main, cree dos objetos de la clase RectánguloConEquals
con el mismo largo y ancho, y luego muestre el hashCode de cada uno.

2. Clase Math

Esta clase contiene varias funciones y constantes matemáticas muy útiles, incluyendo algunas
rutinas trigonométricas, redondeo, etc.

Todos los atributos y métodos de esta clase son estáticos, es decir, pueden ser invocados sin
necesidad de tener un objeto de la clase. Por ejemplo, para usar el método que devuelve la raíz
cuadrada, llamado sqrt, sería:

double raíz = Math.sqrt(27.8);

En general, siempre que se requiere incluir alguna función matemática en un programa primero
se busca en esta clase o en otras clases del API para identificar si dicha función ya existe o si
puede simplificarse.

Ejemplo:

/**
* Clase para porbar algunas funciones Math
* @author Sandra V. Hurtado
* @version 2016-05-09
*/
class EjemploMath
{
public static void main(String args[])
{

6
double potencia = Math.pow(2,4); // Elevar 2 a la 4
System.out.println(Math.PI); // Constante PI
}
}

Ejercicio

 Busque el método de la clase Math que permite convertir un ángulo medido en grados a su
medición aproximada en radianes.

3. Las clases “Wrapper”

En el paquete java.lang se tienen clases que permiten manejar los valores (tipos básicos) como
objetos, es decir, funcionan como una “máscara” que oculta en su interior un valor simple. Estas
clases son:

 Boolean  boolean
 Character  char
 Byte  byte
 Short  short
 Integer  int
 Long  long
 Float  float
 Double  double

Estas clases se crearon para proveer un “recubrimiento” (wrapper) a los valores de datos por
varias razones:
- Muchas utilidades de Java requieren objetos, y con estas clases ya es posible que los tipos
primitivos sean tratados como objetos.
- Permiten incluir algunas constantes y métodos útiles relacionados con los tipos básicos. Por
ejemplo, la clase Integer tiene constantes para los valores mínimo y máximo permitidos en
los enteros. Otras utilidades importantes son las que permiten convertir tipos básicos a
String y viceversa.

Una vez se ha creado un objeto wrapper con un valor inicial este valor no
puede ser cambiado. Para nuevos valores pueden crearse nuevos objetos.

Ejemplos:

 Creación de un objeto Integer que guarda el valor entero 42. Luego se obtiene de nuevo el
valor entero (tipo de dato primitivo int) a partir del objeto Integer:

7
Integer objetoEntero;
int valor = 42;

// creación de un objeto Integer que “recubre” el valor 42:


objetoEntero = new Integer(42);

// Obtener el valor entero a partir de un objeto Integer:


int otroEntero = objetoEntero.intValue();

 Convertir una cadena de caracteres a un número doble.

String cadena = “1286.3”;


Double objeto = new Double(cadena);
double valor = objeto.doubleValue();

Para el ejemplo anterior la cadena debe representar un número doble válido, es decir, no debe
contener letras ni otros caracteres especiales. Si esto sucede se presenta un error en el
programa.

Ejercicios

 Investigue los métodos que se pueden usar para realizar las siguientes conversiones:
- De entero a cadena
- De cadena a entero
- De carácter a cadena
 ¿Qué realizan el método toHexalString(int) de la clase Integer?
 Busque en el API algún elemento (clase, interfaz o método) que le permita saber si un
carácter es una letra o es un dígito.

También podría gustarte