Please enable JavaScript.
Coggle requires JavaScript to display documents.
Padrões de Projeto em Java (Exceções (Pilha de execução (Chamadas de…
Padrões de Projeto em Java
Collections Framework
java.util.List
ArrayList
Implementada internamente como um array
Mais rápida e econômica computacionalmente
Ineficiente se a lista sofrer constantes alterações
LinkedList
Usa mais memória e é mais lenta para ser percorrida
É mais rápida para inserções e remoções
Array
Não pode ser redimensionado em Java
É impossível buscar um elemento diretamente quando o índice dele é desconhecido
java.util.Set
Semelhante à definição de um conjunto
Cada objeto só pode aparecer uma vez no conjunto
Pode não manter a ordem de inserção
Implementações
HashSet
Usa tabela de hash
Não mantém ordem alguma
TreeSet
Usa uma árvore
Mantém os objetos em ordem crescente, para tanto os objetos devem implementar Comparable ou o set deve receber um Comparator para a ordenação
LinkedHashSet
Usa uma hash e uma lista ligada
Mantem a ordem de inserção
java.util.Collection
Não garantem ordem ou controlam a duplicidade
Representa apenas uma coleção de objetos
É a interface pai de Set e List
java.util.Map
Buscar rapidamente um objeto de acordo com uma informação fornecida sobre ele
Associações entre chaves e valores
Cada inserção, busca ou remoção de valores no Map deverá fornecer o objeto chave associado àquele valor
Implementações
HashMap
Utiliza uma hash
Não mantém ordem
TreeMap
Utiliza uma árvore
Mantém a árvore ordenada
LinkedHashMap
Utiliza lista ligada e tabela hash
Mantém ordem de inserção
equals() e hashCode()
São métodos da classe Object
equals() retorna true, na implementação de object, sempre que duas referências são iguais (mesmo que usar ==)
Sobrescrever equals()?
A tabela de hash utiliza o hashCode() de cada objeto para localizar, de forma direta, o seu lugar na tabela
Pode ser interessante sobrescrever este método para, por exemplo, comparar pessoas com base em seus CPFs
Para que as tabelas hash funcionem quando equals() for sobrescrito: considerar que os itens comparados devem possuir o mesmo hashCode()
Exceções
Em Java, os métodos dizem qual o contrato que eles devem seguir
Se, ao chamar o método, ele não consegue fazer o que deveria, ele precisa avisar ao usuário que a operação não foi feita
Normalmente, e graças ao encapsulamento, quem sabe tratar o erro é
aquele que chamou o método e não a própria classe! Portanto, nada
mais natural do que a classe apenas sinalizar que um erro ocorreu
Magic numbers
Pode ser usado para resolver (usado na programação procedural)
Problema: quem chama o método não é obrigado a tratar o magic number, ou seja, se nada for tratado, presume-se que tudo deu certo, mesmo que tudo tenha dado errado
Uma exceção representa uma situação que normalmente não ocorre e
representa algo de estranho ou inesperado no sistema
Pilha de execução
Chamadas de métodos são empilhadas em uma pilha de execução
Quando uma exceção ocorre e não é tratada, ela é exibida na saída padrão de erros (printStacktrace)
Na primeira linha, aparece o arquivo e linha onde a exceção foi gerada, e nas próximas linhas, os arquivos e linhas onde houve as chamadas de método até a ocorrência da exceção
Algumas exceções deixam uma mensagem para ajudar a esclarecer e diagnosticar o problema (boa prática)
Tratamento de exceções
Como tratar uma exceção?
Usando try {}catch {}
Usando try {} catch {} finally {}
finally {} é um bloco que sempre será executado
Como gerar uma exceção?
Usando throw new Exception()
Tipos de exceções
RuntimeException
Geradas em tempo de execução
Exemplos
Acesso fora dos limites de um vetor
Acesso à uma referência nula
CheckedException
São mais comuns
Sempre devem ser tradas ou declaradas na assinatura do método para serem tratadas por quem chamou
Error
Não é uma Exception, mas é um Throwable
Normalmente são erros internos na JVM
Não há muito o que fazer quando ocorrem
Programação Concorrente
Aspectos sobre concorrência, condições de corrida, semáforos, monitores, etc
A classe Thread é a representação de uma thread da JVM
Algumas observações iniciais sobre o Java
Pilha (stack)
Alocação de espaços de memória para o escopo de métodos
Apenas referências e tipos primitivos vão para a pilha
Monte (heap)
Alocação de objetos (new) é sempre feita no monte
Não existe um comando free(), ao invés disso, a JVM usa uma estratégia de Garbage Collector
Referência VS Ponteiros
Ponteiros
Ponteiros são endereços de memória e permitem operações sobre eles
Operações
Referenciar
Derreferenciar
Incrementar
decrementar
etc
Referência
Também são endereços de memória, porém mais abstratos
Não existem operações feitas diretamente sobre as referências, as operações sobre ponteiros são, na verdade, realizadas sobre os próprios objetos apontados
A ideia principal por detrás da orientação a objetos é
permitir adicionar comportamento aos dados
Encapsulamento
Public: acesso irrestrito a atributos e métodos
private: não permite acessos externos a atributos e métodos
protected: permite acesso apenas às subclasses
default (sem especificar o modificador): publico apenas para as classes do mesmo pacote, é privado para as demais
Interfaces
Uma interface pode estender várias interfaces
Uma classe concreta pode implementar várias interfaces, por outro lado, só pode estender uma classe
No Java 8, interfaces podem implementar métodos concretos usando a palavra default
As duas regras de ouro em orientação a objetos
Evite herança, prefira composição
Programe voltado a interface e não a
implementação - encapsulamento
javax.reflection
é um pacote do Java que permite criar chamadas
em tempo de execução, sem precisar conhecer as classes e objetos envolvidos quando escrevemos nosso código (tempo de compilação)
Esse dinamismo é necessário para resolvermos determinadas tarefas que nosso programa só descobre serem necessárias ao receber dados, em tempo de execução
Algumas possibilidades
Listar todos os atributos de uma classe e pegar seus valores em um objeto
Instanciar classes cujo nome só vamos conhecer em tempo de
execução
Invocar métodos dinamicamente baseado no nome do método como String
Descobrir se determinados pedaços do código têm annotations
O ponto de partida de reflection é a classe Class. Esta, é uma classe da própria API do Java onde cada instância representa uma classe do modelo presente
Através da Class conseguimos obter informações sobre qualquer classe do sistema, como seus atributos, métodos, construtores, etc
Negocio n = new Negocio(); Class<Negocio> classe = n.getClass();
// outra forma
Class<Negocio> classe = Negocio.class;
// outra forma
Class classe = Class.forName(“Negocio”);
A última forma é mais versátil, pois permite carregar
qualquer classe a partir de uma String
Contudo, o nome da classe passada por parâmetro já
deve estar previamente carregada no sistema
Podemos fazer a carga de classes também em runtime?
Padrões de projeto
GoF
Padrões estruturais
Padrões comportamentais
Padrões de criação
Visa dar suporte a um mecanismo uniforme, simples e controlado para criar objetos
Factory Method
Encapsular a escolha da classe concreta a ser
utilizada na criação de objetos de um determinado tipo
Singleton
Permitir a criação de uma única instância de uma classe e
fornecer um modo para recuperá-la
Não GoF
Object Pool
Possibilitar o reaproveitamento de objetos
Multiton
Permitir a criação de uma quantidade limitada de instâncias
de determinada classe e fornecer um modo para recuperá-las
Abstract Factory
Encapsular a escolha das classes concretas a serem
utilizadas na criação dos objetos de diversas famílias
Prototype
Cópia rasa
Cópia profunda
Possibilitar a criação de novos objetos a partir da cópia de
objetos existentes
Builder
Separar o processo de construção de um objeto de sua representação e permitir a sua criação passo-a-passo. Diferentes tipos de objetos podem ser criados com implementações distintas de cada passo
Padrões de projeto básicos
Interface
Abstract Parent Class
Private Methods
Accessor Methods
Constant Data Manager
Immutable Object