New 2 Java: Suplementos

Casting es el proceso de tomar una variable declara como de un tipo y decirle al compilador que queremos tratarla como otro tipo. El Casting no modifica el �tem original. Solo le dice al compilador que lo trate de manera diferente. El Casting se puede hacer tanto con tipos primitivos como int o float como con tipos de objetos como java.lang.Object y java.lang.String.

La forma general para la operaci�n de casting es la siguiente:

(datatype)expression

donde data type es el nuevo tipo como queremos que se trate el valor de la expresi�n.

En el caso de datos primitivos, el casting es necesario cuando cambiamos entre tipos de datos y hay una oportunidad de perder informaci�n. Por ejemplo, si tenemos un int y queremos tratarlo como un double, no se necesita casting porque un double puede contener todo el rango de valores disponibles dentro de un int. En las siguientes operaciones, no es necesario el casting. El valor de i es promocionado al tipo de d:

int i = 5;
double d = i;

Para ir en la direcci�n inversa se requiere el casting. Porque una variable double puede contener datos con valores m�s all� del punto de decimal, un int no puede contener los valores de un double. El rango de n�meros posibles es mayor para un double que para un int. A causa de estos dos problemas espec�ficos, intentar pasar de un double a un int requiere casting:

double d = 5.0;
int i = (int)d;

El uso de (int) aqu� dice: "Oye, ya se que esto puede perder informaci�n, pero realmente quiero tratar esta variable double como un int."

Con objetos, alguna veces tambi�n es necesario el casting. El Casting con referencias de objetos dice que trate la variable declarada como del tipo X como si fuera del tipo Y. Es importante saber que cuando forzamos una objeto referencia, el tipo de dato del objeto no cambia, s�lo el modo en que el compilador trata el objeto.

Frecuentemente, los m�todos son declarados para ser gen�ricos, posiblemente aceptando (o devolviendo) un tipo Object. Entonces se convierte en necesario acceder a la variable por su tipo espec�fico. Aqu� es cuando necesitamos el casting. Si sabemos que un par�metro se supone que va a ser de un tipo espec�fico, podemos forzarlo, como en el siguiente ejemplo:

public void myMethod(Object param) {
   Number num = (Number)param;
   double d = num.doubleValue();
   System.out.println("Value is: " + d);
}

Si, sin embargo, no conocemos el tipo esp�cifico, podemos usar la palabra clave instanceof. Esto nos permite chequear primero el tipo, y luego forzarlo:

public void myMethod(Object param) {
   if (param instanceof Number) {
     Number num = (Number)param;
     double d = num.doubleValue();
     System.out.println("Value is: " + d);
   } else {
     logError(param);
   }
}

Si no usamos la palabra clave instanceof para chequear el tipo e intentar realizar el forzado entre tipos incompatibles, se lanzar� una ClassCastException en tiempo de ejecuci�n. Esto se muestra en el siguiente fragmento de c�digo:

// Create object
Object o = new Object();
// The cast
String s = (String)o;
// The object s refers to is not really a String
// so a ClassCastException is thrown
System.out.println(s.length());

La sentencia ser�a v�lida si el objeto referenciado por la variable o fuera un String, como en este fragmento de c�digo:

// Create object
Object o = "Hello";
// The cast
String s = (String)o;
// The object s refers to really is a String
// so no ClassCastException is thrown
System.out.println(s.length());

.�Entender la Librer�a de Clases Java

.�Interfaces Collection, Iterator, y List

El Marco de Tabajo Collections proporciona un conjunto de clases e interfaces para almacenar y manipular grupos de datos como una s�la unidad, o una colecci�n. Una colecci�n es un objeto que representa un grupo de objetos. Interfaces espec�ficos describen los diferentes tipos de grupos, como conjuntos, listas y mapas.

Ya has visto algunos objetos collection en Suplementos anteriores como los arrays y ArrayList.

El interface Collection se usa para representar cualquer grupo de objetos, o elementos. Usamos este interface cuando queremos trabajar con un grupo de elementos de una forma lo m�s general posible. Este interface tiene dos m�todos que deber�amos entender:

  • add(Object obj)
    a�ade un objeto a una colecci�n. El m�todo add devuelve true si la adici�n del objeto cambi� la collection y false si no lo cambi�.
  • Iterator iterator
    devuelve un objeto que implementa el interface Iterator.

Los m�todos del interface Iterator nos permiten pasar a trav�s de cada elemento de una collection desde el principio hasta el final. Podemos usar un iterator para recuperar o eliminar objetos en una collection uno por uno. Los tres m�todos del interface Iterator que puedes usar son:

  • hasNext
    Devuelve true si la iteraci�n tiene m�s elementos. Devuelve true si next devuelve un elemento en vez de lanzar una excepci�n.
  • next
    Devuelve el siguiente elemento de la iteraci�n. Lanza NoSuchElementException si la iteraci�n no tiene m�s elementos.
  • remove
    Elimina el �ltimo elemento devuelto por el iterator. Este m�todo s�lo puede llamarse una ver por cada llamada a next.

El interface List extiende el interface Collection para definir una coleci�n ordenada, una secuencia de elementos, permitiendo duplicados. Este interface a�ade operaciones orientadas a la posici�n, as� como la habilidad de trabajar s�lo con una parte de la lista. Este interface nos da el control sobre d�nde se inserta cada elemento, y podemos acceder a elementos por su �ndice entero de posici�n en a lista, y buscando por los elementos de la lista. Abajo puedes ver algunos de los m�todos del interface List:

  • add(int index, Object element)
    Inserta el elemento especificado en la posici�n especificada de esta lista (operaci�n opcional).
  • add(Object o)
    A�ade el elemento especificado al final de la lista (operaci�n opcional).
  • clear()
    Elimina todos los elementos de la lista (operaci�n opcional).
  • get(int index)
    Devuelve el elemento en la posici�n de la lista especificada.

La siguiente aplicaci�n demuestra todos los conceptos anteriores:

// The Collection, List, and Iterator interfaces are a
// part of the java.util package.
import java.util.*;

public class CreatingCollections 
{
   public static void main(String args[]) 
   {
    // Creates a collection object
     List list = new ArrayList();
     // Uses the add method to add
     // each element
     list.add("This is a String");
     list.add(new Short((short)12));
     list.add(new Integer(35));
     
     // Get an iterator for the input list
     // and step through each element within the
     // for statement.
     for (Iterator i = list.iterator(); i.hasNext(); )
      {
        System.out.print(i.next()); 
      }
   }
}   

Resulta en:

This is a String1235

.�Programa Ejercicio

  1. Crea un programa que tome una lista de objetos como entrada
    • Haz que la mitad de los objetos sean strings.
    • Haz que la otra mitad de los objetos sean n�meros.
    • A�ade otro objeto a la lista que no sea ni un String ni un n�mero
  2. Itera sobre los elementos.
    • Concatena los Strings.
    • Suma los n�meros.
    • Ignora el resto.
  3. Usa instanceof para dererminar de que tipo es cada elemento.
  4. Fuerza el elemento al tipo apropiado antes de acceder al dato.
  5. Saca los strings concatenados.
  6. Saca la suma de los n�meros.

.�Un poco de Java

.�Buenas Pr�cticas de Programaci�n

Escribir c�digo que se compile y se ejecute es s�lo una parte del desarrollo de software. Tambi�n podemos necesitar depurar aplicaciones, ampliarlas, a�adir cambios, y compartir partes de c�digo. En otras palabras, nuestro c�digo debe escribirse de forma legible para que sea f�cil de entender y consistente.

Puedes hacer esto siguiendo estas buenas pr�cticas de programaci�n:

  • Comenta de forma completa pero no excesiva:

    No expliques lo obvio, pero si explica el prop�sito de los m�todos complejos. Esto es una ayuda para los desarrolladores y para t� mismo si ha pasado mucho tiempo desde que escribiste el c�digo. Por ejemplo:

      // Creates a new entry in the jiveForum database  
      // table and inserts the forum object into memory  
      // cache for future fast access:
      try {
             Forum newForum = factory.createForum(
                 "New Forum Name", 
                      "Some description for new forum.");
           }
    
  • Crea nombres de m�todos y par�metros con significado:

    Un nombre de m�todo con significado describe la funcionalidad de un m�todo, y ayuda a evitar la necesidad de largos comentarios. Por ejemplo:

      public void getLastVisited(request,response){}
    
  • Manten los m�todos tan peque�os como sea posible:

    Un m�todo que requiere muchos par�metros podr�a hacer m�s de lo que deber�a. Considera el dividir dichos m�todos en varios m�todos para realizar las distintas tareas. Por ejemplo:

      private void buildImagePanel()
         { // Opens method
              
          images = new JPanel();
          // Sets the color, layout, and adds the
          // seahorse object
          images.setLayout(new FlowLayout() );
          images.setBackground(Color.white);
          images.add(seahorse);
         } // Closes method
    
  • Indenta las sentencias en el cuerpo de las sentencias de control:

    Esto hace m�s f�cil seguir lo que est� haciendo cada sentencia de control, y hace m�s facil localizar la siguiente. Por ejemplo:

      if (!str1.equals(str2)) {
         System.out.println("str1/str2 mismatch");
       }
    

.�Soluci�n al Programa de Ejercicio

Esta es una de las posibles soluciones al programa del ejercicio:

import java.util.*;

public class Cast {
   public static void main(String args[]) {

     // Configure the "input"
     List list = new ArrayList();
     list.add("The ");
     list.add(new Integer(35));
     list.add("quick ");
     list.add(new Double(Math.PI));
     list.add("brown ");
     list.add(new java.awt.Point(1, 2));
     list.add("fox ");
     list.add(new Float(89.124f));
     list.add("jumps ");
     list.add("over ");
     list.add(new Short((short)14));
     list.add("the ");
     list.add(new Byte((byte)12));
     list.add("lazy ");
     list.add("sleeping ");
     list.add(new Long(9012));
     list.add("dog.");

     // Get an iterator for the input list
     Iterator it = list.iterator();

     // Create a StringBuffer to store
     //   the concatenated elements
     StringBuffer sb = new StringBuffer();

     // Initialize a variable to store the sum
     double sum = 0;

     // Loop through the list using the iterator
     while(it.hasNext()) {

       // Get the next element
       Object next = it.next();

       // Check for type
       if (next instanceof Number) {

         // Sum up the numbers.
         Number num = (Number)next;
         sum += num.doubleValue();

       } else if (next instanceof String) {

         // Combine the strings
         sb.append((String)next);

       } else {

         // ignore

       }
     }

     // Display the results
     System.out.println("Sentence: " + sb.toString());
     System.out.println("Sum: " + sum);
   }
}

.�Descargar la Plataforma Java 2

Para la mayor�a del desarrollo Java, necesitas las librer�as de clases Java, el compilador, las herramientas, y el entorno de ejecuci�n proporcionado por el kit de desarrollo de Java 2, Standard Edition.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
SIGUIENTE ARTÍCULO