Orientação a Objetos

Created
Mar 21, 2021 10:08 PM
Objetivo
Revisar
Estado
Finalizado

Enumerações (enums)

💡
São um conjunto fixo de instâncias de um tipo específico.
  • Implicitamente são public, static e final.
  • Todas enumerações implicitamente estendem java.lang.Enum<E>. Essa classe dispõe os métodos name(), ordinal() e valueOf().
  • 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 permite extends 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 e abstract.
  • A única forma de um método concreto não causar conflito em casos de herança múltipla é se ele for default ou private ou static.
  • 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étodo default 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 abstrato void print();. Uma classe que implementa X e Y, não precisará sobrescrever print, 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 contexto static 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 acesso public.
  • 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. contexto static da classe externa — de uma classe interna a ela. E vice-versa.
  • Não é possível sobrescrever classes aninhadas.