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.