Enumerações (enums)
São um conjunto fixo de instâncias de um tipo específico.
- Implicitamente são
public
,static
efinal
.
- 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
public
eabstract
.
- A única forma de um método concreto não causar conflito em casos de herança múltipla é se ele for
default
ouprivate
oustatic
.
- 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
default
são exclusivos de interfaces. Quando uma classe implementa mais de uma interface com um métododefault
de 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
private
são visíveis apenas dentro da interface.
- Métodos
static
sã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
static
está associada com o contextostatic
da 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
this
refere-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. contextostatic
da classe externa — de uma classe interna a ela. E vice-versa.
- Não é possível sobrescrever classes aninhadas.