2015-02-03 15 views
5

Google mi sta fallendo. C'era questa annotazione: ReturnValuesAreNonnullByDefault.Esiste un'annotazione predefinita a livello di classe che NON è deprecata che specifica i valori di ritorno non nulli per impostazione predefinita

Ma questo è ora deprecato e javadoc non indica quale nuova annotazione utilizzare. @Nonnull sull'intera classe non si applica ai valori restituiti perché l'ho appena testato e non ricevo alcun avviso per un metodo che restituisce null. Non voglio dover annotare specificamente ogni singolo valore di ritorno, quindi c'è una buona opzione là fuori?

+0

Nel riepilogo del pacchetto si dice "Queste annotazioni sono per lo più deprecate e sostituite da annotazioni JSR 305 definite in javax.annotation.". Tuttavia, non sono sicuro di quale javax.annotation dovresti usare come sostituto di ReturnValuesAreNonnullByDefault. http://findbugs.sourceforge.net/api/edu/umd/cs/findbugs/annotations/package-summary.html – Marco

risposta

1

È possibile utilizzare this answer per costruire il proprio semplice @EverythingIsNonnullByDefault annotazione da applicare a livello di pacchetto/classe per coprire tutti i casi, o this one che mostra come creare annotazioni distinte per governare campi e valori di ritorno metodo. Abbiamo scelto di usarli tutti, ma tendiamo ad applicare la versione "tutto" a livello di pacchetto.

Se hai fretta, copia e incolla l'annotazione obsoleta e rimuovi la deprecazione.

package com.sample; 

import java.lang.annotation.Documented; 
import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 

import javax.annotation.meta.TypeQualifierDefault; 

/** 
* This annotation can be applied to a package or class to indicate that the 
* classes' methods in that element all return nonnull values by default 
* unless there is 
* <ul> 
* <li>an explicit nullness annotation 
* <li>a default method annotation applied to a more tightly nested element. 
* </ul> 
*/ 
@Documented 
@Nonnull 
@TypeQualifierDefault(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface ReturnValuesAreNonnullByDefault { 
    // feel free to name it MethodsAreNonnullByDefault; I find that confusing 
} 
1

Se si utilizza il Checker Framework, quindi è possibile utilizzare @DefaultQualifier. Ad esempio, si potrebbe scrivere

@DefaultQualifier(value=NonNull.class, locations=DefaultLocation.RETURNS) 

Tuttavia, non è necessario fare questo perché di Nullness Checker il Checker Framework utilizza già quello di default. (Come hai scoperto, l'impostazione predefinita migliore è quella di assumere che ogni metodo restituisca null.)

Un vantaggio di Nullness Checker è che rileva più errori relativi al puntatore nullo rispetto a FindBugs.

Il Nullness Checker è compatible con le annotazioni di FindBugs, quindi puoi provare il Nullness Checker senza dover modificare le annotazioni di FindBug esistenti nel codice.

+0

Stavo usando Findbugs poiché questo è quello che usano gli altri team della mia azienda. Guarderò il framework Checker dato che ha più potere di trovare bug. Grazie per avermelo fatto sapere! – Selena

+0

Ah, capisco. La domanda originale non specificava FindBugs. In bocca al lupo! – mernst