Artigo Diretório
- Classes e anotações de enumeração Java
-
- Um, classe de enumeração
-
- 1. Uso de classes enumeradas
- 2. Como personalizar a classe de enumeração (antes de jdk5.0)
- 3. * Como usar a palavra-chave enum para definir uma classe de enumeração (adicionada após jdk5.0)
- 4. O método principal da classe Enum
- 5. Use a palavra-chave enum para implementar a classe de enumeração da interface
- 2. Anotação
Classes e anotações de enumeração Java
Um, classe de enumeração
1. Uso de classes enumeradas
- Existe apenas um número limitado de objetos da classe, o que é certo. Chamamos essa classe de classe de enumeração
- Quando você precisa definir um conjunto de constantes, é altamente recomendável usar uma classe de enumeração
- Se houver apenas um objeto na classe de enumeração, ele pode ser usado como a implementação do modo singleton
2. Como personalizar a classe de enumeração (antes de jdk5.0)
degrau
-
Declare as propriedades de um objeto de classe de enumeração personalizada: private final
-
Privatize o construtor da classe e atribua valores às propriedades do objeto
-
Fornece vários objetos da classe de enumeração atual: public static final
-
Outras demandas, como: obter as propriedades de objetos de enumeração, método toString, etc.
class Season { //1. private final String seasonName; private final String seasonDesc; //2. private Season(String seasonName, String seasonDesc) { this.seasonName = seasonName; this.seasonDesc = seasonDesc; } //3. public static final Season SPRING = new Seanson("春天","春暖花开"); public static final Season SUMMER = new Seanson("夏天","夏日炎炎"); public static final Season AUTUMN = new Seanson("秋天","秋高气爽"); public static final Season WINTER = new Seanson("冬天","冰天雪地"); //4. //getters(),toString()等方法 }
3. * Como usar a palavra-chave enum para definir uma classe de enumeração (adicionada após jdk5.0)
- Classes de enumeração definidas usando a palavra-chave enum,Herdar a classe Enum por padrão
degrau
-
Forneça os objetos da classe de enumeração atual, vários objetos são separados por vírgulas e, finalmente, terminam com um ponto e vírgula.
-
Declare as propriedades de um objeto de classe de enumeração personalizada: private final
-
Fornece vários objetos da classe de enumeração atual: public static final
-
Outras demandas, como: obter as propriedades de objetos de enumeração, método toString, etc.
enum Season { //1 SPRING("春天","春暖花开"), SUMMER("夏天","夏日炎炎"), AUTUMN("秋天","秋高气爽"), WINTER("冬天","冰天雪地"); //2. private final String seasonName; private final String seasonDesc; //3. private Season(String seasonName, String seasonDesc) { this.seasonName = seasonName; this.seasonDesc = seasonDesc; } //4. //getters(),toString()等方法 //如获取季节信息 public String getInfo() { return "Name:" + this.seasonName + "Desc:" + this.seasonDesc; } } public class enumTest { @Test public void test() { Season spring = Season.SPRING; System.out.println(spring.getInfo()); } }//运行结果:Name:春天Desc:春暖花开
4. O método principal da classe Enum
Nome do método | Descrição detalhada |
---|---|
valor | Retorna uma matriz de objetos do tipo de enumeração. Este método pode percorrer facilmente todos os valores de enumeração. |
Passe o objeto Class do tipo de enumeração e o nome da constante de enumeração para o método estático valueOf, e você obterá a constante de enumeração que corresponde aos parâmetros. | |
Obtenha o nome da constante enum atual. (Reescritível para aumentar a legibilidade) | |
é igual a | Os tipos de enumeração podem usar == diretamente para comparar se duas constantes de enumeração são iguais. O método equals da classe Enum é implementado com == |
hashCode | Enum implementa hashCode () para ser consistente com igual. Ele também é imutável. |
getDeclaringClass | Obtenha o objeto Class do tipo enum ao qual a constante enum pertence. Você pode usá-lo para determinar se duas constantes de enumeração pertencem ao mesmo tipo de enumeração. |
nome | Obtenha o nome da constante enum atual. Recomenda-se usar toString () primeiro |
ordinal | Obtenha a ordem da constante enum atual |
comparado a | Os tipos de enumeração implementam a interface Comparable. O tamanho dos dois tipos de enumeração pode ser comparado (organizado na ordem da declaração) |
clone | Os tipos de enumeração não podem ser clonados. Para evitar que as subclasses implementem o método clone, Enum implementa um clone invariável () que lança apenas CloneNotSupportedException. |
5. Use a palavra-chave enum para implementar a classe de enumeração da interface
-
Caso 1: implemente a interface e implemente o método abstrato na classe enum
import org.junit.Test; import java.util.Arrays; import java.util.Comparator; public class enumTest { @Test public void test() { } } interface info { void show(); } enum Season implements info{ SPRING("春天","春暖花开"), SUMMER("夏天","夏日炎炎"), AUTUMN("秋天","秋高气爽"), WINTER("冬天","冰天雪地"); private final String seasonName; private final String seasonDesc; private Season(String seasonName, String seasonDesc) { this.seasonName = seasonName; this.seasonDesc = seasonDesc; } @Override public void show() { System.out.println("这是Season枚举类"); } }
-
Caso 2: Deixe os objetos da classe de enumeração implementarem os métodos abstratos na interface, respectivamente
import org.junit.Test; import java.util.Arrays; import java.util.Comparator; interface info { void show(); } enum Season implements info{ SPRING("春天","春暖花开"){ @Override public void show() { System.out.println("春天在哪里"); } }, SUMMER("夏天","夏日炎炎"){ @Override public void show() { System.out.println("宁夏"); } }, AUTUMN("秋天","秋高气爽"){ @Override public void show() { System.out.println("秋天不回来"); } }, WINTER("冬天","冰天雪地"){ @Override public void show() { System.out.println("大约在冬季"); } }; private final String seasonName; private final String seasonDesc; private Season(String seasonName, String seasonDesc) { this.seasonName = seasonName; this.seasonDesc = seasonDesc; } } public class enumTest { @Test public void test() { Season[] value = Season.values(); for (int i = 0; i < value.length; i++) { value[i].show(); } } }
2. Anotação
1. Visão geral da anotação
- A partir do JDK 5.0, o Java adicionou suporte para MetaData, que é Annotation
- A anotação está realmente no códigoMarca especial, Essas tags podem ser lidas durante a compilação, carregamento de classe e tempo de execução, e o processamento correspondente pode ser executado. Ao usar a Anotação, os programadores podem incorporar algumas informações suplementares no arquivo de origem sem alterar a lógica original. Ferramentas de análise de código, ferramentas de desenvolvimento e ferramentas de implantação podem ser verificadas ou implantadas escrevendo informações suplementares.
- A anotação pode ser usada como um modificador. Ela pode ser usada para modificar a declaração de pacotes, classes, construtores, métodos, variáveis de membro, parâmetros e variáveis locais . Essas informações são armazenadas no par "nome = valor" da Anotação.
- Em JavaSE, o propósito de usar anotações é relativamente simples, como marcar recursos desatualizados e ignorar avisos. No Java EE / Android, as anotações ocupam um papel mais importante, por exemplo, são usadas para configurar qualquer aspecto do aplicativo, substituindo o código florescente e a configuração XML deixados na versão antiga do JavaEE.
- O modelo de desenvolvimento futuro é baseado em anotações. JPA é baseado em anotações. Spring 2.5 e superior são baseados em anotações. Hibernate 3.xe posterior também são baseados em anotações. Agora Struts2 é parcialmente baseado em anotações. Esta tendência pode ser considerada em certa medida: estrutura = anotação + reflexão + padrão de design .
2. Exemplos de anotações comuns
-
Ao usar Anotação, adicione o símbolo @ na frente e use a Anotação como um modificador. Usado para modificar os elementos do programa que suporta.
-
Anotações relacionadas a documentos parcialmente gerados
@author indica o autor que desenvolveu este tipo de módulo, usado entre vários autores, split @version indica a versão deste tipo de módulo
@ver direção de referência, ou seja, tópicos relacionados@desde de qual versão a descrição
@param de um parâmetro no método foi adicionada . Se não houver nenhum parâmetro, você não pode escrever a descrição do valor de retorno do método
@return . Se o tipo de valor de retorno do método for nulo , você não pode escrever
@exception. O método pode lançar Se o método não usar throws para lançar explicitamente uma exceção, ele não pode ser escrito- As três tags @param @return e @exception são usadas apenas para métodos.
- Requisitos de formato @param: nome do parâmetro @param, tipo de parâmetro, descrição do parâmetro
- @return format requisitos: @return return value type return value description
- Requisitos de formato @exception: @exception exception tipo descrição de exceção
- @param e @exception podem ser múltiplos
-
Verificação de formato em tempo de compilação (três anotações básicas integradas ao JDK)
- @Override : Limite sobrescrevendo o método da classe pai, esta anotação só pode ser usada para métodos
- @Deprecated : usado para indicar que o elemento modificado (classe, método, etc.) está desatualizado. Normalmente porque a estrutura modificada é perigosa ou existe uma escolha melhor
- @SuppressWarnings : Suprimir avisos de compilação
-
Acompanhar dependências do código e realizar a função de substituir arquivos de configuração
3. Anotação personalizada
- Consulte a definição de SuppressWarnings
- Defina um novo tipo de anotação para usar @interface Palavra-chave
- As anotações personalizadas herdam automaticamente a interface java.lang.annotation.Annotation
- Variáveis de membro de anotação são declaradas na forma de um método sem parâmetros na definição de anotação. O nome do método e o valor de retorno definem o nome e o tipo do membro. Chamamos isso de parâmetros de configuração. O tipo pode ser apenas uma matriz de oito tipos de dados básicos, tipo String, tipo de classe, tipo de anotação e todos os tipos acima .
- Você pode especificar o valor inicial ao definir a variável de membro de Anotação. A palavra-chave padrão pode ser usada para especificar o valor inicial da variável de membro ( recomendado )
- Se houver apenas um membro do parâmetro, é recomendado usar o valor do nome do parâmetro
- Se a anotação definida contiver parâmetros de configuração, o valor do parâmetro deve ser especificado ao usá-la, a menos que tenha um valor padrão. O formato é "nome do parâmetro = valor do parâmetro". Se houver apenas um membro do parâmetro e o nome for valor, você pode omitir "valor ="
- As anotações sem definições de membros são chamadas de tags ;
- As anotações que incluem variáveis de membro são chamadas de anotações de metadados
- As anotações personalizadas devem ser acompanhadas por um fluxo de processamento de informações anotadas para fazer sentido
4. Meta anotações de espécies JDK
-
A Meta Anotação do JDK é usada para modificar outras definições de Anotação
-
O JDK 5.0 fornece 4 tipos de metanotação padrão, a saber:
-
Retenção : usado apenas para modificar uma definição de Anotação, usado para especificar o ciclo de vida da Anotação, @Rentention contém um membro do tipo RetentionPolicy durante a conversa, ao usar @Rentention, você deve especificar um valor para a variável de membro de valor:
- RetentionPolicy.SOURCE: válido no arquivo de origem (ou seja, o arquivo de origem é retido) e os comentários desta política são descartados diretamente após a compilação
- RetentionPolicy.CLASS (comportamento padrão): válido no arquivo de classe (ou seja, retenção de classe), ao executar programas Java, a JVM não reterá comentários, este é o valor padrão
- RetentionPolicy.RUNTIME: Válido no tempo de execução (ou seja, retido no tempo de execução), ao executar programas Java, a JVM reterá os comentários. O programa pode obter o comentário por meio de reflexão.
-
Destino : usado para especificar quais elementos do programa a anotação modificada pode ser usada para modificar. @Target também contém uma variável de membro chamada valor
Valor (ElementType) Valor (ElementType) CONSTRUTOR Usado para descrever o construtor PACOTE Usado para descrever o pacote CAMPO Usado para descrever o domínio PARÂMETRO Usado para descrever parâmetros LOCAL_VARIABLE Usado para descrever variáveis locais TIPO Usado para descrever classes, interfaces (incluindo tipos de anotação) ou declarações enum MÉTODO Usado para descrever o método -
Documentado: a anotação modificada por ela será extraída em um documento pela ferramenta javadoc. Por padrão, o javadoc não inclui comentários.
- A anotação definida como Documentada deve definir o valor de Retenção para RUNTIME
-
Herdado: A Anotação modificada por ela terá herança . Se uma classe usa Annotation modificada por @Inherited, suas subclasses possuem esta anotação.
- Por exemplo: se você marcar as anotações personalizadas com anotações @Inherited no nível da classe, a subclasse pode herdar as anotações no nível da classe pai
- Na aplicação real, use menos
-
5. Use reflexão para obter informações de anotação
6. Novos recursos de anotações no JDK 8
- Anotações repetíveis: como
- Declare @Repeatable em MyAnnotation, o valor do membro é MyAnnotation.class
- Requisitos: Meta-anotações como Target e Retention of MyAnnotation são iguais a MyAnnotation
- Anotação de tipo
- ElementType.TYPE_PARAMETER: Indica que a anotação pode ser escrita na declaração de declaração da variável de tipo (como: declaração genérica)
- ElementType.TYPE_USE: indica que a anotação pode ser escrita em qualquer instrução usando o tipo