Annotations

Aula
Estado
💡
São uma forma de meta-dados que proporcionam informações sobre o programa que não são parte dele em si
  • Podem ser retidos em diferentes níveis:
    • RetentionPolicy.SOURCE existe no código-fonte mas é descartado pelo compilador
    • RetentionPolicy.CLASS existe para o compilador, mas é descartado pela JVM
    • RetentionPolicy.RUNTIME existe para a JVM e é utilizável em tempo de execução
  • É possível definir uma lista de alvos onde a anotação pode ser utilizada: TYPE, TYPE_PARAMETER, ANNOTATION_TYPE, CONSTRUCTOR, LOCAL_VARIABLE, FIELD, METHOD, MODULE, PACKAGE, PARAMETER, TYPE_USE
  • Para que uma anotação apareça no java doc de uma classe, ela deve estar anotada com @Documented
notion image

Design

  • Pode conter atributos de tipos: primitivo, String, Class, Enum, Annotation ou um Array de qualquer outro tipo permitido
  • Um atributo pode ter um valor padrão
  • Uma anotação declarada com a anotação @Repeatable(<container>) pode ser usada mais de uma vez pelo container
notion image
notion image

Utilização

  • Atributos são preenchidos @Annotation(<attribute name>=<value>, <array attribute>={<value>, <value>})
    • atributos com valores padrão podem ser omitidos
    • se o atributo value for o único que precisa ser preenchido, o seu nome pode ser omitido
    • se o valor de um atributo array possuí apenas um valor { } pode ser omitido
notion image
  • Com a Java Reflection API é possível dinamicamente descobrir as anotações (retidas em runtime) de uma classe:
    • recuperar o array de anotações da classe, métodos e campos
    • recuperar o tipo de uma anotação
    • recuperar uma anotação pelo seu tipo
    • invocar operações em uma anotação para recuperar seus atributos
notion image

Anotações Nativas

Validação de Design

💡
Impede a compilação se a anotação for violada
  • @FunctionalInterface valida se uma interface é uma functional interface
  • @Override valida se o método realmente existe na superclasse

Deprecated

A anotação @Deprecated possui os atributos:
  • since que indica a última versão que a classe ou método anotado pode ser utilizada sem problemas
  • forRemoval que, quando verdadeiro, indica um intenção de remover o método ou classe em uma futura versão

SuppressWarnings

A anotação @SuppressWarnings especifica tipos de avisos que devem ser omitidos. (Não é recomendado pois podem omitir erros perigosos.)
  • Unchecked warnings: são causados ao atribuir um objeto sem tipo (e.g. de uma coleção sem tipo) a uma variável com um tipo
  • Deprecation warnings: são causados pela utilização de métodos obsoletos
notion image
 
notion image

SafeVarargs

A anotação @SafeVarargs diz para o compilador não lançar erros de heap-pollution no método anotado.
notion image