Conceitos Fundamentais
- Classes, objetos, referências, atributos, métodos
- Interfaces, classes abstratas
- Herança, composição
- Visibilidade: privado, pacote, público
Programação Orientada a Objetos
- Tudo é tratado como objeto
- Programas são coleções de objetos que interagem via mensagens
- Cada objeto possui estado (atributos) e comportamento (métodos)
- Cada objeto pertence a um tipo específico
- Objetos do mesmo tipo respondem às mesmas mensagens
Princípios Essenciais
- Alta coesão, baixo acoplamento
- Separação entre elementos mutáveis e imutáveis
- Dependência de abstrrações, não implementações
- Preferência por composição sobre herança
- Princípio aberto/fechado
Exemplo Prático: Limitações do Operador New
class Aparelho {
private Tela tela = new TelaLCD();
void iniciar() {
tela.exibir();
}
}
interface Tela {
void exibir();
}
class TelaLCD implements Tela {
public void exibir() {
System.out.println("Exibindo conteúdo...");
}
}
Problemas:
- Dependência direta entre classes
- Dificuldade em alterar implementações
- Criação obrigatória de novas instâncias
Solução: Fábrica Estática
class Aparelho {
private Tela tela = FabricaTelas.criarTelaLCD();
void iniciar() {
tela.exibir();
}
}
class FabricaTelas {
public static Tela criarTelaLCD() {
return new TelaLCD();
}
}
Vantagens:
- Isloamento de dependências
- Nomes descritvios para criação
- Possibilidade de reutilizar instâncias
Solução: Configuração por Variáveis de Ambiente
class FabricaTelas {
public static Tela criarTela() {
String nomeClasse = System.getProperty("tela.tipo");
try {
Class> classe = Class.forName(nomeClasse);
return (Tela) classe.newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
Vantagem: Flexibilidade via configuração externa
Solução: Registro Global
class RegistroServicos {
private static Map<string object=""> servicos = new HashMap<>();
public static void registrar(String nome, Object servico) {
servicos.put(nome, servico);
}
public static Object obter(String nome) {
return servicos.get(nome);
}
}
// Uso:
RegistroServicos.registrar("tela", new TelaLCD());
Tela tela = (Tela) RegistroServicos.obter("tela");</string>
Aplicações: Sistemas JEE, gestão centralizada de dependências