Enumerações (enums)
São um conjunto fixo de instâncias de um tipo específico.
- Implicitamente são
public,staticefinal.
- Todas enumerações implicitamente estendem
java.lang.Enum<E>. Essa classe dispõe os métodosname(),ordinal()evalueOf().
- Melhoram a leitura e reduzem erros e manutenção de valores hard-coded.
Criação
- Podem possuir variáveis e métodos de instância.
- Um construtor deve ser adicionado para inicializar as variáveis de instância. Esse construtor é invocado ao declarar um valor da enumeração.
- Podem ter métodos abstratos, que serão implementados por classes anônimas.
- Não podem ser estendidos, pois toda enumeração, por padrão, já estende
Enum, e Java não permiteextends Enum, Condition. A alternativa é utilizar interfaces.
package demos; public enum Condition { HOT("Ta quente pra c******!"), COLD("Ah... agora tá tranquilo."); private String message; private Condition(String message) { this.message = message; } public String getMessage() { return message; } }
// o enum a esquerda é equivalente // a essa class public class Condition extends Enum { public static final Condition HOT = new Condition("Ta quente pra c******!"), COLD = new Condition("Ah... agora tá tranquilo."); private String message; private Condition(String message) { this.message = message; } public String getMessage() { return message; } }
// com métodos abstratos public enum Condition { HOT(30) { @Override public String scream() { return "AAAAAH TÁ QUENTE!"; } }, COLD(15) { @Override public String scream() { return "AAAAAH TÁ FRIO!"; } }; private int threshold; private Condition(int threshold) { this.threshold = threshold; } public abstract String scream(); public int getThreshold() { return threshold; } }
Interfaces
Criação
- Métodos de instância são por padrão
publiceabstract.
- A única forma de um método concreto não causar conflito em casos de herança múltipla é se ele for
defaultouprivateoustatic.
- Podem ter constantes, mas não variáveis de instância.
Utilização
- Solucionam o problema de herança múltipla. Fazem isso pois não permitem variáveis de instância e dispõe ferramentas para lidar com métodos concretos. Com esses recursos não há risco de ambiguidade na interpretação da JVM.
- Podem ser utilizadas como um tipo. Uma referência declarada como um tipo de interface tem acesso apenas às operações descritas por essa interface. Por mais que em memória operações que existam na classe, mas não na interface, ainda possam ser acessadas após um cast.
Métodos default, private e static
- Métodos
defaultsão exclusivos de interfaces. Quando uma classe implementa mais de uma interface com um métododefaultde mesma assinatura, o compilador obriga que esse método seja sobrescrito. - A interface X tem o método concreto
default void print(); uma interface Y tem o método abstratovoid print();. Uma classe que implementa X e Y, não precisará sobrescreverprint, já que ela está herdando a implementação de X.
- Métodos
privatesão visíveis apenas dentro da interface.
- Métodos
staticsão invocados diretamente da classe em que são declarados.
Declaração e instância de objetos
Classes aninhadas
Utilizadas para encapsular lógica e restringir o contexto de uso.
- Uma classe aninhada
staticestá associada com o contextostaticda classe externa. - Não é considerada um classe interna pois — quando não é
private— pode ser usada diretamente, como qualquer outra classe. Diferente das classes internas que precisam de uma instância da classe externa para serem acessadas, mesmo com modificador de acessopublic.
- Uma classe interna membro está associada com o contexto de instância da classe externa.
- Uma classe interna local está associada com o contexto do método específico.
- Uma classe interna anônima é uma implementação ou extensão em linha de uma interface ou classe.
- No contexto de uma classe aninhada/interna a palavra
thisrefere-se ao contexto da classe interna, não da externa.
- Uma classe externa pode acessar qualquer variável ou método
private— contanto que seja do mesmo contexto, e.g. contextostaticda classe externa — de uma classe interna a ela. E vice-versa.
- Não é possível sobrescrever classes aninhadas.