<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Paula Santana</title>
    <description>The latest articles on DEV Community by Paula Santana (@psanrosa13).</description>
    <link>https://dev.to/psanrosa13</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F353282%2Fc8cee86a-8938-4f69-9521-8b1f26aca263.jpg</url>
      <title>DEV Community: Paula Santana</title>
      <link>https://dev.to/psanrosa13</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/psanrosa13"/>
    <language>en</language>
    <item>
      <title>Evite Classes Tagged</title>
      <dc:creator>Paula Santana</dc:creator>
      <pubDate>Mon, 11 Sep 2023 17:45:13 +0000</pubDate>
      <link>https://dev.to/psanrosa13/evite-classes-tagged-52fm</link>
      <guid>https://dev.to/psanrosa13/evite-classes-tagged-52fm</guid>
      <description>&lt;h2&gt;
  
  
  Dê preferência às hierarquias de classes em vez das classes tagged.
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Esta é uma série baseada no entendimento de tópicos relacionados ao livro com foco no resumo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que é uma classe Tagged?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;São classes que representam mais de um tipo de objeto e utilizando um atributo que identifique qual o objeto foi instanciado.&lt;br&gt;
Vamos ver o exemplo citado no livro Java Efetivo que torna mais clara essa afirmação.&lt;br&gt;
Veja que a classe representa tanto um circulo quanto um retângulo e que alguns campos só fazem sentido quando é um dos tipos das instâncias.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fumrz092qtv5fmz66es0z.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fumrz092qtv5fmz66es0z.PNG" alt="Image description" width="593" height="976"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problemas&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Muito Boilerplate&lt;/li&gt;
&lt;li&gt;Campos de tag ( campos de tem objetivo de identificar o tipo da instância do objeto)&lt;/li&gt;
&lt;li&gt;Legibilidade ruim, pois tem muitas particularidade para cada tipo&lt;/li&gt;
&lt;li&gt;Uso desnecessário de memória, visto que nem todos os campos serão utilizados para cada tipo&lt;/li&gt;
&lt;li&gt;Mais difícil o uso de campos final&lt;/li&gt;
&lt;li&gt;Criação de muitos construtores&lt;/li&gt;
&lt;li&gt;Maior possibilidade de erros de execução&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Resumindo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Classes Tagged são verbosas, sujeitas a erros e ineficientes.&lt;br&gt;
Se analisarmos bem as classes tagged são uma forma de estrutura do que poderia ser uma hierarquia de classes.&lt;br&gt;
Então o livro mostra como seria refatorar o exemplo para o caminho certo, usando hierarquia.&lt;br&gt;
Vamos ver?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Passos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;De maneira bem sútil é orientada uma sequência de passos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Criar uma classe abstrata com os métodos que não possuem comportamento diferente de acordo com o tipo&lt;/li&gt;
&lt;li&gt;Criar as classes concretas, considerando cada tipo do campo tag para uma implementação diferente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Resultado&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3wbqiqeerpo3gex2om47.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3wbqiqeerpo3gex2om47.PNG" alt="Image description" width="307" height="96"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8qfc1dzjnud7svsrr5j.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe8qfc1dzjnud7svsrr5j.PNG" alt="Image description" width="458" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgckqt9lgia35s465zmkl.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgckqt9lgia35s465zmkl.PNG" alt="Image description" width="495" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A nova estrutura permite:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Diminuir boilerplate&lt;/li&gt;
&lt;li&gt;Evitar erros de excução&lt;/li&gt;
&lt;li&gt;Fácil entendimento&lt;/li&gt;
&lt;li&gt;Campos final&lt;/li&gt;
&lt;li&gt;Felixibilidade&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ou seja, sempre pense ao criar uma classe tagged se não seria melhor utilizar a hierarquia de classes.&lt;/p&gt;

</description>
      <category>java</category>
      <category>developer</category>
      <category>development</category>
      <category>programming</category>
    </item>
    <item>
      <title>Java Efetivo - Constantes</title>
      <dc:creator>Paula Santana</dc:creator>
      <pubDate>Mon, 27 Feb 2023 20:07:14 +0000</pubDate>
      <link>https://dev.to/psanrosa13/java-efetivo-constantes-351j</link>
      <guid>https://dev.to/psanrosa13/java-efetivo-constantes-351j</guid>
      <description>&lt;h2&gt;
  
  
  Use as interfaces para definir tipos
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Esta é uma série baseada no entendimento de tópicos relacionados ao livro com foco no resumo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interfaces&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sabemos que quando uma classe implementa uma interface, essa interface a qual ela implementou pode ser utilizada como um tipo.&lt;br&gt;
Sempre precisamos ter em mente que ao criar uma interface podemos ter em mente o que será possível realizar com as instâncias das classes que a implementarem.&lt;br&gt;
Vamos imaginar que temos classes que possuem um comportamente relacionado a pagamentos, ou seja, elas são pagáveis, isso indica que há classes que permitem ações relacionadas a esse assunto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh8hxn3nrh7qev7i74ocz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh8hxn3nrh7qev7i74ocz.png" alt=" " width="800" height="620"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Não esta correto&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O que não é considerado correto quando utilizamos interfaces.&lt;br&gt;
Usarmos interfaces para qualquer outra coisa que não seja definir uma idéia do que seja possível realiza com as classes que a implementam. &lt;br&gt;
Exemplo citado no livro é o de criação de "interface constante" onde o único objetivo é agrupamento de constantes para serem utilizadas por outras classes.&lt;br&gt;
Essa abordagem não é considerada correta.&lt;/p&gt;

&lt;p&gt;Isso porque interfaces deveriam conter constantes apenas para efeito de implementações internas e não para disponibilizar em suas implementações.&lt;br&gt;
De qualquer forma há situações onde há precisaremos criar uma constante na interface e/ou classe e não devemos ter receio disso desde que realmente a constante esteja ligada diretamente com o propósito da classe e da interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lembre-se&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;lembrando que a melhor maneira de criarmos constantes no Java são através de Enum ou como uma classe utilitária não instanciável.&lt;br&gt;
E não considerando o uso de Interfaces para isso.&lt;br&gt;
Interfaces devem ser utilizadas somente para definir tipos não para agrupamento de constantes.&lt;/p&gt;

</description>
      <category>critique</category>
      <category>brainstorming</category>
      <category>gratitude</category>
      <category>inspiration</category>
    </item>
    <item>
      <title>Java Efetivo Essencial - Método Padrão</title>
      <dc:creator>Paula Santana</dc:creator>
      <pubDate>Mon, 06 Feb 2023 21:45:19 +0000</pubDate>
      <link>https://dev.to/psanrosa13/java-efetivo-essencial-metodo-padrao-27i8</link>
      <guid>https://dev.to/psanrosa13/java-efetivo-essencial-metodo-padrao-27i8</guid>
      <description>&lt;h2&gt;
  
  
  Proteja as interfaces para a posteridade
&lt;/h2&gt;

&lt;p&gt;_Esta é uma série baseada no entendimento de tópicos relacionados ao livro com foco no resumo.&lt;br&gt;
_&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interfaces&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Já sabemos que antes do Java 8 não era possível adicionar métodos sem gerra um quebra nas interfaces, ou seja, fazer com que todas as classes que implementasse a interfasse tivessem que implementar o novo método.&lt;br&gt;
Com o Java 8 surgiram os métodos padrões, que permitem que adicionemos um método com implementação na interface, ou seja, nesse caso as classes que implementam a interface herdam o método padrão.&lt;br&gt;
Porém é necessário que ter em mente que alterações em interfaces pode ser arriscado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atenção&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mesmo sendo possível adicionar o método padrão e ele ser utilizado por todas classes que implementam a interface não é possível ter controle de que a execução do método novo será com sucesso em todas as implementações.&lt;br&gt;
O livro usa bastante exemplos da própria base de código do Java e então o exemplo citado sobre esse ponto é da interface de Collections, que teve métodos padrão implementados para que as lambdas fossem implementadas em todas as implementações de coleções.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problemas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Um dos métodos implementados em Collections é o removeIf que não tem um efeito possitivo em todas implementações, como citado no livro algumas classes wraper por exemplo como a SynchronizedCollection da biblioteca Apache Commons acabam não executando bem esse método( pelo menos até a data de escrita do livro), isso porque quando um método padrão novo é implementado pode não conseguir atender todas as possibilidades de implementação. Então ao adicionarmos um método padrão precisamos ter em mente isso. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Então&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Então devemos ficar atentos na execução do método nas implementações da interface.&lt;br&gt;
E isso porque pode parece um recurso fácil de utilizar, mas ainda temos que garantir estabilidade na escrita de uma interface. Sempre se questione quando uma interface mudar muito, isso pode ser um problema no design da aplicação.&lt;br&gt;
Tenha cautela ao projetar intefaces.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resumo do Resumo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Métodos padrão são bons, mas devem ser utilizados em exceções em especial quando se tem noção das implementações da interface de modo que consiga projetá-lo bem.&lt;br&gt;
Teste bem suas interfaces, implementando clientes das interfaces de forma totalmente diferente. &lt;br&gt;
Corrigir erros depois de implementados em interfaces acaba sendo um trabaho mais difícil.&lt;/p&gt;

</description>
      <category>java</category>
      <category>programming</category>
    </item>
    <item>
      <title>Java Efetivo Essencial - Interface</title>
      <dc:creator>Paula Santana</dc:creator>
      <pubDate>Mon, 23 Jan 2023 20:11:41 +0000</pubDate>
      <link>https://dev.to/psanrosa13/java-efetivo-essencial-interface-2fcb</link>
      <guid>https://dev.to/psanrosa13/java-efetivo-essencial-interface-2fcb</guid>
      <description>&lt;h2&gt;
  
  
  Prefira as interfaces em vez das classes abstratas
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Esta é uma série baseada no entendimento de tópicos relacionados ao livro com foco no resumo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interfaces&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As interfaces são tipos abstratos, que utilizam a palavra reservada interface. Utilizadas para criar comportamentos que uma classe pode implementar. Antes apenas criávamos as assinaturas dos métodos nas interfaces, após o Java 8 houveram mudanças, como a implementação de métodos e atributos.&lt;br&gt;
Interfaces permitem trabalharmos com polimorfismo no Java. Por regra uma classe pode implementar várias interfaces, caso o método não tenha implementação na interface é necessário fazer a implementação na classe que implementou a interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Classes Abstratas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;É um tipo de classe no Java, no qual não será possível criar uma instância direta da mesma. Utilizamos a palavra reservada abstract para criarmos esse tipo de classe.&lt;br&gt;
Tem o propósito apenas de criarmos uma estrutura de classe para que ela seja super classe de outras classes através herança.&lt;br&gt;
Assim como regra de herança no Java, uma classe consegue apenas ter uma única super classe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vantagens&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Existe uma grande vantagem em trabalharmos com interface, pois ao adicionar novas interfaces a uma classe já existente não impactamos no funcionamento e estrutura existentes.&lt;br&gt;
Mas não acontece o mesmo quando tentamos adicionar uma classe abstrata nova em uma estrutura de classes existente.&lt;br&gt;
Como uma classe pode implementar várias interfaces, mas não pode ter mais que uma super classe, trabalhar com interfaces acaba sendo mais fácil e maleável.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Misture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Antes do Java 8 não havia implementações de métodos, o que sugeria o uso de interfaces com classes abstratas para que fosse possível utilizar o mesmo dos dois mundos. Ainda assim o que me intrigou no livro é que utilizando de exemplos do Java manteve-se essa abordagem para implementação de métodos padrões, utilizando classes abstradas. &lt;br&gt;
Como por exemplo a classe AbstractMapEntry que implementa a interface Map.Entry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resumo do Resumo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Trabalhar com interfaces é garantir flexibilidade no design do seu código.&lt;br&gt;
Ainda sim é a melhor forma de trabalharmos com tipagem múltipla.&lt;br&gt;
E se desejar implementar modelos prontos de implementação, utilize os recursos "novos" ( nem tão novos assim) que possibilitam implementação diretamente na interface.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>community</category>
    </item>
    <item>
      <title>Java Efetivo Essencial - HERANÇA</title>
      <dc:creator>Paula Santana</dc:creator>
      <pubDate>Wed, 21 Dec 2022 14:18:53 +0000</pubDate>
      <link>https://dev.to/psanrosa13/java-efetivo-essencial-heranca-2m88</link>
      <guid>https://dev.to/psanrosa13/java-efetivo-essencial-heranca-2m88</guid>
      <description>&lt;h2&gt;
  
  
  Projete e documente as classes para herança ou a iniba
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Esta é uma série baseada no entendimento de tópicos relacionados ao livro com foco no resumo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atenção&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O tópico anterior alertou que podemos ter problemas ao trabalharmos com herança. Isso porque a subclasse acaba tendo poderes que podem interferir nos principios de design da classe, como por exemplo no encapsulamento.&lt;br&gt;
Nesse tópico do livro vamos ver o que é interessante adotar caso trabalhe com herança ou como inibir o uso da mesma em seu código.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documente&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O primeiro ponto abordado nesse tópico do livro é sobre deixar claro através de documentação do método que pode ser sobrescrito em subclasses através da herança e os impactos que essa sobrescrita pode causar na execução do código.&lt;br&gt;
Ele cita o usa da anotação @implSpec para determinar não só o que o método faz, mas como faz, o que pode não fazer sentido para você desenvolvedor, mas que pode evitar dores de cabeças futuras por sobrescritas de métodos em heranças.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Proteja&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A outra abordagem adotada nesse ponto do livro é sobre proteger membros relacionados ao código que você quer garantir que não sejam sobrescritos.&lt;br&gt;
Porém é interessante entender que nem sempre proteger alguns membros será positivo, o livro cita exemplos do próprio code base do Java, mas acredito que faça mais sentido falarmos de uma situação hipotética que você utilize no seu dia a dia.&lt;br&gt;
Imagine você permitir sobrescrever um método mas não métodos que realizam cálculos com esse método sobrescrito, pode ser um problema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Teste&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O livro cita a importância de testar se o uso de herança em seu código esta adequado.&lt;br&gt;
Para isso é recomendável escrever subclasses e entender o quanto o compartamento dessas quebram principios de design e quanto isso pode gerar falhas de segurança em seu código.&lt;br&gt;
Outra forma também de perceber que ocultou algum item que era importante para execução do código da subclasse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Restrições a considerar&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Uma das restrições claras impostas nesse ponto é a utilização de métodos que podem ser sobrescritos nos construtores, não faça isso se você deseja que algum método seja sobrescrito.&lt;br&gt;
Implementar as interfaces Cloenable e Serializable em classes que são projetadas para herança, pois isso impõe uma carga de implementação para os programadores que fizerem as subclasses. Existem formas de contornar esses pontos que são abordados em tópicos do livro ( caso queira mais detalhes vale ler a explicação completa pois não é possível adicionar em um simples resumo ok?)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impedir&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Não acho que o livro faça uma apologia a não usar herança mas traz a tona a preocupação de utilizar essa abordagem.&lt;br&gt;
Realmente na maioria das vezes não projetamos classes pensando em herança e por isso é importante nesses casos garantir que se elas não foram projetadas para tal que não permitam subclasses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como impedir&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A maneira mais simples de evitarmos que uma classes seja herdada é tornando ela final.&lt;br&gt;
A outra forma seria tornando todos os construtores privados, pacotes privados e criando static factories no lugar de construtores públicos, é claro que ainda assim alguém diga que é possível utilizar de reflexão para isso, mas daí vamos e convenhamos que o desenvolvedor terá esforço para isso e estará claro que estará indo contra o design do código.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Resumo do Resumo *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Não é simples construir uma classes pensando em herança.&lt;br&gt;
Precisamos sempre evitar utilização  de métodos que podem ser sobrescritos ou documentar o impacto deles para o código a ser herdado.&lt;br&gt;
Sempre pensando que como construimos a classe principal poderá gerar impactos nas subclasses.&lt;/p&gt;

</description>
      <category>java</category>
      <category>programming</category>
      <category>backend</category>
    </item>
    <item>
      <title>Java Efetivo Essencial - Composição</title>
      <dc:creator>Paula Santana</dc:creator>
      <pubDate>Tue, 29 Nov 2022 21:02:56 +0000</pubDate>
      <link>https://dev.to/psanrosa13/java-efetivo-essencial-composicao-g75</link>
      <guid>https://dev.to/psanrosa13/java-efetivo-essencial-composicao-g75</guid>
      <description>&lt;p&gt;Prefira a composição à herança&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Esta é uma série baseada no entendimento de tópicos relacionados ao livro com foco no resumo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A herança&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No livro o primeiro ponto abordado no item que vamos falar nesse resumo é sobre o perigo do uso de Herança em Classes concretas, o autor deixa claro que não é relacionado a herança aplicada a interfaces e sim a quando uma classe estende outra, isso porque quando a herança ocorre em um contexto de pacotes controlado pode ser uma boa, porém, quando a herança passa além do pacote onde foi implementada, pode ser fácil de gerarmos problemas em nossa aplicação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pensando Bem...&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Poucos sistemas que atuei utilizam herança e talvez você também já tenha percebido algo semelhante. No geral é mais comum usarmos apenas herança em interfaces e polimorfismo. Há discussões sobre se a herança deveria ser algo a se manter, mas ainda é uma abordagem que muitos aprendem e ficam se perguntando o porque de aprender e não utilizar tanto. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problemas...&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Um dos pontos é que ao utilizar herança violamos o princípio do encapsulamento visto que a subclasse depende dos detalhes da super classe para seu funcionamento e em caso de mudanças nessas implementações o impacto seria diretamente nas classes filhas. Lembrando que há situações que são exceções e que você pode projetar uma classe pensando nessas situações, mas a questão é que é possível ocorrer isso é um ponto de atenção em projetos que certamente diversas pessoas atuarão.&lt;/p&gt;

&lt;p&gt;Composição&lt;/p&gt;

&lt;p&gt;Como esse é um resumo do tópico vale ressaltar que no livro ele cita exemplos e mais problemas que podem decorrer do uso de Herança. Mas existe uma abordagem alternativa a herança que possivelmente você já viu em projetos Java!&lt;br&gt;
O uso de composição de objetos, que é quando adicionamos um atributo privado que referencia a instância de outro objeto, o termo é usado dessa forma pois esse objeto será utilizado como um componente dentro da classe que esta sendo referenciado.&lt;br&gt;
Isso porque na maioria dos casos, nossas classes necessitam de outras classes para realizar operações e não porque elas são subtipos de outra classe. &lt;br&gt;
Além disso conseguimos projetar interfaces e comunicação especificas por classe e tratar problemas que podem ocorrer de maneira mais especifica.&lt;br&gt;
Por exemplo, a Classe GerarRelatorio pode utilizar classes de uma biblioteca que gera arquivos de Excel, a nossa classe de relatório tem objetivo diferente e deseja tratar como criar o arquivo e resolver problemas que podem ocorrer de maneira específica.&lt;/p&gt;

&lt;p&gt;Vantagens&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Permite reutilização de código;&lt;/li&gt;
&lt;li&gt;Permite compor um objeto com múltiplos objetos o que não é possível através de herança no Java;&lt;/li&gt;
&lt;li&gt;Facilidade em executar e dividir os testes;&lt;/li&gt;
&lt;li&gt;Flexibilidade para futuras implementações;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Atenção&lt;/p&gt;

&lt;p&gt;Sempre é importante entender que a composição se tornará uma dependência a ser gerenciada e que é necessário garantir a  consistência das dependências ao instanciar o objeto, ou seja, se sua classe A depende da classe B para fazer um processo garanta que ao instanciar a classe A seja obrigatório receber a instância da classe B.&lt;/p&gt;

&lt;p&gt;Resumo do Resumo&lt;/p&gt;

&lt;p&gt;Entendermos que apesar da herança ser uma abordagem muito famosa é também muito perigosa para o design de software.&lt;br&gt;
O tópico do livro se concentra muito mais em falar do problemas da herança do que de fato da composição de objetos.&lt;br&gt;
É aconselhado que dê preferência para composição de objetos em seus projetos Java.&lt;/p&gt;

</description>
      <category>developer</category>
      <category>productivity</category>
      <category>softwaredevelopment</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Java Efetivo Essencial - Imutabilidade</title>
      <dc:creator>Paula Santana</dc:creator>
      <pubDate>Thu, 13 Oct 2022 14:36:00 +0000</pubDate>
      <link>https://dev.to/psanrosa13/java-efetivo-essencial-imutabilidade-39hc</link>
      <guid>https://dev.to/psanrosa13/java-efetivo-essencial-imutabilidade-39hc</guid>
      <description>&lt;h2&gt;
  
  
  Reduza a mutabilidade das classes ao minimo
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Esta é uma série baseada no entendimento de tópicos relacionados ao livro com foco no resumo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Imutabilidade&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Uma classe que não permite que suas instâncias sejam modificadas é considerada uma classe imutável. Ou seja, cada informação contida em um objeto durante seu ciclo de vida não é modificado.&lt;br&gt;
Existe uma facilidade em projetar, implementar e utilizar classes IMUTÁVEIS, além de promover uma maior segurança e evitar muitos erros decorrente da alterações de objetos durante seu ciclo de vida.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Receita para classe Imutável&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1 - Não forneça métodos que modifiquem o estado do objeto(mais conhecido como setters);&lt;br&gt;
2 - Garanta que a classe não possa ser extendida(quando tornamos a classe final);&lt;br&gt;
3 - Faça com que os campos/atributos sejam finais e privados;&lt;br&gt;
4 - Não deixe que campos/atributos mutáveis sejam acessados por suas referências; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Na prática&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd18p9chjkyj715c0jvsj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd18p9chjkyj715c0jvsj.png" alt="Image description" width="571" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9pcr2jhw7a859zby2b5o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9pcr2jhw7a859zby2b5o.png" alt="Image description" width="598" height="583"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como Resolver&lt;/strong&gt;&lt;br&gt;
No caso anterior podemos realizar cópias defensivas, para gerarmos uma nova referência e não expor a referência que esta no objeto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Servico&lt;/span&gt; &lt;span class="nf"&gt;getServico&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Servico&lt;/span&gt; &lt;span class="n"&gt;servicoRetorno&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Servico&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;BeanUtils&lt;/span&gt;
           &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;copyProperties&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;servicoRetorno&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;servico&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Mais sobre&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Os objetos imutáveis são thread-safe, não exigem sincronização, o que é muito posivito em cenários de paralelismo, ou seja, quando várias threads acessam o mesmo objeto simultâneamente.&lt;br&gt;
É interessante também que essas classes podem implementar o método static factory e reutilizar instâncias existentes da mesma classe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vantagens&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Os objetos imutáveis são ótimos para construir novos objetos. Pois garantimos que esse objeto não mudará.&lt;br&gt;
Os objetos imutáveis fornecem atomicidade de falha de graça,pois o estado nunca muda, o que evita inconsistências geradas por mudanças no estado do objeto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desvantagens&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Porém uma desvantagem é que muitas vezes quando precisamos fazer modificações do objeto, por ser imutável precisamos gerar cópia dele e por isso em cenários onde temos que realizar multiplas vezes alterações precisaremos gerar muitas cópias e isso dependendo do volume de objetos ser um ponto de atenção em relação a performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Finalizando&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nem sempre conseguimos garantir que a classe seja 100% imutável, mas restringirmos a mutabilidade pode ser uma boa abordagem.&lt;br&gt;
Evite a criação de setters a menos que haja necessidade.&lt;br&gt;
Em classes imutáveis precisamos garantir que os construtores recebam todas as informações para construir o objeto.&lt;/p&gt;

</description>
      <category>java</category>
      <category>programming</category>
    </item>
    <item>
      <title>Java Efetivo Essencial - Acessibilidade de Classes e Membros</title>
      <dc:creator>Paula Santana</dc:creator>
      <pubDate>Mon, 03 Oct 2022 21:29:59 +0000</pubDate>
      <link>https://dev.to/psanrosa13/java-efetivo-essencial-acessibilidade-de-classes-e-membros-33pi</link>
      <guid>https://dev.to/psanrosa13/java-efetivo-essencial-acessibilidade-de-classes-e-membros-33pi</guid>
      <description>&lt;h2&gt;
  
  
  Reduza ao mínimo a acessibilidade das classes e de seus membros
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Esta é uma série baseada no entendimento de tópicos relacionados ao livro com foco no resumo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Introdução&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O livro cita que para identificarmos o quanto um componente é bem projetado em Java, precisamos analisar o quanto esse componente esconde seus dados internos e detalhes de implementação de outros componentes.&lt;br&gt;
Isso porque quando pensamos no contexto de projetos Java, o ideal é termos componentes que ocultam os detalhes de implementação, fornecendo apenas sua API, um conceito de design de software mais conhecimento como encapsulamento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Porque&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Uma das vantagens que obtemos é o desacoplamento, ou seja, isso permite que os componentes sejam evoluidos, testados, otimizados, usados, etc de maneira isolada, não gerando impacto um no outro. Além de que componentes fracamente acoplados permitem que sejam utilizados em outros contextos. &lt;br&gt;
Por fim acaba sendo um caminho com baixo risco na construção de sistemas grandes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Java possui controladores de acesso que permite controlarmos o acesso a classes, interfaces e membros.&lt;br&gt;
Conhecemos como private, protected e public. E através desses modificadores podemos aplicar o encapsulamento, também chamado de ocultação de informação. O princípio básico diz: "faça com que cada classe ou membro seja o mais inacessível possível", ou seja, tentar utilizar o nível de acesso mais restrito.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tipos de Acesso&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para classes e interfaces (não aninhadas) os niveis de acessos são publico e de pacote-privado. &lt;br&gt;
Para membros de classes, como atributos, métodos, classes aninhadas e interfaces aninhadas é possível utilizar 4 níveis de acessos: privado, pacote-privado, protected e public.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Muitas vezes para facilitar os testes acabamos deixando membros das classes mais acessíveis, o que não é errado dependendo até que ponto estamos fazendo isso.&lt;br&gt;
É aceitável transformar pacote-privado em privado de uma classe pública, mas inaceitável expor uma classe, interface ou membro  em uma API para facilitar o teste. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Campos / Atributos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O livro enfatiza como atributos / campos de classes pública devem ser raramente públicos, pois quando o deixamos público estamos abrindo mão de limitar os valores que podem ser armazenados nele, isso pode ser um problema que elevaria a inconsistência de dados e de comportamento na execução do código.&lt;br&gt;
O mesmo se aplica para campos final mutáveis que por si só já não são thread safe.&lt;br&gt;
Isso acaba gerando falhas de segurança, especialmente porque apesar da referência do objeto não mudar o valor que contém nele pode. E devemos ter em mente que termos o getter ainda é uma forma que pode permitir alteração desse objeto através da referência.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resumo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Esse tópico é mais simples, mas ainda muito infringido nos dias atuais, por isso um tema de extrema importância.&lt;br&gt;
Quando projetar uma API e decidir o que será exposto através dela, você deve impedir que outro membros se tornem parte da implementação dela.&lt;br&gt;
Uma classe pública deve evitar ao máximo expor seus membros e ter campos públicos, exceto constantes.&lt;br&gt;
Garanta que objetos referenciados sejam imutáveis para evitar problemas futuros.&lt;/p&gt;

</description>
      <category>java</category>
      <category>programming</category>
    </item>
    <item>
      <title>Java Efetivo Essencial - Comparable</title>
      <dc:creator>Paula Santana</dc:creator>
      <pubDate>Sun, 18 Sep 2022 19:47:16 +0000</pubDate>
      <link>https://dev.to/psanrosa13/java-efetivo-essencial-comparable-463</link>
      <guid>https://dev.to/psanrosa13/java-efetivo-essencial-comparable-463</guid>
      <description>&lt;h2&gt;
  
  
  Pense na possibilidade de implementar o Comparable
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Esta é uma série baseada no entendimento de tópicos relacionados ao livro com foco no resumo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que é&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No Java quando desejamos fazer comparações entre classes de valor, fazemos com que essas classes implementem a interface Comparable ou Comparator.&lt;br&gt;
Neste post vamos analisar mais sobre a interface Comparable que é abordada no livro Java Efetivo e que possui apenas um único método, o compareTo().&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comparable&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quando uma classe implementa essa Interface esta assumindo que há ordenação natural entre objetos da classe. &lt;br&gt;
Além disso você permite que sua classe funcione com todos os algoritmos genéricos e com as implementações de coleções que dependem dessa interface como a TreeSet e TreeMap.&lt;br&gt;
Se olharmos para as classes já existentes da plataforma Java, todas acabam implementando essa interface, além de que os Enums também por default implementam essa interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como?&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fad7xcg1mfwivr6whe5bc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fad7xcg1mfwivr6whe5bc.png" alt="Image description" width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1-&amp;gt; Implementamos a interface Comparable&lt;br&gt;
2-&amp;gt; Implementamos o Método compareTo()&lt;br&gt;
3-&amp;gt; No método estou comparando o atributo nome que é uma String que já implementa também o método compareTo().&lt;br&gt;
É importante termos em mente que para implementarmos esse método precisamos seguir um contrato geral.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comparações&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O contrato geral segue os seguintes itens:&lt;br&gt;
1- Temos que garantir que na comparação onde temos dois objetos de comparação que se A&lt;b&gt;A e se B&amp;gt;A, então A
2- Temos que garantir que se B&amp;gt;A e A&amp;gt;C então B&amp;gt;C&lt;br&gt;
3- Se possível garantir que o resultado de comparação no compareTo seja semelhante o do equals.&lt;br&gt;
4- Se o tipo comparado não for igual deve retornar ClassCastException&lt;br&gt;
5- Se o tipo for nulo deve retornar NullPointerException.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Não é recomendado mais utilização de comparadores de valor &amp;lt; e &amp;gt; , existem métodos fluídos na implementação de Comparators após a versão 8 do Java.&lt;br&gt;
Se um campo do objeto não implementar Comparable será necessário criar um Comparator desse tipo.&lt;br&gt;
Se você deseja comparar múltiplos valores, a ordem a qual é comparada importa, sendo necessário sempre começarmos com os campos mais significativos.Sendo que se a comparação resultar em algo diferente de zero já pode retornar, se não continue comparando os próximos campos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fncw8tjij8eur51lsrggf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fncw8tjij8eur51lsrggf.png" alt="Image description" width="800" height="641"&gt;&lt;/a&gt;&lt;br&gt;
Acima vemos a aplicação da regra sobre comparação de múltiplos campos.&lt;/p&gt;

&lt;p&gt;Em alguns casos podemos utilizar a criação de Comparators, no exemplo acima utilizamos como uma constante estática, utilizando os recursos que foram adicionados no Java 8, facilitamos muito o uso de comparações que envolvem múltiplos campos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F44uz4r2nqonigbh4c3fn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F44uz4r2nqonigbh4c3fn.png" alt="Image description" width="800" height="641"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resumindo&lt;/strong&gt;&lt;br&gt;
O livro aborda que quando é implementada uma classe de valor que exista uma ordenação para as instâncias que sejam implementadas a interface Comparable.&lt;br&gt;
Procure usar sempre os métodos estáticos compare() que existem nos tipos primitivos empacotados ou use comparadores através da interface Comparator.&lt;/p&gt;

</description>
      <category>java</category>
      <category>backend</category>
      <category>programming</category>
    </item>
    <item>
      <title>Java Efetivo Essencial - clone()</title>
      <dc:creator>Paula Santana</dc:creator>
      <pubDate>Sun, 04 Sep 2022 17:26:02 +0000</pubDate>
      <link>https://dev.to/psanrosa13/java-efetivo-essencial-clone-44jp</link>
      <guid>https://dev.to/psanrosa13/java-efetivo-essencial-clone-44jp</guid>
      <description>&lt;h2&gt;
  
  
  Sobrescreva o clone de modo sensato
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Esta é uma série baseada no entendimento de tópicos relacionados ao livro com foco no resumo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Porquê?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Talvez você se questione porque você deveria entender  sobre clonar objetos ou sobre como implementar o método clone nas classes. O fato é que muitas vezes precisaremos durante nosso código gerar objetos com mesmo conteúdo porém em uma outra instância na memória e muitas vezes esses objetos não são simples de serem instanciados, e aí onde o clone pode ser muito útil.&lt;br&gt;
Dado isso vamos entender como implementamos o clone nos nossos objetos no Java.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloneable&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Primeiro vamos entender a interface Cloneable que NÃO TEM nenhum método, isso porque ela é apenas utilizada para indicar que uma classe que implementa ela deve ter todos os atributos copiados para um novo objeto. Mas como isso ocorre?&lt;br&gt;
Envolve o método clone() da classe Object que é herdado em todas as classes no Java, ou seja, além da classe herdar o método ao implementar essa interface ela garante que o comportamento desse método será modificado para cópia de cada atributo.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4a4ppdwja7hm8i2nnt1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4a4ppdwja7hm8i2nnt1.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para ser possível clonar a classe precisamos que ela implemente a interface Cloneable e que seja sobrescrito o método clone chamando o método através do super. Um ponto que deve ser levado em consieração é se uma superclasse já sobrescreveu esse método, pois neste caso não há necessidade de implementação, pois o clone funcionará normalmente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atenção!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Um dos conselhos que o livro trás é que mesmo o método originalmente retornar um Object, podemos modificar nossa sobrescrita do método pois por nosso tipo ser filho de Object  será possível devido aos retornos covariantes do Java. Ou seja, garantimos de já retornarmos o tipo correto ao invés de deixarmos o cast para os clientes do método. Outro conselho é sobre tratar a exception com o try/catch porque a exceção do método clone é verificada, porém é quase impossível lançar a exceção e acaba obrigando os clientes a tratá-la.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3u9wmkw9ir07hd438sig.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3u9wmkw9ir07hd438sig.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Outro ponto que é necessário manter atenção, é sobre os tipos que são copiados, nesse caso o ideal é que seja feita a cópia do objeto através do método clone pois se não realizarmos isso estaremos apenas copiando a referência o que pode gerar inconsistências pois se a classe for mutável podemos realizar operações que impactariam o objeto origem. O mesmo deve ser realizado com coleções que estejam no objeto origem ou em sua estrutura. Como no exemplo acima, faço a cópia do campo serviço usando o clone dessa classe que de fato me retornará uma nova instância de Servico.&lt;br&gt;
Quando falamos de cópias de objetos falamos de cópia simples ou profunda, a segunda esta ligada ao caso citado acima que envolve outros objetos na arvore de dependência.&lt;br&gt;
Ainda nesse mesmo exemplo, se o atributo serviço fosse final, não seria possível realizar a operação de atribuição chamando o clone da classe Servico. Com isso podemos chegar a conclusão de que a estrutura de clone utilizada pela Cloneable não é compatível com situações como esta.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conselhos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O livro aconselha que vale mais a pena fornecermos um método alternativo de cópia do objeto, através da criação de um método de cópia ou um método de fábrica de cópia que recebe como argumento a classe que tem o construtor de cópia, por exemplo:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

&lt;span class="c1"&gt;//construtor&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Usuario&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Usuaario&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;){...};&lt;/span&gt;
&lt;span class="c1"&gt;//método fabrica&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="nf"&gt;newInstance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Usuario&lt;/span&gt; &lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="o"&gt;){...};&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;As vantagens dessa abordagem são muitas, dentre elas: menor risco, não tem conflito com campos finais, não lança exceções verificadas, não precisa de cast, permite trabalhar com interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use com cuidado...&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O livro pede para evitarmos o uso da Cloneable e usarmos outras abordagens, mesmo considerando que em classes do tipo final o risco é menor. No geral não deveríamos trabalhar com cópia usando Cloneable, apenas para exceções como para cópia de arrays que são copiados de forma melhor com essa abordagem.&lt;br&gt;
Cópias de objetos faz sentido para classes de dominío ou que representam objetos de transação e guardem estado.&lt;br&gt;
E podemos implementar o método de cópia utilizando bibliotecas específicas para isso e não precisamos implementar a interface Cloneable nesse cenário.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bibliotecas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No nosso dia a dia podemos trabalhar com objetos complexos que muitas vezes tem uma árvore de dependência de classes bem complicadas e daí não convém reinventarmos a roda e por isso blibliotecas como Apache Commons Lang, kostaskougios, fluidity-cloning são ótimas para utilizarmos para cópias de objetos e  termos a garantia que elas realizam cópias profundas sem problemas.&lt;/p&gt;

</description>
      <category>java</category>
      <category>programming</category>
    </item>
    <item>
      <title>Java Efetivo Essencial - toString()</title>
      <dc:creator>Paula Santana</dc:creator>
      <pubDate>Mon, 29 Aug 2022 22:19:43 +0000</pubDate>
      <link>https://dev.to/psanrosa13/java-efetivo-essencial-tostring-1h75</link>
      <guid>https://dev.to/psanrosa13/java-efetivo-essencial-tostring-1h75</guid>
      <description>&lt;h2&gt;
  
  
  Sobrescreva sempre o toString
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Esta é uma série baseada no entendimento de tópicos relacionados ao livro com foco no resumo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contextualizando&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O método toString é um dos métodos que são herdados da classe Objetc.&lt;br&gt;
A implementação desse método na classe Object é a seguinte :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;getClass&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"@"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toHexString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hashCode&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Que é o nome da classe seguido de @ e do valor hexadecimal sem sinal do hashcode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O porquê&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Porque temos que nos preocupar? Pense bem, se formos utilizar a implementação padrão que imprime o objeto algo como :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;br.com.conta.Usuario@c712a7ee
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O quanto visualizar esse trecho em seu log pode ajudar a realizar debug do seu código de maneira eficiente?&lt;br&gt;
Seria bem melhor visualizar os dados que identifiquem de fato o objeto, certo?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Override&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Usuario{"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
            &lt;span class="s"&gt;"nome='"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sc"&gt;'\''&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
            &lt;span class="s"&gt;", email='"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sc"&gt;'\''&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
            &lt;span class="s"&gt;", nascimento="&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;nascimento&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
            &lt;span class="sc"&gt;'}'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Acima sobrescrevemos o toString da classe Usuario por isso ela esta com a anotação &lt;a class="mentioned-user" href="https://dev.to/override"&gt;@override&lt;/a&gt;. &lt;br&gt;
Veja como esta muito mais legível e se logar o objeto iremos receber os dados no seguinte formato:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Usuario{nome='Ana dos Santos', email='anasantos10@gmail.com', nascimento=1977-08-15}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Hum...&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pode surgir uma dúvida que muitos devs acabam tendo referente a LGPD, pois dependendo do dado que o objeto guarda estado é perigoso registrarmos em logs, para isso é importante que você configure em sua dependência de logs  mascaramento de alguns dados de logs, em alguns casos vale apena também verificar se faz sentido ter o dado no toString.&lt;/li&gt;
&lt;li&gt;Não coloque valores que não são acessíveis da classe pois isso não auxiliaria no debug do objeto e faria com que uma informação restrita da classe fique visível.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;O lado bom&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A maioria das Ides permite que seja sobrescrito o toString de forma mais automática, por exemplo no Intellij temos a opção através do menu direito do mouse &amp;gt; generate &amp;gt; toString e aparece a tela para selecionarmos quais informações são necessárias para gerar o toString.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nem sempre faz sentido...&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nem sempre os objetos de seu sistema terão objetivo de guardar estado como por exemplo um controller ou um service, neste caso não faz sentido sobrescrever o toString. Geralmente isso só faz sentido para classes de dominío ou que representam objetos de transação e guardem estado.&lt;br&gt;
Outro ponto que deve ser levado em condieração é se uma superclasse já sobrescreveu esse método.&lt;/p&gt;

</description>
      <category>java</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Java Efetivo Essencial - HashCode()</title>
      <dc:creator>Paula Santana</dc:creator>
      <pubDate>Thu, 18 Aug 2022 14:08:00 +0000</pubDate>
      <link>https://dev.to/psanrosa13/java-efetivo-hashcode-2iop</link>
      <guid>https://dev.to/psanrosa13/java-efetivo-hashcode-2iop</guid>
      <description>&lt;h2&gt;
  
  
  Sobrescreva sempre o método Hashcode ao sobrescrever o método equals
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Esta é uma série baseada no entendimento de tópicos relacionados ao livro com foco no resumo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Entendendo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Assim como o método Equals(), o método Hashcode() também é herdado da classe Object.&lt;br&gt;
Esse método é utilizado especialmente em estrutura de dados do Java, como na api de Collections e Map.&lt;br&gt;
Em caso de você sobrescrever o Equals() e não sobrescrever o Hashcode() estará violando o contrato geral do método Hashcode() e implicará no mal funcionamento dessas estruturas de dados no Java.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contrato Geral&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Existem algumas regras que devem ser respitadas pelo método Hashcode():&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sempre que um método hashcode for executado repetidas vezes para o mesmo objeto deve sempre retornar o mesmo valor desde que nenhum dos dados usados no equals seja modificado;&lt;/li&gt;
&lt;li&gt;Se dois objetos forem iguais através do método equals então o método hashcode desses objetos deve retornar o mesmo valor;&lt;/li&gt;
&lt;li&gt;Se dois objetos não forem iguais no método equals(), não é necessário que o resultado do hashcode() seja diferente dos dois, porém é importante o programador entender que resultados diferentes melhora o desempenho de tabelas hash utilizadas nas estrutura de dados do Java;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Como deveria ser?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Não é preciso incluir campos do objeto não utilizado no método Equals().&lt;br&gt;
Utilizar a mesma ordem dos campos possibilita uma função hash melhor.&lt;br&gt;
Se calcularmos o Hash na mão o recomendado pelo livro é utilizar um número primo, como no exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Override&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;hashCode&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hashCode&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hashCode&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;nascimento&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hashCode&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Existem bibliotecas que realizam o calculo do hash de maneira mais segura, o livro recomenda o Guava do Google e também a da própria classe Objects do Java.&lt;br&gt;
Ele traz apenas um alerta sobre o método da classe Objects em termos de performance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Override&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;hashCode&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nascimento&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se trabalha com classes Imutáveis uma abordagem seria o armazenamento do hashcode em cache para não ficar recalculando toda vez que o método for utilizado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Concluindo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O livro ressalta a importância de utilizarmos todos os campos que são significativos para identificar o objeto, ou seja, mesmo que sejam muitos devemos manter eles  e garantir que estes sejam presentes.&lt;/p&gt;

&lt;p&gt;Entenda que sempre que sobrescrever um método será necessário sobrescrever o outro para que seu programa funcione corretamente.&lt;br&gt;
Obdeça na sobrescrita as regras que esse método deve atender.&lt;/p&gt;

&lt;p&gt;Algumas IDEs facilitam isso para o desenvolvedor como é o caso do Intellij que já possui uma opção em conjunto de sobrescrita dos dois itens.&lt;/p&gt;

</description>
      <category>java</category>
      <category>backend</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
