Vou comecar aqui uma serie de postagens com o resumo recente que fiz do livro Effective Java, 2nd Edition. Para quem nao conhece, e um livro bem recomendado na comunidade Java e alguns dizem que de leitura obrigatoria. A Caleum faz comentarios no seu blog http://blog.caelum.com.br/effective-java-segunda-edicao/.O livro tem em torno de 350 paginas e o resumo ficou em 33. Eu presumo um certo conhecimento da linguagem e por isso nao abordo explicacoes que achei muito basicas. Apesar disso, em alguns momentos, para assuntos mais dificeis, faco uma fundamentacao teorica antes de falar das dicas do Joshua Bloch. Os dois ultimos capitulos, que tratam respectivamente sobre concorrencia e serializacao, ficaram sem resumo. Se alguem se habilitar em fazer e me repassar para complementar o conteudo sera muito bem vindo. Bem vindas tambem sao as criticas e sugestoes. Gostaria de saber se o texto ficou claro e didatico suficiente e coisas do genero.Espero que gostem e boa leitura! Capitulo 2 Criando e destruindo objetosItem 1 Staticfactories ao inves de construtores Um metodo estatico que retorna uma instancia daclasse Semanticamente faz mais sentido do que ter queentender varios construtores com o mesmo nome que so variam os argumentos Nao precisam sempre instanciar um objeto novo.Facilitam o gerenciamento das instancias da classe e a criacao de classesimutaveis. Uma classe imutavel permite a comparacao dessa forma x == y inves deusar o equal com hashcode, o que melhora performance. Mantem a API mais enxuta uma vez que restringe anecessidade do usuario da API ter conhecimento de todas as classes concretasque existe. Isso ocorre, pois um metodo static factory method nao precisanecessariamente retornar uma instancia da classe, mas pode retornar qualquersubinstancia. Por exemplo, a classe Collections retorna 32 implementacoes deconveniencia da interface Collection. Essas implementacoes concretas nem saodisponibilizadas em documentacoes como parte da API, pois todas implementam ainterface e basta assim liberar documentacao apenas disso (como deveria mesmoser). Conceito de service provider framework: osmetodos fabrica podem, inclusive, retornar uma classe que nao existe nomomento. E o caso da API JDBC, onde as implementacoes concretas sao adicionadasdepois e registradas para poderem ser utilizadas. Map <String, List<String>> m =HashMap.newInstance(); -> o compilador infere e retorna uma instanciacorreta da classe. Map<String, List<String>> m = newHashMap<String, List<String>>(); - > o constructor nao consegue(ainda) fazer esse tipo de inferencia.Item 2 Builderclasses Classes com muitos parametros de inicializacaodevem usar Builderpublic interface Builder {T build();} O construtor do Builder tem os atributosobrigatorios. Metodos setters tem os atributos opcionais eretornam o proprio Builder, o que permite interface fluente O metodo build() retorna a classe concreta epode fazer validacoesItem 3 Singleton public static final Tipo INSTANCE = newTipo(); + construtor privado o static garante que sera executado assim que aclasse for carregada pelo class loaderou private static final Tipo INSTANCE = newTipo() + public static TipogetInstance() + construtor privado o getInstance() tem que ser static ja queretorna variavel estaticaAs duas abordagens acima nao preveem contra a evocacao doconstrutor privado atraves de reflexao e requerem cuidados especiais para quedurante a deserializacao nao seja criada outra instancia. A terceira opcao e a preferida -> Utilizaruma Enum com apenas um