Code Correctness (?) Annotazioni per Java (e altre lingue)?

7

Dopo aver scritto il mio miliardesimo controllo null in codice Java, ho iniziato a chiedermi perché la capacità di verificare gli argomenti del metodo null non fosse già incorporata in Java. Ad esempio, per alcuni metodi, voglio lanciare un IllegalArgumentException se alcuni (o tutti) gli argomenti sono nulli. Sarebbe bello se potessi contrassegnare il codice e fare in modo che il compilatore generi la convalida che genera un'eccezione informativa se la convalida fallisce.

C'è già qualcosa in Java dove puoi specificare alcuni parametri di correttezza per gli argomenti del metodo (per esempio int deve essere all'interno di un certo intervallo, o Oggetto deve essere non nullo ) e il compilatore genera automaticamente il codice?

In Java sembra che questo dovrebbe essere gestito con annotazioni. (Immagino che in C / C ++ potresti definire dei bei macro per fare questo per te.) Nella ricerca sul web su questo problema, ho visto il riferimento a JSR 305 , ma sembra destinato all'uso con gli strumenti IDE e non con il compilatore Java.

Suppongo che questo già esista in altri linguaggi di programmazione. Quindi sarei interessato a sapere come questo possa funzionare in queste lingue, così come ciò che potrebbe esistere (o essere in arrivo) in Java.

    
posta Sam Goldberg 22.12.2011 - 20:23
fonte

4 risposte

3

Quello che stai cercando di fare è talvolta chiamato Progettazione per contratto . Esistono numerosi framework che raggiungono questo obiettivo e puoi definire molto più di semplici controlli null, ma anche di qualsiasi tipo di pre o post condition.

Una rapida ricerca su Google mostra alcune buone soluzioni per Java:

  • Contratti per Java utilizza annotazioni (come hai suggerito):

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

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

Questo dovrebbe iniziare.

    
risposta data 22.12.2011 - 22:38
fonte
4

Non in Java standard.

La sintassi più pulita in una libreria ampiamente utilizzata è forse quella di 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);
    }

(dal link )

Javadoc: link

    
risposta data 22.12.2011 - 20:45
fonte
3

JSR-303 - È lo standard per la convalida dei bean ed è supportato da Hibernate Validator e molti altri framework. Supporta il tipo di controllo dell'intervallo basato sull'annotazione e non il controllo nullo che penso tu stia cercando.

Al momento la specifica di convalida del bean sta passando attraverso un aggiornamento, quindi aspettati maggiori possibilità nel prossimo futuro.

    
risposta data 22.12.2011 - 22:21
fonte
2

Se utilizzi il framework Spring, è possibile utilizzare Richiedi per gestire i controlli di input:

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

Un'eccezione IllegalArgumentException verrà generata se l'input è nullo o vuoto.

    
risposta data 22.12.2011 - 20:58
fonte

Leggi altre domande sui tag