2012-08-02 16 views
20

Moje pytanie jest kontynuacją do this one.Jak wskazać, że pola elementów mają domyślnie wartość @Null?

W poprzednich wersjach FindBugs, można było użyć @DefaultAnnotation(Nonnull.class) lub @DefaultAnnotationForFields(Nonnull.class), aby wskazać, że wszystkie pola w opakowaniu powinna być traktowana jako @Nonnull. W obecnej wersji FindBugs (2.0), @DefaultAnnotation i @DefaultAnnotationForFields są przestarzałe, a my wszyscy powinniśmy używać JSR-305 zamiast tego. Ale JSR-305 nie wydaje się obejmować wszystkiego, co obejmuje teraz (obecnie przestarzałe) adnotacje FindBugs.

javadoc sugeruje szereg alternatyw:

  • @ParametersAreNonnullByDefault. To (oczywiście) dotyczy tylko parametrów, a nie pól składowych.
  • @CheckReturnValue, po zastosowaniu do typu lub paczki. Ponownie, nie dotyczy to pól elementów.
  • @TypeQualifierDefault. Może to może zrobić, co chcę, ale nie rozumiem, jak to działa, i nie jestem w stanie znaleźć żadnej dokumentacji ani przykładów na temat jego użycia lub intencji, oprócz jakiegoś tajemniczego javadoc. Myślę, że to pomoże mi tworzyć własne adnotacje, ale czy mogę mieć pewność, że wszystkie narzędzia (FindBugs, Eclipse itp.) Zinterpretują tę nową adnotację poprawnie (lub nawet w ogóle)?

Podpowiedź javadoc nie zawiera żadnych wskazówek, jak radzić sobie z jej wycofaniem.

Zatem, używając aktualnych wersji FindBugs i/lub JSR-305, jak mam wskazać, że wszystkie pola elementów w określonym pakiecie (lub nawet w pewnej klasie) powinny być traktowane jako @Nonnull? Czy to możliwe?

Odpowiedz

18

miałem podobne pytanie i stwierdzili, że następujące wydaje się działać z findbugs (2.0.1-RC2)

utworzyć plik Java z następującej definicji adnotacji

@Nonnull 
@TypeQualifierDefault(ElementType.FIELD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface FieldsAreNonNullByDefault 
{ 
} 

podobnie do wymuszenie, że wszystkie wartości zwracane z metody mają wartość inną niż null:

@Nonnull 
@TypeQualifierDefault(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface ReturnTypesAreNonNullByDefault 
{ 
} 

, a następnie należy opisać pakiet w normalny sposób.

użyłem następujących dla moich testów (package-info.java)

@javax.annotation.ParametersAreNonnullByDefault 
@com.habit.lib.lang.FieldsAreNonNullByDefault 
@com.habit.lib.lang.ReturnTypesAreNonNullByDefault 

package com.mypackagename.subpkg; 
+5

Ah, więc podstęp jest zdefiniowanie własnego adnotacji ... myślę, że to bardziej rozciągliwe, ale nie widzę dlaczego nie mogą po prostu utworzyć adnotacji standardowej dla tego przypadku, podobnie jak w parametersAreNonnullByDefault. – jqno

+8

Należy pamiętać, że w niestandardowych adnotacjach używasz różnych wielkich liter w wyrażeniu "Nonnull" niż w JSR-305, co może wywoływać zamieszanie. –

Powiązane problemy