DEV Community

Paula Santana
Paula Santana

Posted on • Edited on

Java Efetivo Essencial - Criação de Objetos

Evite a criação de objetos desnecessários

Esta é uma série baseada no entendimento de tópicos relacionados ao livro com foco no resumo.

Iniciando os trabalhos...

O livro cita a importância de reutilização de objetos, especialmente quando um novo objeto tem a mesma função.
Além disso ele ressalta a importância da imutabilidade de objetos, pois isso facilita mais ainda a reutilização.
E para tomar como exemplo ele usa a classe String, que além de ser imutável é um ótimo exemplo de reutilização do nosso dia a dia.

String

//exemplo A
// Neste exemplo o Java irá verificar se já existe uma instância na memória com a mesma sequência de caracteres
String nomeA = "Paula";

//exemplo B
//Neste exemplo será criada uma nova instância em memória apesar de já termos uma instância com a mesma sequência de caracteres
String nomeB = new String("Paula");

Enter fullscreen mode Exit fullscreen mode

Como?

Uma das formas de evitarmos a criação desnecessária de objetos seria através do uso de métodos static factory, no lugar de construtores em classes imutáveis.
Apesar de podermos fazer isso em classes mutáveis precisamos considerar que elas podem sofrer alterações ao longo de sua utilização então poderia perder o propósito de ser reutilizada.
Se o objeto requer muito trabalho para ser criado vale considerarmos armazená-lo em cache para facilitar seu uso.

Mais situações

O livro cita exemplos internos do Java que utilizam essa premissa e outras partes que foram recriados e utilizaram para melhorar sua performance.
Mas diria que outro ponto que é citado que acamos utilizando muito no dia a dia é o uso de autoboxing .
Autoboxing e Autounboxing é o uso de primitivos com tipos primitivos empacotados.
Vamos ver um exemplo a seguir.

Autoboxing

// O código abaixo terá um problema de desempenho pois toda vez que a variável i que é primitiva for somada a variável soma que é um tipo primitivo empacotado, ou seja uma classe,é criada uma nova instância. 

Integer total = 1;
for (int i = 0; i < 100; i++) {
    total += i;
}

// O livro deixa claro que devemos sempre preferir o uso de primitivos e evitarmos o uso de autoboxing involuntário no nosso código.

Enter fullscreen mode Exit fullscreen mode

Casos para evitar

O uso dessa abordagem em alguns cenários deve ser avaliada, isso se aplica apenas em algumas situações, em especial construção de objetos complexos, como por exemplo em casos em pool de objetos. O livro até cita como exemplo o pool de conexão com banco de dados, que no caso o custo de se obter esse objeto vale a sua reutilização, mas nem sempre compensa reutilizarmos, devemos analisar situação a situação.

Analise quando usar

Outro ponto abordado é que esse item do livro vai de encontro com outro item que incentiva cópias defensivas, e ele explica que nesse cenário é importante ter em mente que cópias defensivas evitam problemas através de bugs e falhas de segurança, enquanto a reutilização de instâncias tem como objetivo estilo e desempenho.O que faria o item de cópias defensivas ser mais importante do que evitar a criação de objetos.

Top comments (0)