Repositório com utilidades e resumos relacionados ao livro que achei úteis e utilizarei no meu dia a dia. Não nessariamente listarei todos os itens que considerei importantes, omiti os itens que já utilizava diariamente.
Disponibilizei templates, para o eclipse, que auxiliam a criação de classes e métodos baseados nos 3 primeiros capítulos do livro
- Window
- Preferences
- Java -> Editor -> Templates -> Import
- Selecionar arquivo templates-java-efetivo.xml
- Crie um arquivo java com o nome final e no pacote correto
- No arquivo criado, digite o caracter 'v' e em seguida 'control + espaço'
- Não forneça métodos que modificem o estado do objeto
- Garanta que a classe não possa ser estendida
- Faça com que todos os campos sejam finais
- Faça com que todos os campos sejam privados
- Garanta o acesso exclusivo a quaisquer componentes mutáveis
- Exemplo do Livro é: Criar um Set que armazene quantos elementos foram adicionados desde sua criação. (Resposta: Classe Wrapper)
- Exemplo de implementação ruim de Herança: Properties
- Exemplo de implementação ruim: Classe Figura com um atributo Shape. Necessitando assim de um switch no método area
Como o título remete, é principalmente para definição de APIs.
Para métodos produtores, ou seja, que consomem elementos de uma lista, utilize Collection<? extends E>
Para métodos consumidores, utilize Collection<? super E>
Desvantagens dos padrões de nomenclatura:
- Erros de digitação provocam erros silenciosos
- Não é possível assegurar que sejam utilizados nos elementos certos da aplicação.
- Não fornecem uma boa maneira de associar os valores de parâmetros aos elementos do programa
- Se uma anotação for do tipo Type, avalie se não deveria ser uma interface marcadora.
- Caso a anotação seja aplicada apenas as implementações de uma classe específica, interface marcadora é ideal.
- Vai existir um ou mais métodos que deve receber apenas um tipo? Utilize Interface Marcadora.
Tipo de referência | Exemplo | Lambda correspondente |
---|---|---|
Estática | Integer::parseInt | str -> Integer.parseInt(str) |
Limitada | Instant.now()::isAfter | Instant then = Instant.now(); t -> then.isAfter(t) |
Ilimitada | String::toLowerCase | str -> str.toLowerCase() |
Construtor de classe | TreeMap<K,V>::new | () -> new TreeMap<K,V> |
Construtor de array | int[]::new | len -> new int[len] |
Ex: UnaryOperator, BinaryOperator, Predicate, Function, Supplier, Consumer.
Irá diminuir a necessidade de depuração do código em alguns tipos de bugs
Mesmo para objetos mutáveis, avalie se deve ser feito cópias dos parâmetros nos métodos antes da utilização ou cópias dos atributos em getters