type retentionpolicy notacion crear anotación annotation java annotations findbugs

retentionpolicy - java lang annotation



Anotación personalizada para suprimir una advertencia FindBugs específica (1)

(No responde específicamente la pregunta), pero si solo desea que la finalización del código funcione mejor con @SuppressFBWarnings , podría definir una static final String para cada uno de los códigos de advertencia y luego usarlos en la anotación. p.ej

public final class FBWarningCodes { private FBWarningCodes() { } public static final String NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR = "NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR"; }

Entonces:

import static com.tmobile.tmo.cms.service.content.FBWarningCodes.*; @SuppressFBWarnings(NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR)

(aunque es cierto que Eclipse no desea completar el código a menos que especifique value= en la anotación)

Quiero crear anotaciones personalizadas para suprimir las advertencias individuales de FindBugs para que sea más fácil usarlas a través de la finalización del código. Por ejemplo, este ignora los constructores que no configuran todos los campos @Nonnull .

@TypeQualifierDefault(ElementType.CONSTRUCTOR) @SuppressFBWarnings("NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR") @Retention(RetentionPolicy.CLASS) public @interface SuppressNonnullFieldNotInitializedWarning { }

Sin embargo, aún veo la advertencia cuando uso la anotación.

public class User { @Nonnull private String name; @SuppressNonnullFieldNotInitializedWarning public User() { // "Nonnull field name is not initialized by new User()" } }

He intentado diferentes políticas de retención y tipos de elementos, poniendo la anotación en el constructor y la clase, e incluso @TypeQualifierNickname .

Este mismo patrón funciona para aplicar @Nonnull a todos los campos en una clase.

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

FindBugs muestra correctamente una advertencia para el código que asigna null al name .

@FieldsAreNonnullByDefault public class User { private String name; public UserModel() { name = null; // "Store of null value into field User.name annotated Nonnull" } }

Creo que el problema es que @SuppressFBWarnings no está marcado con @TypeQualifier mientras @Nonnull es, y por lo tanto @TypeQualifierDefault y @TypeQualifierNickname no se aplican a él. Pero debe haber algún otro mecanismo para aplicar una anotación usando otra.