AOWS

Just another adrian’s weblog

“null”, o una de las maldiciones de Java

with 5 comments

Tratar con valores nulos es, desde siempre, un dolor de muelas muy importante en el mundo de Java. En este artículo de Redcode nos lo recuerdan y proponen algunas de las pocas opciones que hay:

  • Confiar en que nuestras referencias nunca serán nulas y no realizar ninguna comprobación. Como es obvio, un tanto peligroso, sobre todo cuando utilizamos librerías de terceros cuyos resultados no conocemos con seguridad.
    List<Person> people = getPeople();
    for (Person person : people) {
      House house = person.getHouse();
      System.out.println("House price: " + house.getPrice());
    }
    
  • Inundar el código con condicionales anidados, uno detrás de otro según el número de objetos que tengamos.
    List<Person> people = getPeople();
    if (people != null) {
      for (Person person : people) {
        if (person != null) {
          House house = person.getHouse();
          if (house != null) {
            System.out.println("House price: " + house.getPrice());
          }
        }
      }
    }
    
  • Utilizar anotaciones (@Nullable y @NotNull) que nuestro IDE usará para advertirnos de posibles riesgos de obtener un NullPointerException. No nos evitará el tener que hacer comprobaciones, pero podemos fiarnos si no hay warnings.
    @Nullable
    private List<Person> getPeople() {
      // ...
    }
    
    // ... 
    
    List<Person> people = getPeople();
    // recibiremos un warning, y es que "people" puede ser nulo
    for (Person person : people) {
      House house = person.getHouse();
      System.out.println("House price: " + house.getPrice());
    }
    
  • Utilizar algún patrón como Null Object pattern o una versión más general (Special Case) propuesta por Martin Fowler. El problema es que esto no soluciona las interacciones con librerías externas (que pueden seguir devolviendo nulos) y complica el proyecto con un montón de objetos nuevos.

Por desgracia, la nueva versión de Java no incluirá ningún operador específico para solucionar esta situación. Estuvo en los planes incluir algo similar al operador Elvis safe navigation operator de Groovy:

List<Person> people = getPeople()
println people?.get(0)?.getHouse()?.getPrice()

pero finalmente todo seguirá igual. Una pena porque esto mejoraría enormemente la legibilidad del código; lo pondría incluso por delante de nuevas características como las closures (que llegan tarde, esperemos que no mal y arrastro).

Written by adrian

4 febrero, 2010 a 22:47

Publicado en Uncategorized

Tagged with ,

5 comentarios

Subscribe to comments with RSS.

  1. Un apunte “purista”, que creo que te has despistado en el nombre😛

    El operador “object?.attribute” de groovy sería el safe navigation operator(ni idea como traducirlo sin que quede fatal ;)), el elvis es tan sólo una simplificación del operador ternario.

    Y sí, algo así dejaría más legible el código en muchísimos casos.

    Saludos!

    Dani Latorre

    5 febrero, 2010 at 03:01

  2. Para nada es purista, tienes razón, el operador Elvis es otra cosa.

    Gracias por la corrección😉

    adrian

    5 febrero, 2010 at 08:28

  3. yo tb qyuero un safe navigation operator!!!

    faci

    10 febrero, 2010 at 16:45

  4. Hola necesito que me ayuden a implementar null object en una aplicacion que sea entendible, que al correrlo en jcreator no me de errores sino que funcione bien. Se los agradeceria mucho. pueden escribirme al correo gradizangelofgad@gmail.com y mandarmelo el ejecisio a este correo.

    Gradiz

    16 febrero, 2010 at 21:58

  5. ¿de verdad consigues que te hagan los ejecisios mendigando por los blogs?

    Tienes un ejemplo de null object en java aqui: http://www.cs.oberlin.edu/~jwalker/nullObjPattern/

    Ahora sólo te falta correrlo en jcreator…

    faci

    17 febrero, 2010 at 01:10


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: