2015-02-03 15 views
5

Google mnie zawodzi. Wcześniej ta adnotacja: ReturnValuesAreNonnullByDefault.Czy istnieje domyślna adnotacja na poziomie klasy, która NIE jest przestarzała, która domyślnie określa wartości zwracane niepuste?

Ale teraz jest to przestarzałe, a javadoc nie wskazuje, którą nową adnotację należy użyć. @Nonnull na całej klasie nie ma zastosowania do zwracanych wartości, ponieważ właśnie to przetestowałem i nie otrzymuję ostrzeżenia dla metody zwracającej wartość null. Nie chcę specjalnie opisywać każdej wartości zwracanej, więc czy jest tam dobra opcja?

+0

W podsumowaniu paczki jest napisane: "Te adnotacje są w większości przestarzałe i zastępowane adnotacjami JSR 305 zdefiniowanymi w javax.annotation.". Jednak nie jestem pewien, którego javax.annotation należy użyć jako zamiennika ReturnValuesAreNonnullByDefault. http://findbugs.sourceforge.net/api/edu/umd/cs/findbugs/annotations/package-summary.html – Marco

Odpowiedz

1

Można użyć this answer zbudować własny prosty @EverythingIsNonnullByDefault adnotacji do zastosowania na poziomie pakietu/klasy, aby objąć wszystkie przypadki, albo this one który pokazuje jak tworzyć oddzielne adnotacje rządzić pola i wartości Sposób powrotu. Zdecydowaliśmy się użyć ich wszystkich, ale zazwyczaj stosujemy wersję "wszystko" na poziomie pakietu.

Jeśli naprawdę się spieszysz, skopiuj i wklej wycofaną adnotację i usuń ją.

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

Jeśli używasz Checker Framework, a następnie można użyć @DefaultQualifier. Na przykład, można napisać

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

Jednak nie trzeba tego robić, ponieważ ramowego Nullness Checker Checker wykorzystuje już, że domyślnie. (Jak można się przekonać, najlepszą domyślną wartością jest założenie, że każda metoda zwraca wartość null).

Zaletą modułu sprawdzającego nieważność jest to, że wykrywa on więcej błędów związanych z zerowymi wskaźnikami niż FindBugs.

Narzędzie do sprawdzania punktów zerowych ma wartość compatible z adnotacjami FindBugs, dzięki czemu można wypróbować narzędzie do sprawdzania punktów zerowych bez konieczności zmiany istniejących adnotacji FindBugs w kodzie.

+0

Używałem Findbugs, ponieważ tego używają inne zespoły w mojej firmie. Sprawdzę strukturę Checker, ponieważ ma ona więcej możliwości wykrywania błędów. Dzięki, że mnie o tym powiadomiłeś! – Selena

+0

Ach, rozumiem. Pierwotne pytanie nie określało FindBugs. Powodzenia! – mernst