Corrección de código (?) ¿Anotaciones para Java (y otros idiomas)?

7

Después de escribir mi chequeo nulo billonésimo en el código Java, comencé a preguntarme por qué la capacidad de verificar nulo los argumentos del método no estaba ya incorporada en Java. Por ejemplo, para algunos métodos, quiero lanzar una excepción IllegalArgumentException si alguno (o todos) de los argumentos son nulos. Sería genial si pudiera marcar el código y hacer que el compilador genere la validación que arroja una excepción informativa si la validación falla.

Ya hay algo en Java donde puede especificar algunos parámetros de corrección para los argumentos de los métodos (por ejemplo, int tiene que estar dentro de cierto rango, o Object no debe ser nulo ), y el compilador genera automáticamente el código?

En Java parece que esto debería manejarse con anotaciones. (Supongo que en C / C ++ podría definir algunas macros agradables para hacer esto por usted). Al buscar en la web sobre este problema, vi una referencia a JSR 305 , pero parece estar orientado hacia el uso con herramientas IDE, y no con el compilador de Java.

Supongo que esto ya existe en otros lenguajes de programación. Por lo tanto, me interesaría saber cómo puede funcionar esto en estos idiomas, así como sobre lo que podría existir (o que aparecerá) en Java.

    
pregunta Sam Goldberg 22.12.2011 - 20:23

4 respuestas

3

Lo que estás tratando de hacer a veces se llama Designing By Contract . Hay una serie de marcos que logran este objetivo, y puede definir más que solo cheques nulos, pero casi cualquier tipo de condición previa o posterior, también.

Una rápida búsqueda en Google muestra algunas buenas soluciones para Java:

  • Contratos para Java utiliza anotaciones (como ha sugerido):

    interface Time {
     ...
    
     @Ensures({
       "result >= 0",
       "result <= 23"
     })
     int getHour();
    
     @Requires({
       "h >= 0",
       "h <= 23"
     })
     @Ensures("getHour() == h")
     void setHour(int h);
    
     ...
    }
    
  • jContractor Usa clases separadas

    protected boolean Stack_Precondition (Object [] initialContents) {
        return (initialContents != null) && (initialContents.length > 0);
    }
    

Esto debería ayudarte a comenzar.

    
respondido por el Kevin McCormick 22.12.2011 - 22:38
4

No en Java estándar.

La sintaxis más limpia en una biblioteca muy utilizada es quizás la de Google Guava.

public void fullyImplementedGuavaConstructorWouldBe(Long id, String firstName, String lastName, String login) {
        this.id = checkNotNull(id);
        this.firstName = checkNotNull(firstName);
        this.lastName = checkNotNull(lastName);
        this.login = checkNotNull(login);

        checkArgument(firstName.length() > 0);
        checkArgument(lastName.length() > 0);
        checkArgument(login.length() > 0);
    }

(de enlace )

Javadoc: enlace

    
respondido por el user1249 22.12.2011 - 20:45
3

JSR-303 - Es el estándar para la validación de frijoles y está respaldado por Hibernate Validator y varios otros marcos. Admite el tipo de comprobación de rango basado en anotaciones y no la comprobación de nulos que creo que estás buscando.

La especificación de Validación de Bean está pasando por una actualización en este momento, así que espere más posibilidades en el futuro cercano.

    
respondido por el Martijn Verburg 22.12.2011 - 22:21
2

Si está utilizando el framework Spring, es posible usar Afirmar para manejar las verificaciones de entrada:

public String modifyString123(String myString) {
    Assert.hasText(myString, "myString can not be null or empty");
    return myString + "123";
}

Se lanzará una IllegalArgumentException si la entrada es nula o está vacía.

    
respondido por el JW8 22.12.2011 - 20:58

Lea otras preguntas en las etiquetas