<?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: Emanoel Carvalho</title>
    <description>The latest articles on DEV Community by Emanoel Carvalho (@emanoelcarvalho).</description>
    <link>https://dev.to/emanoelcarvalho</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%2F1186390%2Fe6949643-72eb-4f20-9f42-59f7ecbbbd42.jpg</url>
      <title>DEV Community: Emanoel Carvalho</title>
      <link>https://dev.to/emanoelcarvalho</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/emanoelcarvalho"/>
    <language>en</language>
    <item>
      <title>Transações em Banco de Dados - Entendendo o Funcionamento</title>
      <dc:creator>Emanoel Carvalho</dc:creator>
      <pubDate>Sun, 29 Mar 2026 00:28:52 +0000</pubDate>
      <link>https://dev.to/emanoelcarvalho/transacoes-em-banco-de-dados-entendendo-o-funcionamento-56l4</link>
      <guid>https://dev.to/emanoelcarvalho/transacoes-em-banco-de-dados-entendendo-o-funcionamento-56l4</guid>
      <description>&lt;h2&gt;
  
  
  Voltando ao Básico: O que é Atomicidade?
&lt;/h2&gt;

&lt;p&gt;Antes de falar de transaction, precisamos entender o conceito que a sustenta: &lt;strong&gt;atomicidade&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O átomo, na física clássica, era considerado a menor unidade indivisível da matéria. Na computação, pegamos emprestado esse conceito para dizer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Esse conjunto de operações é indivisível, acontece tudo, ou não acontece nada."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;É exatamente isso que uma &lt;code&gt;transaction&lt;/code&gt; garante.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Analogia do PIX
&lt;/h2&gt;

&lt;p&gt;Imagine que você vai fazer um PIX de R$100 para um amigo. Por baixo dos panos, o banco precisa executar &lt;strong&gt;duas operações&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Debitar R$100 da sua conta
2. Creditar R$100 na conta do seu amigo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora imagine que a operação &lt;strong&gt;1&lt;/strong&gt; acontece, mas o sistema cai antes da operação &lt;strong&gt;2&lt;/strong&gt;. O que acontece?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ Você perdeu R$100&lt;/li&gt;
&lt;li&gt;❌ Seu amigo não recebeu nada&lt;/li&gt;
&lt;li&gt;❌ O dinheiro simplesmente &lt;strong&gt;sumiu&lt;/strong&gt; do sistema&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso é uma &lt;strong&gt;inconsistência&lt;/strong&gt;. E é exatamente o tipo de problema que uma transaction resolve.&lt;/p&gt;

&lt;p&gt;Com uma transaction, o banco de dados entende que essas duas operações são &lt;strong&gt;uma coisa só&lt;/strong&gt;. Se a segunda falhar, a primeira é desfeita automaticamente, como se nunca tivesse acontecido, claro, isso não resolve outros problemas como disponibilidade e escalabilidade, mas aqui estou tentando explicar o funcionamento de um conceito, em um sistema real, as coisas são sempre mais complexas.&lt;/p&gt;




&lt;h2&gt;
  
  
  O Ciclo de Vida de uma Transaction
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INÍCIO DA TRANSACTION
        │
        ▼
  [Operação 1] ──── falhou? ──→ ROLLBACK (desfaz tudo)
        │
        ▼
  [Operação 2] ──── falhou? ──→ ROLLBACK (desfaz tudo)
        │
        ▼
  [Operação N] ──── falhou? ──→ ROLLBACK (desfaz tudo)
        │
        ▼
  Tudo certo?
        │
        ▼
     COMMIT ✅ (persiste tudo)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Só existe &lt;strong&gt;um&lt;/strong&gt; de dois desfechos possíveis: &lt;strong&gt;commit&lt;/strong&gt; ou &lt;strong&gt;rollback&lt;/strong&gt;. Nunca um estado no meio.&lt;/p&gt;




&lt;h2&gt;
  
  
  As 4 Propriedades ACID
&lt;/h2&gt;

&lt;p&gt;Transactions seguem um conjunto de propriedades chamado &lt;strong&gt;ACID&lt;/strong&gt;. Entender cada uma delas é entender &lt;em&gt;por que&lt;/em&gt; transactions funcionam:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Propriedade&lt;/th&gt;
&lt;th&gt;Nome&lt;/th&gt;
&lt;th&gt;O que garante&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Atomicidade&lt;/td&gt;
&lt;td&gt;Tudo ou nada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;C&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Consistência&lt;/td&gt;
&lt;td&gt;O banco sempre vai de um estado válido para outro estado válido&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;I&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Isolamento&lt;/td&gt;
&lt;td&gt;Transactions paralelas não se interferem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;D&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Durabilidade&lt;/td&gt;
&lt;td&gt;Após o commit, os dados sobrevivem a falhas&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Quando um banco de dados diz que é &lt;strong&gt;ACID-compliant&lt;/strong&gt;, ele está dizendo que respeita todas essas propriedades. PostgreSQL, MySQL e SQL Server são exemplos clássicos.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Isolamento — A Propriedade Mais Traiçoeira
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;Isolamento&lt;/strong&gt; merece atenção especial, porque é onde a maioria dos bugs sutis aparecem.&lt;/p&gt;

&lt;p&gt;Imagine dois usuários comprando o &lt;strong&gt;último item&lt;/strong&gt; do estoque ao mesmo tempo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Transaction A                    Transaction B
─────────────────────────────────────────────────
Lê estoque: 1 unidade
                                 Lê estoque: 1 unidade
Decrementa: 0 unidades
                                 Decrementa: 0 unidades ← PROBLEMA
Commit ✅
                                 Commit ✅ ← vendeu algo que não existe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso se chama &lt;strong&gt;Race Condition&lt;/strong&gt;, e é um dos problemas que o nível de isolamento da transaction controla. Bancos de dados oferecem diferentes níveis:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nível&lt;/th&gt;
&lt;th&gt;Proteção&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;READ UNCOMMITTED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nenhuma — lê dados ainda não commitados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;READ COMMITTED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Lê apenas dados já commitados&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;REPEATABLE READ&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Garante que releituras retornam o mesmo valor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SERIALIZABLE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Máxima proteção — transactions executam como se fossem sequenciais&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Na Prática: E-commerce com Sequelize
&lt;/h2&gt;

&lt;p&gt;Agora que o conceito está claro, veja como isso se traduz em código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;sequelize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Pedido&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Estoque&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Sale&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./models&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;finalizarCompra&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;usuarioId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;produtoId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;quantidade&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// 1. Abre a transaction — a partir daqui, tudo é atômico&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;sequelize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// 2. Lê o estoque dentro da transaction&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;produto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Estoque&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findOne&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;where&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;produtoId&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// ← vincula essa query à transaction&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;produto&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;produto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;quantidade&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;quantidade&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Estoque insuficiente&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// 3. Decrementa o estoque&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;produto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;quantidade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;produto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;quantidade&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;quantidade&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// 4. Cria o pedido&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pedido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Pedido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;usuarioId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;produtoId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;quantidade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;confirmado&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// 5. Registra a venda&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Sale&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;pedidoId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;produto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;preco&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;quantidade&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// 6. Tudo certo — persiste as alterações&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// 7. Algo falhou — desfaz TUDO&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rollback&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;O que acontece se &lt;code&gt;Sale.create&lt;/code&gt; falhar?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O estoque volta ao valor original ✅&lt;/li&gt;
&lt;li&gt;O pedido é removido ✅&lt;/li&gt;
&lt;li&gt;Nenhuma inconsistência no banco ✅&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  O Erro Clássico: O Hook Invisível
&lt;/h2&gt;

&lt;p&gt;Aqui está o cenário que quebra sistemas de desenvolvedores experientes. Você escreve uma transaction perfeita, testa, e o sistema entra em &lt;strong&gt;deadlock&lt;/strong&gt;. Você olha para todo o código e não acha o problema.&lt;/p&gt;

&lt;p&gt;O culpado? Um &lt;strong&gt;hook no model&lt;/strong&gt; que ninguém lembrou de vincular à transaction.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ⚠️ Hook disparando FORA da transaction&lt;/span&gt;
&lt;span class="nx"&gt;Pedido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;afterCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;LogAuditoria&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;entidade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Pedido&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;entidadeId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;acao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;criado&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="c1"&gt;// Essa query não sabe que existe uma transaction aberta&lt;/span&gt;
  &lt;span class="c1"&gt;// Ela tenta acessar o registro do pedido, que ainda está "preso"&lt;/span&gt;
  &lt;span class="c1"&gt;// no lock da transaction — e aí o deadlock acontece&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Por que o deadlock acontece?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Transaction principal          Hook (conexão separada)
──────────────────────────────────────────────────────
Cria Pedido (lock no registro)
                               Tenta ler o Pedido ← bloqueado pelo lock
Aguarda o hook terminar ←──── Aguarda a transaction liberar o lock
        │                              │
        └──────── DEADLOCK ────────────┘
                  (espera infinita)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ A Correção
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Pedido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;afterCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;LogAuditoria&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;entidade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Pedido&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;entidadeId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pedido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;acao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;criado&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transaction&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// ← participa da mesma transaction&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora o hook &lt;strong&gt;faz parte&lt;/strong&gt; da transaction. Se houver rollback, o log também é desfeito. Se houver commit, tudo é salvo junto.&lt;/p&gt;




&lt;h2&gt;
  
  
  Resumo Mental
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Pense em uma transaction como uma &lt;strong&gt;caixa de vidro&lt;/strong&gt;. Tudo que acontece dentro dela é visível apenas para ela mesma, até que você decida abrir a caixa (commit) ou jogar tudo fora (rollback). Qualquer coisa que aconteça &lt;strong&gt;fora da caixa&lt;/strong&gt;, enquanto ela ainda está fechada, não enxerga o que está dentro, e é aí que os problemas aparecem.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;No próximo nível: quando um único banco não é suficiente e você precisa de transactions distribuídas entre microsserviços, aí entram patterns como &lt;strong&gt;Saga&lt;/strong&gt; e &lt;strong&gt;Outbox&lt;/strong&gt;. Mas isso é história para outro artigo.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>sequelize</category>
      <category>backend</category>
      <category>bancodedados</category>
      <category>performance</category>
    </item>
    <item>
      <title>GitHub Stats Quebrados? Resolva de Vez com GitHub Actions!</title>
      <dc:creator>Emanoel Carvalho</dc:creator>
      <pubDate>Tue, 17 Feb 2026 19:25:08 +0000</pubDate>
      <link>https://dev.to/emanoelcarvalho/github-stats-quebrados-resolva-de-vez-com-github-actions-2c49</link>
      <guid>https://dev.to/emanoelcarvalho/github-stats-quebrados-resolva-de-vez-com-github-actions-2c49</guid>
      <description>&lt;p&gt;Se você chegou até aqui, provavelmente já se deparou com aquele frustrante ícone de imagem quebrada no seu perfil do GitHub onde deveria estar aparecendo suas estatísticas lindamente renderizadas. Eu sei, é irritante!&lt;/p&gt;

&lt;p&gt;Mas calma, tenho uma boa notícia: existe uma solução &lt;strong&gt;permanente&lt;/strong&gt;, &lt;strong&gt;gratuita&lt;/strong&gt; e &lt;strong&gt;muito mais poderosa&lt;/strong&gt; do que simplesmente esperar o serviço voltar. Neste artigo, vou te mostrar como implementar um sistema automatizado que gera suas métricas do GitHub usando &lt;strong&gt;GitHub Actions&lt;/strong&gt;, garantindo que seu perfil esteja sempre atualizado e funcionando perfeitamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  📉 O Problema: Por Que o GitHub Readme Stats Caiu?
&lt;/h2&gt;

&lt;p&gt;Antes de partirmos para a solução, é importante entender o que realmente aconteceu com o &lt;code&gt;github-readme-stats&lt;/code&gt;, aquele serviço querido que todos usávamos.&lt;/p&gt;

&lt;h3&gt;
  
  
  A História Por Trás do Erro 503
&lt;/h3&gt;

&lt;p&gt;O &lt;a href="https://github.com/anuraghazra/github-readme-stats" rel="noopener noreferrer"&gt;GitHub Readme Stats&lt;/a&gt; é um projeto open-source extremamente popular que gerava cards dinâmicos de estatísticas do GitHub. Durante muito tempo, ele funcionou perfeitamente hospedado na Vercel com um plano enterprise gratuito fornecido como patrocínio para projetos open-source.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mas o que deu errado?&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Em abril de 2024, a Vercel descontinuou esse patrocínio. O projeto foi rebaixado para o plano "Hobby" gratuito, que possui limites de uso bem mais restritos. Com milhões de desenvolvedores usando o serviço público, esses limites são ultrapassados rapidamente, resultando no temido erro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;503 SERVICE_UNAVAILABLE
DEPLOYMENT_PAUSED
"This Deployment is paused by the owner."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Por Que Isso Não Vai Se Resolver Sozinho?
&lt;/h3&gt;

&lt;p&gt;Muita gente pensa que é apenas uma "queda temporária", mas a verdade é mais complexa:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Limites de recursos&lt;/strong&gt;: O plano gratuito da Vercel não suporta o tráfego massivo gerado pelo uso global&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custos insustentáveis&lt;/strong&gt;: Manter o serviço funcionando exigiria que o mantenedor arcasse com custos significativos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Problema estrutural&lt;/strong&gt;: Não é um bug, mas sim uma incompatibilidade entre demanda e recursos disponíveis&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  O Impacto na Comunidade
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Milhares de perfis do GitHub exibindo imagens quebradas&lt;/li&gt;
&lt;li&gt;Perda da funcionalidade de &lt;em&gt;showcasing&lt;/em&gt; de habilidades&lt;/li&gt;
&lt;li&gt;Frustração generalizada entre desenvolvedores&lt;/li&gt;
&lt;li&gt;Dezenas de issues duplicadas reportando o mesmo problema&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A Solução Proposta: GitHub Actions + lowlighter/metrics
&lt;/h2&gt;

&lt;p&gt;Depois de analisar as alternativas disponíveis, a solução mais robusta e confiável é migrar para o &lt;strong&gt;lowlighter/metrics&lt;/strong&gt; executando via &lt;strong&gt;GitHub Actions&lt;/strong&gt;. Vamos entender por quê.&lt;/p&gt;

&lt;h3&gt;
  
  
  Por Que Esta Solução é Superior?
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. &lt;strong&gt;Totalmente Gratuita e Independente&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Roda na infraestrutura do próprio GitHub&lt;/li&gt;
&lt;li&gt;Sem depender de serviços externos que podem cair&lt;/li&gt;
&lt;li&gt;Zero custos de hospedagem&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. &lt;strong&gt;Extremamente Personalizável&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Mais de &lt;strong&gt;40 plugins&lt;/strong&gt; disponíveis&lt;/li&gt;
&lt;li&gt;Mais de &lt;strong&gt;300 opções&lt;/strong&gt; de configuração&lt;/li&gt;
&lt;li&gt;Templates variados: classic, terminal, markdown, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. &lt;strong&gt;Mais Poderosa&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Enquanto o GitHub Readme Stats oferece apenas cards básicos, o lowlighter/metrics fornece:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Análise de linguagens com detalhes avançados&lt;/li&gt;
&lt;li&gt;Gráficos de linhas de código&lt;/li&gt;
&lt;li&gt;Calendários isométricos de commits&lt;/li&gt;
&lt;li&gt;Análise de hábitos de codificação&lt;/li&gt;
&lt;li&gt;Integração com WakaTime, LeetCode e outras plataformas&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  4. &lt;strong&gt;Confiável e Estável&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Execução controlada por você&lt;/li&gt;
&lt;li&gt;Sem rate limits externos&lt;/li&gt;
&lt;li&gt;SVG gerado e commitado no seu repositório&lt;/li&gt;
&lt;li&gt;Sempre disponível, mesmo offline&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🛠️ Tutorial Passo a Passo Completo
&lt;/h2&gt;

&lt;p&gt;Agora vamos colocar a mão na massa! Siga este guia detalhado para implementar suas métricas automatizadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pré-requisitos
&lt;/h3&gt;

&lt;p&gt;Antes de começar, certifique-se de que você tem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Uma conta no GitHub (Sim, eu sei, pode parecer besta essa confirmação rsrs)&lt;/li&gt;
&lt;li&gt;✅ Um repositório para seu perfil (geralmente &lt;code&gt;seu-usuario/seu-usuario&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;✅ Conhecimento básico de Git e GitHub&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Passo 1: Criar o Personal Access Token (PAT)
&lt;/h3&gt;

&lt;p&gt;O token é necessário para que o GitHub Actions possa acessar seus dados de forma segura.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Acesse as configurações de desenvolvedor:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vá para &lt;a href="https://github.com/settings/tokens" rel="noopener noreferrer"&gt;github.com/settings/tokens&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Ou navegue: &lt;code&gt;Settings&lt;/code&gt; → &lt;code&gt;Developer settings&lt;/code&gt; → &lt;code&gt;Personal access tokens&lt;/code&gt; → &lt;code&gt;Tokens (classic)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gere um novo token:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clique em &lt;strong&gt;"Generate new token"&lt;/strong&gt; → &lt;strong&gt;"Generate new token (classic)"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Dê um nome descritivo, como &lt;code&gt;METRICS_TOKEN&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Configure os escopos necessários:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para funcionalidades básicas, selecione:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;code&gt;public_repo&lt;/code&gt; - para acessar repositórios públicos&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;read:user&lt;/code&gt; - para dados do usuário&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se você quiser métricas mais avançadas, adicione:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;code&gt;read:org&lt;/code&gt; - para métricas de organizações (se aplicável)&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;repo&lt;/code&gt; - para incluir repositórios privados&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Gere e copie o token:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Clique em &lt;strong&gt;"Generate token"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IMPORTANTE&lt;/strong&gt;: Copie o token AGORA! Você não poderá vê-lo novamente&lt;/li&gt;
&lt;li&gt;O formato será algo como: &lt;code&gt;ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Passo 2: Adicionar o Token como Secret no Repositório
&lt;/h3&gt;

&lt;p&gt;Agora vamos armazenar o token de forma segura no seu repositório.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Navegue até o repositório do seu perfil:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Geralmente é &lt;code&gt;https://github.com/seu-usuario/seu-usuario&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Acesse as configurações de Secrets:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clique em &lt;strong&gt;"Settings"&lt;/strong&gt; (No menu superior)&lt;/li&gt;
&lt;li&gt;No menu lateral: &lt;strong&gt;"Secrets and variables"&lt;/strong&gt; → &lt;strong&gt;"Actions"&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Crie um novo secret:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clique em &lt;strong&gt;"New repository secret"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt;: &lt;code&gt;METRICS_TOKEN&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value&lt;/strong&gt;: Cole o token que você copiou no Passo 1&lt;/li&gt;
&lt;li&gt;Clique em &lt;strong&gt;"Add secret"&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pronto! Seu token está seguro e pronto para ser usado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 3: Criar o Arquivo de Workflow
&lt;/h3&gt;

&lt;p&gt;Agora vamos criar a automação que vai gerar suas métricas.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;No seu repositório, crie a estrutura de pastas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Crie a pasta &lt;code&gt;.github/workflows/&lt;/code&gt; na raiz do repositório&lt;/li&gt;
&lt;li&gt;Se estiver usando a interface web, você pode fazer isso ao criar o arquivo&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Crie o arquivo &lt;code&gt;metrics.yml&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caminho completo: &lt;code&gt;.github/workflows/metrics.yml&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adicione o seguinte conteúdo:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;GitHub Metrics&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# Permite execução manual do workflow&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

  &lt;span class="c1"&gt;# Executa automaticamente todo dia às 6h da manhã (UTC)&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;6&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;metrics&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;lowlighter/metrics@latest&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="c1"&gt;# Token de autenticação (obrigatório)&lt;/span&gt;
          &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.METRICS_TOKEN }}&lt;/span&gt;

          &lt;span class="c1"&gt;# Seu usuário do GitHub&lt;/span&gt;
          &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;seu-usuario-aqui&lt;/span&gt;

          &lt;span class="c1"&gt;# Nome do arquivo que será gerado&lt;/span&gt;
          &lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;assets/metrics.svg&lt;/span&gt;

          &lt;span class="c1"&gt;# Seções base a serem incluídas&lt;/span&gt;
          &lt;span class="na"&gt;base&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;header, activity, community, repositories, metadata&lt;/span&gt;

          &lt;span class="c1"&gt;# Plugin de linguagens de programação&lt;/span&gt;
          &lt;span class="na"&gt;plugin_languages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
          &lt;span class="na"&gt;plugin_languages_sections&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;most-used, recently-used&lt;/span&gt;
          &lt;span class="na"&gt;plugin_languages_details&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bytes-size, percentage&lt;/span&gt;
          &lt;span class="na"&gt;plugin_languages_limit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;

          &lt;span class="c1"&gt;# Plugin de linhas de código&lt;/span&gt;
          &lt;span class="na"&gt;plugin_lines&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;** IMPORTANTE: Substitua &lt;code&gt;seu-usuario-aqui&lt;/code&gt;** pelo seu username do GitHub!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Commit o arquivo:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se estiver na interface web, clique em &lt;strong&gt;"Commit changes"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Se estiver localmente: &lt;code&gt;git add .github/workflows/metrics.yml &amp;amp;&amp;amp; git commit -m "feat: adiciona GitHub Metrics workflow" &amp;amp;&amp;amp; git push&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Passo 4: Entender a Configuração do Workflow
&lt;/h3&gt;

&lt;p&gt;Vamos destrinchar cada parte do workflow para você entender exatamente o que está acontecendo.&lt;/p&gt;

&lt;h4&gt;
  
  
  Trigger Events (Eventos de Disparo)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;6&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;workflow_dispatch&lt;/code&gt;&lt;/strong&gt;: Permite executar o workflow manualmente através da interface do GitHub&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;schedule&lt;/code&gt;&lt;/strong&gt;: Agenda execuções automáticas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;cron: "0 6 * * *"&lt;/code&gt;&lt;/strong&gt;: Sintaxe cron que significa:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;0&lt;/code&gt; = minuto 0&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;6&lt;/code&gt; = hora 6 (UTC)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;* * *&lt;/code&gt; = todos os dias, todos os meses, todos os dias da semana&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dica&lt;/strong&gt;: Para converter para seu fuso horário local, use &lt;a href="https://crontab.guru/" rel="noopener noreferrer"&gt;crontab.guru&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Permissões
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esta linha é &lt;strong&gt;crítica&lt;/strong&gt;! Ela concede ao workflow permissão para fazer commit dos arquivos gerados de volta ao repositório. Sem isso, o workflow falhará.&lt;/p&gt;

&lt;h4&gt;
  
  
  Configurações Básicas
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.METRICS_TOKEN }}&lt;/span&gt;
&lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;seu-usuario-aqui&lt;/span&gt;
&lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;assets/metrics.svg&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;token&lt;/code&gt;&lt;/strong&gt;: Referência ao secret que criamos (nunca exponha o token diretamente!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;user&lt;/code&gt;&lt;/strong&gt;: Seu username do GitHub&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;filename&lt;/code&gt;&lt;/strong&gt;: Onde o SVG será salvo (cria a pasta automaticamente)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Base Sections (Seções Base)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;base&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;header, activity, community, repositories, metadata&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Define quais informações básicas serão exibidas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;header&lt;/strong&gt;: Cabeçalho com seu nome e avatar&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;activity&lt;/strong&gt;: Nível de atividade e contribuições&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;community&lt;/strong&gt;: Pull requests, issues, reviews&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;repositories&lt;/strong&gt;: Estatísticas dos seus repositórios&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;metadata&lt;/strong&gt;: Informações sobre quando foi gerado&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Plugin: Languages (Linguagens)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;plugin_languages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="na"&gt;plugin_languages_sections&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;most-used, recently-used&lt;/span&gt;
&lt;span class="na"&gt;plugin_languages_details&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bytes-size, percentage&lt;/span&gt;
&lt;span class="na"&gt;plugin_languages_limit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;most-used&lt;/code&gt;&lt;/strong&gt;: Mostra suas linguagens mais utilizadas historicamente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;recently-used&lt;/code&gt;&lt;/strong&gt;: Linguagens usadas recentemente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;bytes-size, percentage&lt;/code&gt;&lt;/strong&gt;: Exibe o tamanho em bytes e percentual&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;limit: 8&lt;/code&gt;&lt;/strong&gt;: Mostra no máximo 8 linguagens&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Plugin: Lines (Linhas de Código)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;plugin_lines&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gera estatísticas sobre linhas de código adicionadas e removidas. Simples e direto!&lt;/p&gt;

&lt;h3&gt;
  
  
  Passo 5: Executar e Testar
&lt;/h3&gt;

&lt;p&gt;Agora vamos rodar o workflow pela primeira vez!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Navegue até a aba Actions do seu repositório:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URL: &lt;code&gt;https://github.com/seu-usuario/seu-usuario/actions&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Encontre o workflow "GitHub Metrics":&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ele deve aparecer na lista de workflows disponíveis&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Execute manualmente:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clique no workflow &lt;strong&gt;"GitHub Metrics"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Clique no botão &lt;strong&gt;"Run workflow"&lt;/strong&gt; (à direita)&lt;/li&gt;
&lt;li&gt;Mantenha a branch padrão selecionada&lt;/li&gt;
&lt;li&gt;Clique em &lt;strong&gt;"Run workflow"&lt;/strong&gt; (verde)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Acompanhe a execução:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aguarde alguns segundos e recarregue a página&lt;/li&gt;
&lt;li&gt;Clique na execução que apareceu&lt;/li&gt;
&lt;li&gt;Clique em &lt;strong&gt;"metrics"&lt;/strong&gt; para ver os detalhes&lt;/li&gt;
&lt;li&gt;Acompanhe o log em tempo real&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Verificar o resultado:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se tudo correr bem, você verá um ✅ verde&lt;/li&gt;
&lt;li&gt;O arquivo &lt;code&gt;assets/metrics.svg&lt;/code&gt; será criado no seu repositório&lt;/li&gt;
&lt;li&gt;Verifique acessando: &lt;code&gt;https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs8yjffjm1uwfulw9il5g.png&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Passo 6: Adicionar o SVG ao README
&lt;/h3&gt;

&lt;p&gt;Última etapa: vamos exibir suas métricas no README!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Abra o arquivo &lt;code&gt;README.md&lt;/code&gt; do seu repositório&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adicione a imagem usando Markdown:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## 📊 Minhas Estatísticas do GitHub&lt;/span&gt;

&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;Metrics&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;./assets/metrics.svg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou, para garantir que sempre mostre a versão mais recente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## 📊 Minhas Estatísticas do GitHub&lt;/span&gt;

&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;Metrics&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://raw.githubusercontent.com/gist/Ev357/17d9fc0cbccd58aea20b392de2d88eba/raw/aa5379c97b7f1bf89105f0960fafdb389cdbd70e/github-metrics.svg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Commit e push das alterações:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add README.md
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"docs: adiciona métricas do GitHub ao README"&lt;/span&gt;
git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Admire o resultado!&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Acesse seu perfil e veja suas métricas lindamente renderizadas!&lt;/p&gt;

&lt;h2&gt;
  
  
  Customizações e Plugins Avançados
&lt;/h2&gt;

&lt;p&gt;Agora que você tem o básico funcionando, que tal turbinar suas métricas? O lowlighter/metrics oferece uma infinidade de opções!&lt;/p&gt;

&lt;h3&gt;
  
  
  Plugins Populares para Experimentar
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Calendário Isométrico de Commits
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;plugin_isocalendar&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="na"&gt;plugin_isocalendar_duration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;half-year&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cria um calendário 3D mostrando sua atividade de commits.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Hábitos de Codificação
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;plugin_habits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="na"&gt;plugin_habits_charts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="na"&gt;plugin_habits_days&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;14&lt;/span&gt;
&lt;span class="na"&gt;plugin_habits_facts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="na"&gt;plugin_habits_from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Analisa seus padrões: horários preferidos, dias mais produtivos, etc.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Contribuições Notáveis
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;plugin_notable&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="na"&gt;plugin_notable_filter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;stars:&amp;gt;50&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Destaca repositórios onde você contribuiu que têm mais de 50 stars.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Gráfico de Stargazers
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;plugin_stargazers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="na"&gt;plugin_stargazers_charts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="na"&gt;plugin_stargazers_charts_type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;chartist&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mostra a evolução de stars nos seus repositórios.&lt;/p&gt;

&lt;h4&gt;
  
  
  5. Integração com WakaTime
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;plugin_wakatime&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;span class="na"&gt;plugin_wakatime_token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.WAKATIME_TOKEN }}&lt;/span&gt;
&lt;span class="na"&gt;plugin_wakatime_days&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;7&lt;/span&gt;
&lt;span class="na"&gt;plugin_wakatime_sections&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;time, projects, languages&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exibe estatísticas detalhadas de tempo de codificação do WakaTime.&lt;/p&gt;

&lt;h3&gt;
  
  
  Templates Visuais Diferentes
&lt;/h3&gt;

&lt;p&gt;Você pode mudar completamente a aparência usando templates:&lt;/p&gt;

&lt;h4&gt;
  
  
  Terminal Style
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;terminal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Classic (padrão)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;classic&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Repository Style
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;repository&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Temas Pré-definidos
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;config_theme&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dark&lt;/span&gt;
&lt;span class="c1"&gt;# Opções: default, dark, auto&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou use temas personalizados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;config_theme&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github-dark&lt;/span&gt;
&lt;span class="c1"&gt;# Outras opções: github, monokai, solarized, etc.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exemplo de Configuração Avançada
&lt;/h3&gt;

&lt;p&gt;Aqui está um exemplo completo com vários plugins:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;GitHub Metrics Advanced&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*"&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;metrics&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;lowlighter/metrics@latest&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.METRICS_TOKEN }}&lt;/span&gt;
          &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;seu-usuario&lt;/span&gt;
          &lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;assets/metrics-advanced.svg&lt;/span&gt;

          &lt;span class="c1"&gt;# Configurações gerais&lt;/span&gt;
          &lt;span class="na"&gt;base&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;header, activity, community, repositories, metadata&lt;/span&gt;
          &lt;span class="na"&gt;config_timezone&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;America/Sao_Paulo&lt;/span&gt;
          &lt;span class="na"&gt;config_theme&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dark&lt;/span&gt;

          &lt;span class="c1"&gt;# Plugin de linguagens&lt;/span&gt;
          &lt;span class="na"&gt;plugin_languages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
          &lt;span class="na"&gt;plugin_languages_sections&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;most-used, recently-used&lt;/span&gt;
          &lt;span class="na"&gt;plugin_languages_details&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bytes-size, percentage&lt;/span&gt;
          &lt;span class="na"&gt;plugin_languages_limit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;
          &lt;span class="na"&gt;plugin_languages_indepth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

          &lt;span class="c1"&gt;# Plugin de linhas de código&lt;/span&gt;
          &lt;span class="na"&gt;plugin_lines&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

          &lt;span class="c1"&gt;# Calendário isométrico&lt;/span&gt;
          &lt;span class="na"&gt;plugin_isocalendar&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
          &lt;span class="na"&gt;plugin_isocalendar_duration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;half-year&lt;/span&gt;

          &lt;span class="c1"&gt;# Hábitos&lt;/span&gt;
          &lt;span class="na"&gt;plugin_habits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
          &lt;span class="na"&gt;plugin_habits_charts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
          &lt;span class="na"&gt;plugin_habits_days&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;14&lt;/span&gt;
          &lt;span class="na"&gt;plugin_habits_facts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;

          &lt;span class="c1"&gt;# Contribuições notáveis&lt;/span&gt;
          &lt;span class="na"&gt;plugin_notable&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
          &lt;span class="na"&gt;plugin_notable_filter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;stars:&amp;gt;100&lt;/span&gt;

          &lt;span class="c1"&gt;# Stargazers&lt;/span&gt;
          &lt;span class="na"&gt;plugin_stargazers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
          &lt;span class="na"&gt;plugin_stargazers_charts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔧 Troubleshooting: Problemas Comuns e Soluções
&lt;/h2&gt;

&lt;p&gt;Encontrou algum problema? Vamos resolver! Aqui estão os erros mais comuns e como corrigi-los.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ Erro: "Resource not accessible by integration"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Causa&lt;/strong&gt;: O workflow não tem permissão para fazer commit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solução&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Adicione &lt;code&gt;permissions: contents: write&lt;/code&gt; ao job&lt;/li&gt;
&lt;li&gt;Verifique se as Actions têm permissão de escrita:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Settings&lt;/code&gt; → &lt;code&gt;Actions&lt;/code&gt; → &lt;code&gt;General&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Em "Workflow permissions", selecione &lt;strong&gt;"Read and write permissions"&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ❌ Erro: "Bad credentials" ou "401 Unauthorized"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Causa&lt;/strong&gt;: Problema com o token de acesso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Soluções&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Verifique se o secret &lt;code&gt;METRICS_TOKEN&lt;/code&gt; está configurado corretamente&lt;/li&gt;
&lt;li&gt;Certifique-se de que o token não expirou&lt;/li&gt;
&lt;li&gt;Confirme que o token tem os escopos necessários&lt;/li&gt;
&lt;li&gt;Gere um novo token se necessário&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ❌ Erro: Plugin não funciona ou exibe "Skipped"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Causa&lt;/strong&gt;: O token não tem as permissões (scopes) necessárias para aquele plugin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solução&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Verifique a &lt;a href="https://github.com/lowlighter/metrics#%EF%B8%8F-plugins" rel="noopener noreferrer"&gt;documentação do plugin&lt;/a&gt; para ver quais scopes são necessários&lt;/li&gt;
&lt;li&gt;Crie um novo token com os scopes corretos&lt;/li&gt;
&lt;li&gt;Atualize o secret &lt;code&gt;METRICS_TOKEN&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ❌ O SVG não aparece no README
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Causas possíveis&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Caminho incorreto no Markdown&lt;/li&gt;
&lt;li&gt;O arquivo ainda não foi gerado&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Soluções&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Verifique se o caminho está correto: &lt;code&gt;./assets/metrics.svg&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Ou use o caminho completo: &lt;code&gt;https://upload.wikimedia.org/wikipedia/commons/1/14/Cryogenic_electron_microscopy_workflow.svg&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Certifique-se de que o workflow rodou com sucesso&lt;/li&gt;
&lt;li&gt;Aguarde alguns minutos para o cache do GitHub atualizar&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ❌ Workflow executou mas não gerou o arquivo
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Causa&lt;/strong&gt;: Permissões ou configuração incorreta.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Soluções&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Verifique os logs do workflow para mensagens de erro específicas&lt;/li&gt;
&lt;li&gt;Confirme que &lt;code&gt;permissions: contents: write&lt;/code&gt; está presente&lt;/li&gt;
&lt;li&gt;Verifique se o &lt;code&gt;filename&lt;/code&gt; está correto&lt;/li&gt;
&lt;li&gt;Certifique-se de que a pasta de destino não está em &lt;code&gt;.gitignore&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Dica Profissional: Como Debugar
&lt;/h3&gt;

&lt;p&gt;Para facilitar o debugging, adicione esta configuração ao workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;config_output&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;svg&lt;/span&gt;
&lt;span class="na"&gt;debug&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso gerará logs mais detalhados mostrando exatamente o que está acontecendo em cada etapa.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ainda com Problemas?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Consulte a documentação oficial&lt;/strong&gt;: &lt;a href="https://github.com/lowlighter/metrics" rel="noopener noreferrer"&gt;github.com/lowlighter/metrics&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use o playground interativo&lt;/strong&gt;: &lt;a href="https://metrics.lecoq.io" rel="noopener noreferrer"&gt;metrics.lecoq.io&lt;/a&gt; para testar configurações&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verifique as issues&lt;/strong&gt;: Procure por problemas similares nas &lt;a href="https://github.com/lowlighter/metrics/issues" rel="noopener noreferrer"&gt;issues do projeto&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Peça ajuda&lt;/strong&gt;: Crie uma issue detalhando seu problema com logs e configurações&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🎯 Conclusão e Próximos Passos
&lt;/h2&gt;

&lt;p&gt;Parabéns! Você acabou de implementar uma solução &lt;strong&gt;profissional&lt;/strong&gt;, &lt;strong&gt;confiável&lt;/strong&gt; e &lt;strong&gt;totalmente automatizada&lt;/strong&gt; para exibir suas estatísticas do GitHub.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens que Você Conquistou
&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;Independência total&lt;/strong&gt; - Não depende mais de serviços externos&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Confiabilidade garantida&lt;/strong&gt; - Suas métricas sempre estarão disponíveis&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Personalização infinita&lt;/strong&gt; - Mais de 40 plugins ao seu dispor&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Gratuito para sempre&lt;/strong&gt; - Sem custos de hospedagem&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Controle total&lt;/strong&gt; - Você decide quando e como atualizar&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Profissionalismo&lt;/strong&gt; - Um perfil que impressiona recrutadores  &lt;/p&gt;

&lt;h3&gt;
  
  
  Sugestões de Próximos Passos
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Experimente diferentes plugins&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Teste o &lt;code&gt;plugin_habits&lt;/code&gt; para mostrar seus padrões de codificação&lt;/li&gt;
&lt;li&gt;Adicione &lt;code&gt;plugin_isocalendar&lt;/code&gt; para um visual impactante&lt;/li&gt;
&lt;li&gt;Se usa WakaTime, integre com &lt;code&gt;plugin_wakatime&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Crie múltiplas versões&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gere um SVG para modo claro e outro para modo escuro&lt;/li&gt;
&lt;li&gt;Crie versões especializadas (só linguagens, só atividade, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Otimize o agendamento&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ajuste o cron para atualizar em horários estratégicos&lt;/li&gt;
&lt;li&gt;Considere executar semanalmente se diário for excessivo&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Compartilhe e inspire&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mostre seu perfil renovado nas redes sociais&lt;/li&gt;
&lt;li&gt;Ajude outros devs compartilhando este artigo&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Explore a documentação&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visite &lt;a href="https://metrics.lecoq.io" rel="noopener noreferrer"&gt;metrics.lecoq.io&lt;/a&gt; para descobrir todas as possibilidades&lt;/li&gt;
&lt;li&gt;Leia os &lt;a href="https://github.com/lowlighter/metrics/tree/examples" rel="noopener noreferrer"&gt;exemplos oficiais&lt;/a&gt; para inspiração&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Uma Nota Final sobre Open Source ❤️
&lt;/h3&gt;

&lt;p&gt;Tanto o &lt;code&gt;github-readme-stats&lt;/code&gt; quanto o &lt;code&gt;lowlighter/metrics&lt;/code&gt; são projetos open-source mantidos pela comunidade. Se você achar essas ferramentas úteis, considere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐ Dar uma estrela no repositório&lt;/li&gt;
&lt;li&gt;💬 Reportar bugs ou sugerir melhorias&lt;/li&gt;
&lt;li&gt;🤝 Contribuir com código ou documentação&lt;/li&gt;
&lt;li&gt;☕ Apoiar os mantenedores se possível&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O open source só funciona porque pessoas dedicam seu tempo para criar ferramentas incríveis gratuitamente. Vamos retribuir sempre que possível!&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 Recursos Adicionais
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Documentação oficial&lt;/strong&gt;: &lt;a href="https://github.com/lowlighter/metrics" rel="noopener noreferrer"&gt;github.com/lowlighter/metrics&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Playground interativo&lt;/strong&gt;: &lt;a href="https://metrics.lecoq.io" rel="noopener noreferrer"&gt;metrics.lecoq.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exemplos de uso&lt;/strong&gt;: &lt;a href="https://github.com/lowlighter/metrics/tree/examples" rel="noopener noreferrer"&gt;github.com/lowlighter/metrics/tree/examples&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions Docs&lt;/strong&gt;: &lt;a href="https://docs.github.com/en/actions" rel="noopener noreferrer"&gt;docs.github.com/actions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sintaxe Cron&lt;/strong&gt;: &lt;a href="https://crontab.guru/" rel="noopener noreferrer"&gt;crontab.guru&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Gostou do artigo?&lt;/strong&gt; Deixe um ❤️ e compartilhe com outros desenvolvedores que possam estar com o mesmo problema! Tem alguma dúvida ou sugestão? Comenta aqui embaixo!&lt;/p&gt;

</description>
      <category>automation</category>
      <category>githubactions</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Bancos de Dados Chave-Valor: Conceitos, Funcionamento e Laboratório com Redis</title>
      <dc:creator>Emanoel Carvalho</dc:creator>
      <pubDate>Thu, 12 Feb 2026 16:00:35 +0000</pubDate>
      <link>https://dev.to/emanoelcarvalho/bancos-de-dados-chave-valor-conceitos-funcionamento-e-laboratorio-com-redis-1cgh</link>
      <guid>https://dev.to/emanoelcarvalho/bancos-de-dados-chave-valor-conceitos-funcionamento-e-laboratorio-com-redis-1cgh</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Bancos de dados chave-valor são amplamente utilizados em aplicações modernas por resolverem, de forma simples e eficiente, problemas comuns relacionados a &lt;strong&gt;latência&lt;/strong&gt;, &lt;strong&gt;escalabilidade&lt;/strong&gt; e &lt;strong&gt;flexibilidade de dados&lt;/strong&gt;. Este artigo apresenta uma visão conceitual e prática sobre esse modelo, explicando desde seus fundamentos até um laboratório prático utilizando &lt;strong&gt;Redis&lt;/strong&gt; e &lt;strong&gt;Docker&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é um banco de dados chave-valor?
&lt;/h2&gt;

&lt;p&gt;Um banco de dados &lt;strong&gt;chave-valor&lt;/strong&gt; é um tipo de banco &lt;strong&gt;NoSQL&lt;/strong&gt; que armazena dados na forma de pares simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chave → valor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A chave é um identificador único, e o valor é um bloco de dados associado a essa chave. O banco não precisa interpretar o conteúdo do valor — ele apenas o armazena e o recupera.&lt;/p&gt;

&lt;p&gt;Esse modelo é classificado como &lt;strong&gt;NoSQL&lt;/strong&gt; porque abandona conceitos tradicionais dos bancos relacionais, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tabelas&lt;/li&gt;
&lt;li&gt;Relacionamentos&lt;/li&gt;
&lt;li&gt;Joins&lt;/li&gt;
&lt;li&gt;Esquemas rígidos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O objetivo principal é alcançar &lt;strong&gt;alto desempenho&lt;/strong&gt;, &lt;strong&gt;flexibilidade de dados&lt;/strong&gt; e &lt;strong&gt;escalabilidade horizontal&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Diferença para outros bancos NoSQL
&lt;/h2&gt;

&lt;p&gt;Embora bancos como &lt;strong&gt;Redis&lt;/strong&gt; e &lt;strong&gt;MongoDB&lt;/strong&gt; pertençam à família NoSQL, eles resolvem problemas diferentes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Redis&lt;/strong&gt;: foco em &lt;strong&gt;alta performance&lt;/strong&gt;, com dados armazenados primariamente em &lt;strong&gt;memória&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MongoDB&lt;/strong&gt;: foco em &lt;strong&gt;persistência de documentos complexos&lt;/strong&gt;, armazenados em &lt;strong&gt;disco&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A principal diferença está na forma de armazenamento e no tipo de carga de trabalho que cada um atende melhor.&lt;/p&gt;




&lt;h2&gt;
  
  
  Como funciona o armazenamento em bancos chave-valor?
&lt;/h2&gt;

&lt;p&gt;O armazenamento ocorre por meio de pares simples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chave&lt;/strong&gt;: identificador único&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Valor&lt;/strong&gt;: qualquer tipo de dado (strings, números, JSONs ou objetos serializados)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa estrutura é semelhante a um &lt;strong&gt;dicionário&lt;/strong&gt; ou &lt;strong&gt;mapa&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Por não existir esquema ou validação estrutural, operações de &lt;strong&gt;leitura&lt;/strong&gt; e &lt;strong&gt;escrita&lt;/strong&gt; são extremamente rápidas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplos de uso comuns
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Carrinhos de compra&lt;/li&gt;
&lt;li&gt;Sessões de usuários&lt;/li&gt;
&lt;li&gt;Promoções temporárias&lt;/li&gt;
&lt;li&gt;Cache de dados frequentemente acessados&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Um exemplo bastante conhecido no desenvolvimento front-end é o &lt;strong&gt;localStorage&lt;/strong&gt;, uma API do HTML5 que permite armazenar dados no navegador do usuário no formato chave-valor.&lt;/p&gt;




&lt;h2&gt;
  
  
  Principais características
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Estrutura simples
&lt;/h3&gt;

&lt;p&gt;A chave localiza diretamente o valor. O banco não precisa entender o conteúdo armazenado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Flexibilidade (schema-less)
&lt;/h3&gt;

&lt;p&gt;Cada valor pode ter uma estrutura diferente, facilitando o armazenamento de dados não estruturados ou semipreenchidos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance e escalabilidade
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Acesso direto pela chave&lt;/li&gt;
&lt;li&gt;Leitura e escrita em tempo constante (O(1))&lt;/li&gt;
&lt;li&gt;Fácil particionamento e escalabilidade horizontal&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Acesso direto
&lt;/h3&gt;

&lt;p&gt;Não existem índices complexos nem varredura de dados. A busca é feita diretamente pela chave.&lt;/p&gt;




&lt;h2&gt;
  
  
  Casos de uso mais comuns
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cache de aplicações&lt;/strong&gt;: Redis, Memcached&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gerenciamento de sessão&lt;/strong&gt;: dados de usuários em tempo real&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filas e contadores&lt;/strong&gt;: métricas, processamento assíncrono&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Funcionamento em baixo nível
&lt;/h2&gt;

&lt;p&gt;Em baixo nível, um banco chave-valor é essencialmente um sistema que mapeia um conjunto de bytes (chave) para outro conjunto de bytes (valor).&lt;/p&gt;

&lt;p&gt;Internamente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Não existe conceito de tipo, tabela ou esquema&lt;/li&gt;
&lt;li&gt;Tudo é tratado como dados binários&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Estrutura em memória
&lt;/h3&gt;

&lt;p&gt;A implementação mais comum utiliza uma &lt;strong&gt;tabela hash&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A chave (array de bytes) é passada por uma função hash&lt;/li&gt;
&lt;li&gt;O hash gera um índice na tabela&lt;/li&gt;
&lt;li&gt;Esse índice aponta para um &lt;em&gt;bucket&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;O bucket pode conter uma ou mais entradas&lt;/li&gt;
&lt;li&gt;Em caso de colisão, a comparação final é feita byte a byte&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Se a chave for encontrada, o valor associado é retornado.&lt;/p&gt;




&lt;h2&gt;
  
  
  Persistência de dados
&lt;/h2&gt;

&lt;p&gt;Embora muitos bancos chave-valor utilizem memória para alcançar alta performance, isso torna os dados voláteis.&lt;/p&gt;

&lt;p&gt;Para resolver esse problema, mecanismos de persistência são utilizados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Write-Ahead Log (WAL)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Toda escrita é registrada primeiro em um log sequencial em disco&lt;/li&gt;
&lt;li&gt;Garante que os dados não sejam perdidos em caso de falha&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  MemTable
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Estrutura de dados mantida em memória (como Skip List ou Árvore balanceada)&lt;/li&gt;
&lt;li&gt;Escritas são feitas simultaneamente no log e na memória&lt;/li&gt;
&lt;li&gt;A resposta de sucesso é enviada após essas operações&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse modelo realiza apenas &lt;strong&gt;operações de append&lt;/strong&gt;, evitando sobrescritas em disco e aumentando a eficiência.&lt;/p&gt;




&lt;h2&gt;
  
  
  Por que esse modelo é tão utilizado?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Resolve problemas de latência&lt;/li&gt;
&lt;li&gt;Reduz custo de acesso a bancos relacionais&lt;/li&gt;
&lt;li&gt;Evita múltiplas consultas repetidas&lt;/li&gt;
&lt;li&gt;Simplifica o modelo mental do desenvolvedor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A aplicação sabe exatamente qual chave buscar e recebe o valor diretamente, sem surpresas de performance.&lt;/p&gt;




&lt;h2&gt;
  
  
  Laboratório prático com Redis
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pré-requisitos
&lt;/h3&gt;

&lt;p&gt;Você precisa ter instalado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Docker Compose&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Verifique:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nt"&gt;--version&lt;/span&gt;
docker compose version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Estrutura do laboratório
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis-lab/
 ├── docker-compose.yml
 └── README.md (opcional)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Criando o Redis com Docker
&lt;/h2&gt;

&lt;h3&gt;
  
  
  docker-compose.yml
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.9"&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis:7.2&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis-lab&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;6379:6379"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;redis_data:/data&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis-server --appendonly yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conceitos envolvidos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;redis:7.2&lt;/code&gt;: SGBD Redis&lt;/li&gt;
&lt;li&gt;Porta &lt;code&gt;6379&lt;/code&gt;: porta padrão do Redis&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;volumes&lt;/code&gt;: persistência de dados&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;appendonly yes&lt;/code&gt;: grava operações em disco (AOF)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mesmo bancos em memória podem oferecer persistência.&lt;/p&gt;




&lt;h2&gt;
  
  
  Subindo o banco
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verifique:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Acessando o Redis
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; redis-lab redis-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Operações básicas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Inserindo dados
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;SET nome &lt;span class="s2"&gt;"Carlos"&lt;/span&gt;
SET idade 30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Buscando dados
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;GET nome
GET idade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Busca em tempo constante (O(1)).&lt;/p&gt;

&lt;h3&gt;
  
  
  Atualizando dados
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;SET idade 31
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Atualizar significa sobrescrever o valor da chave.&lt;/p&gt;

&lt;h3&gt;
  
  
  Removendo dados
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;DEL nome
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Tipos de dados no Redis
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Strings
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;SET status &lt;span class="s2"&gt;"ativo"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Listas
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;LPUSH fila_emails &lt;span class="s2"&gt;"email1"&lt;/span&gt;
LPUSH fila_emails &lt;span class="s2"&gt;"email2"&lt;/span&gt;
LRANGE fila_emails 0 &lt;span class="nt"&gt;-1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Muito usadas como filas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Contadores
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;SET visitas 0
INCR visitas
INCR visitas
GET visitas
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Operações atômicas, ideais para métricas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hashes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;HSET usuario:1 nome &lt;span class="s2"&gt;"Ana"&lt;/span&gt; idade 28 email &lt;span class="s2"&gt;"ana@email.com"&lt;/span&gt;
HGETALL usuario:1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simulam registros estruturados.&lt;/p&gt;




&lt;h2&gt;
  
  
  TTL – dados temporários
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;SET codigo_verificacao &lt;span class="s2"&gt;"123456"&lt;/span&gt; EX 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após 10 segundos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;GET codigo_verificacao
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Muito usado para sessões, tokens e cache.&lt;/p&gt;




&lt;h2&gt;
  
  
  Visualizando o estado do banco
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;KEYS &lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚠️ Em produção, esse comando é perigoso. Aqui é usado apenas para aprendizado.&lt;/p&gt;




&lt;h2&gt;
  
  
  Resumo mental
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Conceito&lt;/th&gt;
&lt;th&gt;Redis&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Modelo&lt;/td&gt;
&lt;td&gt;Chave → Valor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema&lt;/td&gt;
&lt;td&gt;Não existe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Join&lt;/td&gt;
&lt;td&gt;Não&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Velocidade&lt;/td&gt;
&lt;td&gt;Muito alta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persistência&lt;/td&gt;
&lt;td&gt;Opcional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uso comum&lt;/td&gt;
&lt;td&gt;Cache, sessões, filas&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Encerrando o laboratório
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Redis Documentation – &lt;a href="https://redis.io/docs" rel="noopener noreferrer"&gt;https://redis.io/docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Designing Data-Intensive Applications – Martin Kleppmann&lt;/li&gt;
&lt;li&gt;NoSQL Databases – &lt;a href="https://www.mongodb.com/nosql-explained" rel="noopener noreferrer"&gt;https://www.mongodb.com/nosql-explained&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Log-Structured Storage – &lt;a href="https://en.wikipedia.org/wiki/Log-structured_file_system" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Log-structured_file_system&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>database</category>
      <category>redis</category>
    </item>
    <item>
      <title>📘Guia Prático: Introdução ao Git + Como Subir Seu Código no GitHub</title>
      <dc:creator>Emanoel Carvalho</dc:creator>
      <pubDate>Fri, 12 Dec 2025 01:18:38 +0000</pubDate>
      <link>https://dev.to/emanoelcarvalho/guia-pratico-introducao-ao-git-como-subir-seu-codigo-no-github-10jl</link>
      <guid>https://dev.to/emanoelcarvalho/guia-pratico-introducao-ao-git-como-subir-seu-codigo-no-github-10jl</guid>
      <description>&lt;h2&gt;
  
  
  📝 &lt;strong&gt;Introdução&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;No cenário atual do desenvolvimento de software, usamos dezenas de linguagens, frameworks e ferramentas. Mas, independentemente da stack, existe algo que todo desenvolvedor precisa dominar desde cedo: &lt;strong&gt;controle de versão&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Nesse contexto, entram em cena duas ferramentas fundamentais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Git&lt;/strong&gt; — o sistema de controle de versão mais usado do mundo&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt; — uma plataforma de hospedagem e colaboração baseada em Git&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Antes de mostrar como integrar Git e GitHub, é fundamental entender &lt;em&gt;por que&lt;/em&gt; essas ferramentas existem e como funcionam por dentro. Essa base torna qualquer profissional mais confiante e evita erros comuns do dia a dia.&lt;/p&gt;


&lt;h1&gt;
  
  
  🧩 1. O que é Git?
&lt;/h1&gt;

&lt;p&gt;O Git é um &lt;strong&gt;software open source de controle de versão&lt;/strong&gt;, criado por &lt;strong&gt;Linus Torvalds&lt;/strong&gt;, o mesmo criador do Linux.&lt;br&gt;&lt;br&gt;
A motivação original era simples: ele precisava de um sistema rápido, eficiente e confiável para controlar versões do kernel, algo que ferramentas da época não conseguiam oferecer.&lt;/p&gt;

&lt;p&gt;O Git se tornou um padrão global porque é:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;rápido&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;distribuído (cada máquina tem o repositório completo)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;seguro (baseado em hashing)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;simples de sincronizar com servidores remotos&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  🛠️ 2. Como o Git funciona?
&lt;/h1&gt;

&lt;p&gt;Ao contrário de sistemas antigos que salvavam apenas &lt;em&gt;diferenças entre arquivos&lt;/em&gt; (diffs), o Git trabalha com &lt;strong&gt;snapshots completos do estado dos arquivos&lt;/strong&gt; a cada commit.&lt;/p&gt;
&lt;h3&gt;
  
  
  Em resumo:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ele tira uma “foto” do projeto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mas salva novamente &lt;strong&gt;apenas o que mudou&lt;/strong&gt;, graças ao hashing e deduplicação.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cada snapshot é um commit, formando uma linha do tempo.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso permite histórico rápido, seguro e fácil de navegar.&lt;/p&gt;


&lt;h1&gt;
  
  
  📦 3. Os objetos internos do Git
&lt;/h1&gt;

&lt;p&gt;O Git é basicamente um banco de dados de objetos imutáveis, armazenados em &lt;code&gt;.git/objects/&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
Os tipos principais são:&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;1. Blob&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Conteúdo de um arquivo.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;2. Tree&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Representa diretórios, apontando para blobs e outras trees.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;3. Commit&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Aponta para uma tree e para seus commits pais.&lt;/p&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;4. Tag&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Marcadores para commits, usados geralmente para versões.&lt;/p&gt;

&lt;p&gt;Isso garante uma estrutura poderosa e verificável.&lt;/p&gt;


&lt;h1&gt;
  
  
  🔐 4. Imutabilidade e hashes
&lt;/h1&gt;

&lt;p&gt;Cada objeto é nomeado pelo hash do conteúdo.&lt;br&gt;&lt;br&gt;
Isso garante:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;integridade criptográfica&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;histórico imutável&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;detecção de corrupção&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;deduplicação automática&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Modificou o conteúdo? O hash muda.&lt;br&gt;&lt;br&gt;
Assim o Git sabe exatamente o que mudou e quando.&lt;/p&gt;


&lt;h1&gt;
  
  
  🌿 5. Branches: ponteiros leves
&lt;/h1&gt;

&lt;p&gt;Um branch não é uma cópia do projeto.&lt;br&gt;&lt;br&gt;
É apenas um &lt;strong&gt;ponteiro&lt;/strong&gt; para um commit.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;main&lt;/code&gt; → aponta para o commit mais recente da linha principal&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Criar branch → criar novo ponteiro&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Commit em um branch → ponteiro avança&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por isso criar branches é barato e incentivado.&lt;/p&gt;


&lt;h1&gt;
  
  
  🔗 6. Histórico como um DAG
&lt;/h1&gt;

&lt;p&gt;Os commits formam um &lt;strong&gt;grafo acíclico dirigido&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Cada commit aponta para seus pais&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Merges têm dois pais&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O histórico avança sempre para frente&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É por isso que o Git é tão eficiente em representar múltiplas linhas de desenvolvimento.&lt;/p&gt;


&lt;h1&gt;
  
  
  📥 7. Staging Area (Index)
&lt;/h1&gt;

&lt;p&gt;O Git tem uma área intermediária chamada &lt;strong&gt;index&lt;/strong&gt;, onde escolhemos o que vai entrar no commit.&lt;/p&gt;

&lt;p&gt;Isso permite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;commits mais limpos&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;controle granular&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;combinar partes de arquivos&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  📡 8. O que são repositórios remotos?
&lt;/h1&gt;

&lt;p&gt;Servidores como GitHub, GitLab ou Bitbucket são apenas &lt;strong&gt;repositórios Git adicionais&lt;/strong&gt; hospedados na nuvem.&lt;/p&gt;

&lt;p&gt;Quando usamos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;git push&lt;/code&gt; → mandamos commits e atualizamos referências remotas&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;git pull&lt;/code&gt; → trazemos commits remotos e atualizamos nossa branch local&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nada de mágico: é só sincronização.&lt;/p&gt;


&lt;h1&gt;
  
  
  🔀 9. Merge vs Rebase
&lt;/h1&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Merge&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Cria um commit com 2 pais&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mantém histórico paralelo&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;Rebase&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Reescreve commits, mudando seus pais&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Produz histórico linear&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Gera novos hashes&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ambos fazem parte do arsenal de um desenvolvedor moderno.&lt;/p&gt;


&lt;h1&gt;
  
  
  🧹 10. Reescrita de histórico
&lt;/h1&gt;

&lt;p&gt;O Git nunca altera commits antigos — cria commits novos.&lt;br&gt;&lt;br&gt;
Os antigos ficam “órfãos” e podem ser removidos pelo &lt;code&gt;git gc&lt;/code&gt;.&lt;/p&gt;


&lt;h1&gt;
  
  
  🎯 &lt;strong&gt;Resumo teórico&lt;/strong&gt;
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Git é um banco de dados imutável baseado em hashes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Commits são snapshots.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Branches são ponteiros.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O histórico é um DAG.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Repositórios remotos são só referência extra.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora que entendemos Git… vamos ao GitHub.&lt;/p&gt;


&lt;h1&gt;
  
  
  🐙 11. O que é GitHub?
&lt;/h1&gt;

&lt;p&gt;O &lt;strong&gt;GitHub&lt;/strong&gt; é a maior plataforma de hospedagem de código do mundo, com milhões de repositórios.&lt;br&gt;&lt;br&gt;
Ele pertence à Microsoft e oferece:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;hospedagem de repositórios&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;issues&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;pull requests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;workflows de CI/CD (GitHub Actions)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;colaboração em equipe&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;interface web rica&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;apps desktop e mobile&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em resumo:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Git controla seu código localmente; GitHub permite compartilhar, colaborar e publicar.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h1&gt;
  
  
  🚀 12. Como integrar Git + GitHub (tutorial simples e completo)
&lt;/h1&gt;

&lt;p&gt;A seguir, um passo a passo direto e funcional.&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;1. Instale o Git&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Verifique se já está instalado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se não estiver, baixe em:&lt;br&gt;&lt;br&gt;
&lt;a href="https://git-scm.com/" rel="noopener noreferrer"&gt;https://git-scm.com&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;2. Configure seu nome e email&lt;/strong&gt;
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.name &lt;span class="s2"&gt;"Seu Nome"&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email &lt;span class="s2"&gt;"seuemail@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;3. Crie um repositório local&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;No diretório do seu projeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git init
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"primeiro commit"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;4. Crie um repositório no GitHub&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Acesse &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;https://github.com&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Clique em &lt;strong&gt;New repository&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dê um nome&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Não marque nenhum arquivo (para evitar conflitos no push inicial)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;5. Conecte o repositório local ao GitHub&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Copie a URL HTTPS fornecida no GitHub e execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote add origin https://github.com/usuario/repositorio.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;6. Defina a branch principal como &lt;code&gt;main&lt;/code&gt;&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git branch &lt;span class="nt"&gt;-M&lt;/span&gt; main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;7. Envie o projeto para o GitHub&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto! 🎉&lt;br&gt;&lt;br&gt;
Seu projeto está online.&lt;/p&gt;


&lt;h1&gt;
  
  
  💬 13. Ciclo básico de trabalho no dia a dia
&lt;/h1&gt;

&lt;p&gt;As operações principais:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"mensagem"&lt;/span&gt;
git pull
git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  ⚠️ 14. Problemas comuns e soluções rápidas
&lt;/h1&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Push rejeitado&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git pull &lt;span class="nt"&gt;--rebase&lt;/span&gt; origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;2. Conflicts&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Abra os arquivos, resolva, depois:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;3. Autenticação falha&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Configure chave SSH&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ou faça login no GitHub CLI&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  📚 15. Cheatsheet (comandos principais do Git)
&lt;/h1&gt;

&lt;h2&gt;
  
  
  📌 &lt;strong&gt;Configuração&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.name
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📌 &lt;strong&gt;Inicialização&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📌 &lt;strong&gt;Status e logs&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git status
git log &lt;span class="nt"&gt;--oneline&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📌 &lt;strong&gt;Staging e commit&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add arquivo
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"mensagem"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📌 &lt;strong&gt;Branches&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git branch
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; nova-branch
git switch main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📌 &lt;strong&gt;Merge &amp;amp; Rebase&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git merge nome-branch
git rebase main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📌 &lt;strong&gt;Sincronização com o remoto&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote &lt;span class="nt"&gt;-v&lt;/span&gt;
git push
git pull
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📌 &lt;strong&gt;Clonar repositório&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone url
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






</description>
      <category>git</category>
      <category>github</category>
      <category>webdev</category>
      <category>learning</category>
    </item>
    <item>
      <title>recursion</title>
      <dc:creator>Emanoel Carvalho</dc:creator>
      <pubDate>Sun, 16 Mar 2025 19:42:54 +0000</pubDate>
      <link>https://dev.to/emanoelcarvalho/recursion-b96</link>
      <guid>https://dev.to/emanoelcarvalho/recursion-b96</guid>
      <description></description>
      <category>programming</category>
    </item>
    <item>
      <title>Comunicação Assíncrona e Síncrona</title>
      <dc:creator>Emanoel Carvalho</dc:creator>
      <pubDate>Fri, 06 Dec 2024 00:24:58 +0000</pubDate>
      <link>https://dev.to/emanoelcarvalho/comunicacao-assincrona-e-sincrona-3gg</link>
      <guid>https://dev.to/emanoelcarvalho/comunicacao-assincrona-e-sincrona-3gg</guid>
      <description>&lt;p&gt;A comunicação entre sistemas ou componentes de software pode ser classificada em dois tipos principais: &lt;strong&gt;comunicação síncrona&lt;/strong&gt; e &lt;strong&gt;comunicação assíncrona&lt;/strong&gt;. A escolha entre uma ou outra depende das necessidades do sistema, como desempenho, complexidade e tolerância a falhas. Vamos entender cada tipo de comunicação com mais detalhes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comunicação Síncrona
&lt;/h2&gt;

&lt;p&gt;Na comunicação síncrona, as partes envolvidas (geralmente um cliente e um servidor, ou dois processos) devem esperar a resposta uma da outra para continuar. Ou seja, a comunicação acontece de maneira "bloqueante", onde uma parte deve esperar que a outra conclua sua tarefa antes de seguir adiante.&lt;/p&gt;

&lt;h3&gt;
  
  
  Características da Comunicação Síncrona
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bloqueio&lt;/strong&gt;: O processo que faz uma requisição deve aguardar até que o processo receptor retorne uma resposta antes de continuar sua execução.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exemplo de Comunicação&lt;/strong&gt;: Em uma aplicação cliente-servidor, quando o cliente faz uma solicitação de dados ao servidor, ele aguarda a resposta antes de seguir com o restante do processo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fluxo de Execução&lt;/strong&gt;: O processo solicitante envia uma requisição e bloqueia sua execução até que a resposta seja recebida.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Vantagens
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simples de Implementar&lt;/strong&gt;: A lógica de implementação é direta, já que o processo solicitante simplesmente espera a resposta do processo receptor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Determinismo&lt;/strong&gt;: A ordem das operações é mais previsível, o que pode ser benéfico em certos cenários, como em transações financeiras ou sistemas críticos.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Desvantagens
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ineficiente para Tarefas Lentas&lt;/strong&gt;: Se a comunicação depende de um processo demorado, como uma requisição a um banco de dados ou a um serviço externo, o sistema pode ficar inativo enquanto aguarda a resposta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escalabilidade Limitada&lt;/strong&gt;: Em sistemas de alta carga, o bloqueio pode afetar negativamente a performance, já que muitos processos podem estar esperando por respostas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Exemplos de Comunicação Síncrona
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chamada de Funções/Procedimentos&lt;/strong&gt;: Em programação, quando um método A chama um método B e aguarda o retorno de B antes de continuar a execução.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protocolos HTTP/HTTPS&lt;/strong&gt;: Quando um cliente (navegador, por exemplo) faz uma requisição ao servidor e aguarda uma resposta antes de renderizar a página.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Comunicação Assíncrona
&lt;/h2&gt;

&lt;p&gt;A comunicação assíncrona é caracterizada pela independência entre os processos que se comunicam. Nessa abordagem, o processo solicitante envia uma requisição, mas não aguarda a resposta imediatamente. Ele pode continuar a execução enquanto espera que o processo receptor finalize a tarefa e envie a resposta.&lt;/p&gt;

&lt;h3&gt;
  
  
  Características da Comunicação Assíncrona
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Não-Bloqueante&lt;/strong&gt;: O processo solicitante não é bloqueado enquanto aguarda a resposta. Ele pode continuar com outras operações e, eventualmente, receber a resposta quando ela estiver pronta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exemplo de Comunicação&lt;/strong&gt;: Em um sistema de filas de mensagens, um processo coloca uma mensagem em uma fila e outro processo a consome mais tarde. O primeiro processo não precisa esperar a conclusão do segundo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desacoplamento&lt;/strong&gt;: Os processos envolvidos na comunicação assíncrona não precisam estar diretamente sincronizados no tempo, o que permite maior flexibilidade e robustez.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Vantagens
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Desempenho&lt;/strong&gt;: Como os processos não ficam esperando uns aos outros, a comunicação assíncrona pode ser muito mais eficiente, especialmente em sistemas distribuídos ou de alta concorrência.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escalabilidade&lt;/strong&gt;: A comunicação assíncrona tende a ser mais escalável, pois permite que múltiplos processos ou threads sejam gerenciados simultaneamente sem bloqueios.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resiliência&lt;/strong&gt;: Em sistemas assíncronos, as falhas em um componente não afetam diretamente o fluxo do sistema, já que as tarefas podem ser reprocessadas ou tratadas de maneira independente.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Desvantagens
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Complexidade&lt;/strong&gt;: A implementação de comunicação assíncrona geralmente envolve o uso de filas de mensagens, callbacks ou eventos, o que pode tornar o sistema mais complexo e difícil de debugar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latência de Resposta&lt;/strong&gt;: Como não há garantia de que a resposta será imediata, o sistema pode não ser adequado para casos em que é necessária uma resposta rápida.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gerenciamento de Estado&lt;/strong&gt;: A comunicação assíncrona pode envolver o gerenciamento de estados entre os diferentes processos, o que pode ser desafiador, especialmente quando há falhas ou tentativas de reprocessamento.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Exemplos de Comunicação Assíncrona
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mensageria&lt;/strong&gt;: Sistemas que utilizam filas de mensagens, como o &lt;strong&gt;RabbitMQ&lt;/strong&gt; ou o &lt;strong&gt;Kafka&lt;/strong&gt;, onde os produtores enviam mensagens para a fila e os consumidores processam essas mensagens de forma assíncrona.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhooks&lt;/strong&gt;: Um serviço pode enviar uma notificação a outro serviço sem esperar uma resposta imediata, permitindo que o receptor trate a solicitação quando estiver pronto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Eventos e Callbacks&lt;/strong&gt;: Em JavaScript, a programação assíncrona é frequentemente usada com funções de callback ou Promises, onde as operações assíncronas são feitas, mas o código continua a ser executado sem esperar pela conclusão dessas operações.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Comparação entre Comunicação Síncrona e Assíncrona
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspecto&lt;/th&gt;
&lt;th&gt;Comunicação Síncrona&lt;/th&gt;
&lt;th&gt;Comunicação Assíncrona&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bloqueio&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bloqueante, aguarda a resposta antes de continuar&lt;/td&gt;
&lt;td&gt;Não-bloqueante, pode continuar a execução&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Complexidade&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Simples de implementar e entender&lt;/td&gt;
&lt;td&gt;Mais complexa, envolve callbacks ou filas de mensagens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Escalabilidade&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pode ser limitada, especialmente em sistemas de alta carga&lt;/td&gt;
&lt;td&gt;Mais escalável, pois permite maior concorrência&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Desempenho&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pode ser ineficiente em processos lentos&lt;/td&gt;
&lt;td&gt;Melhor desempenho em sistemas distribuídos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exemplos&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Chamada de métodos, protocolos HTTP&lt;/td&gt;
&lt;td&gt;Fila de mensagens, webhooks, eventos assíncronos&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;A escolha entre comunicação síncrona e assíncrona depende dos requisitos do sistema. A &lt;strong&gt;comunicação síncrona&lt;/strong&gt; é adequada quando se precisa de respostas imediatas e a ordem das operações é importante, mas pode ser ineficiente em sistemas altamente concorrentes. Já a &lt;strong&gt;comunicação assíncrona&lt;/strong&gt; é ideal para sistemas escaláveis e resilientes, especialmente quando as operações podem ocorrer em paralelo ou quando não há necessidade de uma resposta imediata. &lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>🛠️ Processos na Engenharia de Software</title>
      <dc:creator>Emanoel Carvalho</dc:creator>
      <pubDate>Sun, 01 Dec 2024 20:54:45 +0000</pubDate>
      <link>https://dev.to/emanoelcarvalho/processos-na-engenharia-de-software-4ba3</link>
      <guid>https://dev.to/emanoelcarvalho/processos-na-engenharia-de-software-4ba3</guid>
      <description>&lt;p&gt;Na minha faculdade estamos tendo uma cadeira de engenharia de Software nesse período, e o assunto desta semana, foi processos, algo que achei interessante de se expor aqui para vocês, é um resumo simples, mas explica de uma maneira rápida e superficial o que seria um processo na nossa área de desenvolvimento e sim, programação não é só código rsrs &amp;lt;3. &lt;/p&gt;

&lt;h2&gt;
  
  
  📖 O que é um Processo de Software?
&lt;/h2&gt;

&lt;p&gt;Um &lt;strong&gt;processo de software&lt;/strong&gt; é um conjunto estruturado de atividades necessárias para o desenvolvimento de um software. Ele define como o trabalho será conduzido e os produtos gerados em cada etapa.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔑 Principais objetivos:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Organização e controle&lt;/strong&gt; das atividades.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qualidade&lt;/strong&gt; do produto final.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redução de riscos&lt;/strong&gt; no desenvolvimento.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📂 Fases de um Processo de Software
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Especificação&lt;/strong&gt;: Definição dos requisitos e funcionalidades.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Projeto&lt;/strong&gt;: Criação da arquitetura e design do software.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implementação&lt;/strong&gt;: Codificação e desenvolvimento.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validação&lt;/strong&gt;: Testes e garantia de qualidade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manutenção&lt;/strong&gt;: Correções e atualizações após a entrega.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🚀 Modelos de Processos de Software
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Modelo Cascata&lt;/strong&gt; 🌊
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Linear e sequencial.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;As fases acontecem em ordem, sem voltar atrás.&lt;/li&gt;
&lt;li&gt;Exemplo de fases: Requisitos → Design → Codificação → Testes → Manutenção.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Vantagens:&lt;/strong&gt; Simples e fácil de entender.&lt;br&gt;&lt;br&gt;
   &lt;strong&gt;Desvantagens:&lt;/strong&gt; Pouca flexibilidade.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Modelo Incremental&lt;/strong&gt; 📈
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;O software é desenvolvido em partes (ou incrementos).&lt;/li&gt;
&lt;li&gt;Cada incremento adiciona funcionalidades ao sistema.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Vantagens:&lt;/strong&gt; Entregas parciais e contínuas.&lt;br&gt;&lt;br&gt;
   &lt;strong&gt;Desvantagens:&lt;/strong&gt; Requer bom planejamento.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Modelo Espiral&lt;/strong&gt; 🔄
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Iterativo&lt;/strong&gt;, com foco em análise de riscos.&lt;/li&gt;
&lt;li&gt;Cada ciclo aborda riscos e aprimora o produto.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Vantagens:&lt;/strong&gt; Bom para projetos complexos.&lt;br&gt;&lt;br&gt;
   &lt;strong&gt;Desvantagens:&lt;/strong&gt; Custo elevado.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Modelo Ágil&lt;/strong&gt; ⚡
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Focado em &lt;strong&gt;entregas rápidas&lt;/strong&gt; e &lt;strong&gt;adaptação contínua&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Exemplo: &lt;strong&gt;Scrum&lt;/strong&gt;, &lt;strong&gt;Kanban&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Vantagens:&lt;/strong&gt; Flexível e colaborativo.&lt;br&gt;&lt;br&gt;
   &lt;strong&gt;Desvantagens:&lt;/strong&gt; Pode ser difícil de gerenciar para projetos grandes.&lt;/p&gt;




&lt;h2&gt;
  
  
  📊 Práticas Ágeis Comuns
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Daily Standup:&lt;/strong&gt; Reuniões diárias curtas para alinhamento.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sprint Planning:&lt;/strong&gt; Planejamento de tarefas para um período curto (sprint).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrospectiva:&lt;/strong&gt; Revisão do que funcionou e o que pode melhorar.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧩 Ferramentas para Gerenciar Processos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JIRA&lt;/strong&gt;: Gestão de projetos ágeis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trello&lt;/strong&gt;: Quadro de tarefas baseado em Kanban.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git&lt;/strong&gt;: Controle de versão.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔍 Importância de um Processo Bem Definido
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Melhora a previsibilidade&lt;/strong&gt; do projeto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aumenta a qualidade&lt;/strong&gt; do produto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduz riscos&lt;/strong&gt; e atrasos.
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>development</category>
      <category>discuss</category>
      <category>softwaredevelopment</category>
      <category>programming</category>
    </item>
    <item>
      <title>Associação entre Classes ou Objetos em Java</title>
      <dc:creator>Emanoel Carvalho</dc:creator>
      <pubDate>Thu, 14 Nov 2024 01:31:45 +0000</pubDate>
      <link>https://dev.to/emanoelcarvalho/associacao-entre-classes-ou-objetos-em-java-d1n</link>
      <guid>https://dev.to/emanoelcarvalho/associacao-entre-classes-ou-objetos-em-java-d1n</guid>
      <description>&lt;p&gt;Na programação orientada a objetos (POO), a &lt;strong&gt;associação&lt;/strong&gt; entre classes ou objetos é um relacionamento onde um objeto de uma classe se refere a outro objeto de outra classe. Essa associação pode ser simples ou complexa e pode ser representada de diversas maneiras. Três tipos principais de associação são usados para modelar o relacionamento entre objetos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Composição&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agregação&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiplicidade&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. Composição (Composição Forte)
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;composição&lt;/strong&gt; é um tipo de associação mais forte, onde um objeto "parte" de outro objeto. Se o objeto "pai" for destruído, seus objetos "filhos" também serão destruídos. Em outras palavras, o ciclo de vida dos objetos componentes depende do ciclo de vida do objeto que os contém.&lt;/p&gt;

&lt;h4&gt;
  
  
  Características da Composição:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Relacionamento forte&lt;/strong&gt;: O objeto "pai" contém o objeto "filho" e controla seu ciclo de vida.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Destruição&lt;/strong&gt;: Quando o objeto "pai" é destruído, o objeto "filho" também é destruído.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exemplo&lt;/strong&gt;: Uma &lt;strong&gt;casa&lt;/strong&gt; e seus &lt;strong&gt;cômodos&lt;/strong&gt;. Se a casa for destruída, os cômodos também serão destruídos, pois não existem independentemente.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Exemplo de Composição:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Cômodo&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nc"&gt;Cômodo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&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="o"&gt;}&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;getNome&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="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Casa&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Cômodo&lt;/span&gt; &lt;span class="n"&gt;cozinha&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Cômodo&lt;/span&gt; &lt;span class="n"&gt;sala&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Cômodo&lt;/span&gt; &lt;span class="n"&gt;quarto&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Construtor que cria os cômodos como parte da casa&lt;/span&gt;
    &lt;span class="nc"&gt;Casa&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cozinha&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;Cômodo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Cozinha"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sala&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;Cômodo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Sala"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;quarto&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;Cômodo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Quarto"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;mostrarCômodos&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Cômodos da casa: "&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cozinha&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNome&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sala&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNome&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quarto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNome&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// A Casa destrói automaticamente seus Cômodos quando a Casa é destruída.&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TesteComposicao&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Casa&lt;/span&gt; &lt;span class="n"&gt;casa&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;Casa&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;casa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mostrarCômodos&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="c1"&gt;// Se a casa for destruída, os cômodos também seriam.&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;h3&gt;
  
  
  Explicação:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;Casa&lt;/strong&gt; tem instâncias de &lt;strong&gt;Cômodo&lt;/strong&gt;. No exemplo acima, quando a instância de &lt;strong&gt;Casa&lt;/strong&gt; for destruída, os &lt;strong&gt;Cômodos&lt;/strong&gt; (cozinha, sala, quarto) também seriam destruídos, pois são componentes da &lt;strong&gt;Casa&lt;/strong&gt; e não existem independentemente.&lt;/li&gt;
&lt;li&gt;A relação entre &lt;strong&gt;Casa&lt;/strong&gt; e &lt;strong&gt;Cômodo&lt;/strong&gt; é uma &lt;strong&gt;composição forte&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. Agregação (Composição Fraca)
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;agregação&lt;/strong&gt; é uma forma de associação mais fraca em que o objeto "pai" pode conter objetos "filhos", mas esses objetos podem existir independentemente do "pai". Ou seja, se o objeto "pai" for destruído, os objetos "filhos" podem continuar existindo.&lt;/p&gt;

&lt;h4&gt;
  
  
  Características da Agregação:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Relacionamento mais fraco&lt;/strong&gt;: O objeto "pai" contém o objeto "filho", mas não é responsável por seu ciclo de vida.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Existência independente&lt;/strong&gt;: Os objetos "filhos" podem existir sem o objeto "pai".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exemplo&lt;/strong&gt;: Um &lt;strong&gt;departamento&lt;/strong&gt; e seus &lt;strong&gt;funcionários&lt;/strong&gt;. O departamento pode existir sem os funcionários, e os funcionários podem existir sem o departamento.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Exemplo de Agregação:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Funcionario&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nc"&gt;Funcionario&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&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="o"&gt;}&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;getNome&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="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Departamento&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Funcionario&lt;/span&gt; &lt;span class="n"&gt;funcionario&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nc"&gt;Departamento&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Funcionario&lt;/span&gt; &lt;span class="n"&gt;funcionario&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&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="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;funcionario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;funcionario&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;exibirInformacoes&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Departamento: "&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="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Funcionario: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;funcionario&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNome&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Mesmo que o Departamento seja destruído, o Funcionário pode continuar existindo.&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TesteAgregacao&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Funcionario&lt;/span&gt; &lt;span class="n"&gt;funcionario&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;Funcionario&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Maria"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Departamento&lt;/span&gt; &lt;span class="n"&gt;departamento&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;Departamento&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"RH"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;funcionario&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;departamento&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exibirInformacoes&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="c1"&gt;// O Departamento pode ser destruído, mas o Funcionário ainda existe.&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;h3&gt;
  
  
  Explicação:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;agregação&lt;/strong&gt; é uma associação mais fraca entre &lt;strong&gt;Departamento&lt;/strong&gt; e &lt;strong&gt;Funcionario&lt;/strong&gt;. Mesmo que o &lt;strong&gt;Departamento&lt;/strong&gt; seja destruído, o &lt;strong&gt;Funcionario&lt;/strong&gt; pode continuar existindo, já que ele é uma entidade independente.&lt;/li&gt;
&lt;li&gt;A relação entre &lt;strong&gt;Departamento&lt;/strong&gt; e &lt;strong&gt;Funcionario&lt;/strong&gt; é uma &lt;strong&gt;agregação&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. Multiplicidade
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;multiplicidade&lt;/strong&gt; descreve quantas instâncias de uma classe podem estar associadas a uma instância de outra classe. Ela indica o número de objetos que podem estar relacionados entre si.&lt;/p&gt;

&lt;h4&gt;
  
  
  Tipos de Multiplicidade:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1:1&lt;/strong&gt;: Um objeto de uma classe está relacionado a exatamente um objeto de outra classe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1:N&lt;/strong&gt;: Um objeto de uma classe pode estar relacionado a vários objetos de outra classe (um para muitos).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;N:M&lt;/strong&gt;: Vários objetos de uma classe podem estar relacionados a vários objetos de outra classe (muitos para muitos).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Exemplo de Multiplicidade 1:N:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Autor&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nc"&gt;Autor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&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="o"&gt;}&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;getNome&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="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Livro&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;titulo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Autor&lt;/span&gt; &lt;span class="n"&gt;autor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Um autor para muitos livros&lt;/span&gt;

    &lt;span class="nc"&gt;Livro&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;titulo&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Autor&lt;/span&gt; &lt;span class="n"&gt;autor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;titulo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;titulo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;autor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;autor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;exibirInformacoes&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Livro: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;titulo&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Autor: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;autor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNome&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TesteMultiplicidade&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Autor&lt;/span&gt; &lt;span class="n"&gt;autor&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;Autor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"J.K. Rowling"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Livro&lt;/span&gt; &lt;span class="n"&gt;livro1&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;Livro&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Harry Potter e a Pedra Filosofal"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;autor&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Livro&lt;/span&gt; &lt;span class="n"&gt;livro2&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;Livro&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Harry Potter e a Câmara Secreta"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;autor&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;livro1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exibirInformacoes&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;livro2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exibirInformacoes&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="c1"&gt;// Um autor pode escrever vários livros, mas cada livro tem exatamente um autor.&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;h3&gt;
  
  
  Explicação:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A relação entre &lt;strong&gt;Autor&lt;/strong&gt; e &lt;strong&gt;Livro&lt;/strong&gt; é de &lt;strong&gt;1:N&lt;/strong&gt;. Um &lt;strong&gt;Autor&lt;/strong&gt; pode escrever vários &lt;strong&gt;Livros&lt;/strong&gt;, mas cada &lt;strong&gt;Livro&lt;/strong&gt; tem exatamente um &lt;strong&gt;Autor&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Este tipo de associação é um exemplo de &lt;strong&gt;multiplicidade 1:N&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Exemplo de Multiplicidade N:M:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Estudante&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nc"&gt;Estudante&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&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="o"&gt;}&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;getNome&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="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Curso&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Estudante&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;estudantes&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;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;

    &lt;span class="nc"&gt;Curso&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&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="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;adicionarEstudante&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Estudante&lt;/span&gt; &lt;span class="n"&gt;estudante&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;estudantes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;estudante&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;exibirInformacoes&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Curso: "&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="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Estudante&lt;/span&gt; &lt;span class="n"&gt;estudante&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;estudantes&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Estudante: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;estudante&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNome&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TesteMultiplicidadeNM&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Estudante&lt;/span&gt; &lt;span class="n"&gt;estudante1&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;Estudante&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ana"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Estudante&lt;/span&gt; &lt;span class="n"&gt;estudante2&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;Estudante&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Carlos"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="nc"&gt;Curso&lt;/span&gt; &lt;span class="n"&gt;curso&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;Curso&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Matemática"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;curso&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;adicionarEstudante&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;estudante1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;curso&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;adicionarEstudante&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;estudante2&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;curso&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exibirInformacoes&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="c1"&gt;// Muitos estudantes podem estar matriculados em muitos cursos.&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;h3&gt;
  
  
  Explicação:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A relação entre &lt;strong&gt;Estudante&lt;/strong&gt; e &lt;strong&gt;Curso&lt;/strong&gt; é de &lt;strong&gt;N:M&lt;/strong&gt;. Muitos &lt;strong&gt;Estudantes&lt;/strong&gt; podem estar matriculados em muitos &lt;strong&gt;Cursos&lt;/strong&gt;, e um &lt;strong&gt;Curso&lt;/strong&gt; pode ter muitos &lt;strong&gt;Estudantes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;multiplicidade N:M&lt;/strong&gt; implica que o relacionamento é mais complexo, e frequentemente exigirá uma classe intermediária (como uma tabela de relacionamento em banco de dados).&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Composição&lt;/strong&gt;: Relacionamento forte, onde o ciclo de vida do objeto "filho" depende do objeto "pai". Se o objeto "pai" for destruído, o objeto "filho" também será.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agregação&lt;/strong&gt;: Relacionamento mais fraco, onde o objeto "pai" pode conter objetos "filhos", mas esses objetos podem existir independentemente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiplicidade&lt;/strong&gt;: Refere-se à quantidade de objetos de uma classe que podem ser associados a objetos de outra classe. Pode ser &lt;strong&gt;1:1&lt;/strong&gt;, &lt;strong&gt;1:N&lt;/strong&gt;, ou &lt;strong&gt;N:M&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Classe e Instância de Objetos em Java</title>
      <dc:creator>Emanoel Carvalho</dc:creator>
      <pubDate>Thu, 14 Nov 2024 01:31:22 +0000</pubDate>
      <link>https://dev.to/emanoelcarvalho/classe-e-instancia-de-objetos-em-java-6a6</link>
      <guid>https://dev.to/emanoelcarvalho/classe-e-instancia-de-objetos-em-java-6a6</guid>
      <description>&lt;p&gt;Em Java, uma &lt;strong&gt;classe&lt;/strong&gt; é um modelo ou um template para a criação de objetos. Ela define as propriedades (atributos) e comportamentos (métodos) de um objeto. Já uma &lt;strong&gt;instância de objeto&lt;/strong&gt; é a criação de um objeto a partir de uma classe. Em termos simples, a classe é o "plano de construção", e a instância é o "objeto construído".&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo de Classe e Instância
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Carro&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Método (Comportamento)&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ligar&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"O carro "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;modelo&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" está ligado."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TesteCarro&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Criando instâncias de objetos da classe Carro&lt;/span&gt;
        &lt;span class="nc"&gt;Carro&lt;/span&gt; &lt;span class="n"&gt;carro1&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;Carro&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;carro1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;modelo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Fusca"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;carro1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Azul"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

        &lt;span class="nc"&gt;Carro&lt;/span&gt; &lt;span class="n"&gt;carro2&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;Carro&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;carro2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;modelo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Civic"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;carro2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Preto"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// Chamando o método&lt;/span&gt;
        &lt;span class="n"&gt;carro1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ligar&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;carro2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ligar&lt;/span&gt;&lt;span class="o"&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;No exemplo acima, &lt;code&gt;Carro&lt;/code&gt; é a classe e &lt;code&gt;carro1&lt;/code&gt; e &lt;code&gt;carro2&lt;/code&gt; são instâncias de objetos criadas a partir dessa classe.&lt;/p&gt;




&lt;h1&gt;
  
  
  A Importância do Construtor em Java
&lt;/h1&gt;

&lt;p&gt;O &lt;strong&gt;construtor&lt;/strong&gt; é um tipo especial de método usado para inicializar objetos quando eles são criados. Ele tem o mesmo nome da classe e não retorna nada (nem mesmo &lt;code&gt;void&lt;/code&gt;). O construtor é chamado automaticamente quando um objeto é instanciado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tipos de Construtores em Java
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Construtor Implícito (ou Padrão)&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Quando não definimos explicitamente um construtor, o Java cria um construtor padrão para a classe, que não possui parâmetros e simplesmente inicializa os atributos com valores padrão (como &lt;code&gt;null&lt;/code&gt;, &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;false&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;#### Exemplo de Construtor Implícito:&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;class&lt;/span&gt; &lt;span class="nc"&gt;Carro&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
       &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
       &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

       &lt;span class="c1"&gt;// Construtor implícito gerado automaticamente pelo Java&lt;/span&gt;
       &lt;span class="c1"&gt;// Inicializa modelo e cor com os valores padrão (null)&lt;/span&gt;
   &lt;span class="o"&gt;}&lt;/span&gt;

   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TesteCarro&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
       &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
           &lt;span class="nc"&gt;Carro&lt;/span&gt; &lt;span class="n"&gt;carro&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;Carro&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Construtor implícito chamado&lt;/span&gt;
           &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Modelo: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;carro&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;modelo&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// null&lt;/span&gt;
           &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Cor: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;carro&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cor&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// null&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;ol&gt;
&lt;li&gt;
&lt;strong&gt;Construtor Explícito (ou Parametrizado)&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;O construtor explícito é definido pelo programador e pode ter parâmetros. Ele permite a inicialização dos atributos do objeto no momento da criação de sua instância.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;#### Exemplo de Construtor Explícito:&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;class&lt;/span&gt; &lt;span class="nc"&gt;Carro&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
       &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
       &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

       &lt;span class="c1"&gt;// Construtor explícito com parâmetros&lt;/span&gt;
       &lt;span class="nc"&gt;Carro&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
           &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;modelo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
           &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
       &lt;span class="o"&gt;}&lt;/span&gt;
   &lt;span class="o"&gt;}&lt;/span&gt;

   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TesteCarro&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
       &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
           &lt;span class="c1"&gt;// Utilizando o construtor explícito para inicializar o objeto&lt;/span&gt;
           &lt;span class="nc"&gt;Carro&lt;/span&gt; &lt;span class="n"&gt;carro&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;Carro&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Fusca"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Azul"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
           &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Modelo: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;carro&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;modelo&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Fusca&lt;/span&gt;
           &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Cor: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;carro&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cor&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Azul&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;h3&gt;
  
  
  Por que o Construtor é Importante?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inicialização de Objetos&lt;/strong&gt;: O construtor é essencial para inicializar corretamente os atributos de um objeto assim que ele é criado. Sem um construtor, o objeto seria criado com valores padrões que, muitas vezes, não são adequados ao contexto da aplicação.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Definição de Dependências&lt;/strong&gt;: Se uma classe depende de outras classes (relacionamentos entre objetos), o construtor é o local ideal para configurar essas dependências. O construtor garante que todos os objetos necessários para o funcionamento correto do objeto principal sejam fornecidos no momento da criação.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Importância do Construtor no Setup de Objetos e Definição de Dependências
&lt;/h1&gt;

&lt;h3&gt;
  
  
  Setup de Objetos
&lt;/h3&gt;

&lt;p&gt;O &lt;strong&gt;setup de objetos&lt;/strong&gt; refere-se ao processo de configurar corretamente um objeto no momento em que ele é criado. Isso pode envolver a inicialização de variáveis, a configuração de estados internos ou a execução de outras operações essenciais.&lt;/p&gt;

&lt;p&gt;Quando temos um construtor explícito, podemos garantir que a instância de um objeto será configurada corretamente desde o início, sem a necessidade de configurá-lo manualmente após a criação.&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplo de Setup de Objeto:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ContaBancaria&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;titular&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Construtor para definir o titular e saldo inicial&lt;/span&gt;
    &lt;span class="nc"&gt;ContaBancaria&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;titular&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;saldoInicial&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;titular&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;titular&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;saldo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;saldoInicial&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;exibirSaldo&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Titular: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;titular&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Saldo: R$ "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TesteContaBancaria&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Criando uma conta bancária com setup imediato&lt;/span&gt;
        &lt;span class="nc"&gt;ContaBancaria&lt;/span&gt; &lt;span class="n"&gt;conta&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;ContaBancaria&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Maria"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1500.0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;conta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exibirSaldo&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Exibe as informações configuradas pelo construtor&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;Nesse exemplo, o construtor configura o titular e o saldo da conta bancária assim que o objeto é criado, sem a necessidade de chamadas adicionais de métodos após a criação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Definição de Dependências
&lt;/h3&gt;

&lt;p&gt;Em sistemas mais complexos, um objeto pode depender de outros objetos para funcionar corretamente. O construtor é o local ideal para injetar essas dependências.&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplo de Definição de Dependências:
&lt;/h4&gt;

&lt;p&gt;Imagine um sistema de gerenciamento de pedidos onde um objeto &lt;code&gt;Pedido&lt;/code&gt; depende de um objeto &lt;code&gt;Produto&lt;/code&gt;. Podemos definir essa dependência através do construtor.&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;class&lt;/span&gt; &lt;span class="nc"&gt;Produto&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;preco&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nc"&gt;Produto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;preco&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&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="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;preco&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;preco&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pedido&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Produto&lt;/span&gt; &lt;span class="n"&gt;produto&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;quantidade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Construtor do Pedido recebe um Produto como dependência&lt;/span&gt;
    &lt;span class="nc"&gt;Pedido&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Produto&lt;/span&gt; &lt;span class="n"&gt;produto&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;quantidade&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;produto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;produto&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;quantidade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;quantidade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;exibirPedido&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Produto: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;produto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Quantidade: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;quantidade&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Preço Total: R$ "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;produto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;preco&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;quantidade&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestePedido&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Criando um produto&lt;/span&gt;
        &lt;span class="nc"&gt;Produto&lt;/span&gt; &lt;span class="n"&gt;produto&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;Produto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Smartphone"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1200.00&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Criando um pedido, injetando o produto como dependência&lt;/span&gt;
        &lt;span class="nc"&gt;Pedido&lt;/span&gt; &lt;span class="n"&gt;pedido&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;Pedido&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;produto&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;pedido&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exibirPedido&lt;/span&gt;&lt;span class="o"&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;No exemplo acima, a classe &lt;code&gt;Pedido&lt;/code&gt; tem uma dependência da classe &lt;code&gt;Produto&lt;/code&gt;. O construtor de &lt;code&gt;Pedido&lt;/code&gt; recebe o &lt;code&gt;Produto&lt;/code&gt; como parâmetro, garantindo que o pedido seja sempre criado com um produto válido.&lt;/p&gt;




&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;p&gt;O construtor é uma parte fundamental da criação e configuração de objetos em Java. Ele permite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A inicialização de atributos de maneira adequada.&lt;/li&gt;
&lt;li&gt;O setup correto de objetos, evitando erros de configuração.&lt;/li&gt;
&lt;li&gt;A definição de dependências entre objetos, o que é especialmente importante em sistemas mais complexos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A distinção entre construtores implícitos e explícitos também é importante, pois permite o controle total sobre o processo de criação e configuração dos objetos, fornecendo mais flexibilidade e controle sobre como as instâncias são geradas.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Propriedades e Comportamento de Objetos em Java</title>
      <dc:creator>Emanoel Carvalho</dc:creator>
      <pubDate>Thu, 14 Nov 2024 01:30:26 +0000</pubDate>
      <link>https://dev.to/emanoelcarvalho/propriedades-e-comportamento-de-objetos-em-java-4p5a</link>
      <guid>https://dev.to/emanoelcarvalho/propriedades-e-comportamento-de-objetos-em-java-4p5a</guid>
      <description>&lt;p&gt;Em programação orientada a objetos (POO), o conceito de &lt;strong&gt;propriedades&lt;/strong&gt; e &lt;strong&gt;comportamentos&lt;/strong&gt; é essencial para entender como objetos são modelados e manipulados. As &lt;strong&gt;propriedades&lt;/strong&gt; de um objeto definem seu &lt;strong&gt;estado&lt;/strong&gt;, enquanto os &lt;strong&gt;comportamentos&lt;/strong&gt; são as ações que ele pode realizar.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Propriedades (Estado do Objeto)
&lt;/h2&gt;

&lt;p&gt;As &lt;strong&gt;propriedades&lt;/strong&gt; de um objeto, ou &lt;strong&gt;atributos&lt;/strong&gt; (também chamados de campos ou variáveis de instância), são características que representam o estado do objeto. O estado é a combinação dos valores atribuídos aos atributos, e esse estado pode variar ao longo da execução do programa.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo de Propriedades (Estado de um Objeto):
&lt;/h3&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Carro&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Atributos (propriedades) do objeto&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cor&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;ano&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;velocidadeAtual&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Método para acelerar&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;acelerar&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;velocidadeAtual&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Acelerando... Velocidade atual: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;velocidadeAtual&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" km/h"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Método para parar&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;parar&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;velocidadeAtual&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"O carro parou."&lt;/span&gt;&lt;span class="o"&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;h3&gt;
  
  
  Explicação:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Propriedades/Estado&lt;/strong&gt;: O estado do objeto &lt;code&gt;carro&lt;/code&gt; é definido pelos atributos &lt;code&gt;modelo&lt;/code&gt;, &lt;code&gt;cor&lt;/code&gt;, &lt;code&gt;ano&lt;/code&gt; e &lt;code&gt;velocidadeAtual&lt;/code&gt;. Esses atributos mantêm informações sobre o objeto, como o modelo do carro, sua cor, o ano de fabricação e a velocidade atual.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Métodos/Comportamento&lt;/strong&gt;: Os métodos &lt;code&gt;acelerar&lt;/code&gt; e &lt;code&gt;parar&lt;/code&gt; são comportamentos que alteram o estado do objeto, modificando o valor de &lt;code&gt;velocidadeAtual&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Comportamento de Objetos (Métodos)
&lt;/h2&gt;

&lt;p&gt;Em Java, os &lt;strong&gt;métodos&lt;/strong&gt; são funções associadas a uma classe ou objeto e são responsáveis por definir o comportamento de um objeto. Eles permitem que o objeto interaja com seu estado ou com outros objetos, realizando ações ou retornando valores.&lt;/p&gt;

&lt;h3&gt;
  
  
  Métodos de Instância e Estáticos
&lt;/h3&gt;

&lt;p&gt;Existem dois tipos de métodos em Java:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Métodos de Instância&lt;/strong&gt;: São métodos que operam sobre os atributos de uma instância específica da classe (ou seja, de um objeto). Eles precisam de uma instância do objeto para serem chamados.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Calculadora&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Método de instância&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;somar&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;a&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;b&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="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&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;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Métodos Estáticos&lt;/strong&gt;: São métodos que pertencem à classe e não a uma instância específica. Eles podem ser chamados sem a necessidade de criar um objeto da classe. Métodos estáticos operam apenas em variáveis estáticas da classe, ou seja, variáveis que são compartilhadas por todas as instâncias da classe.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Calculadora&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Método estático&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;somarEstatica&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;a&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;b&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="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&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;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Exemplo de Métodos e Comportamento:
&lt;/h3&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ContaBancaria&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Propriedades (estado)&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;titular&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Construtor&lt;/span&gt;
    &lt;span class="nc"&gt;ContaBancaria&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;titular&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;saldoInicial&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;titular&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;titular&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;saldo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;saldoInicial&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Método para depositar dinheiro&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;depositar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;saldo&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Depósito de R$ "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" realizado. Saldo atual: R$ "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Valor de depósito inválido."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Método para sacar dinheiro&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;sacar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;saldo&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Saque de R$ "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" realizado. Saldo atual: R$ "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Saldo insuficiente."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Método para exibir saldo&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;exibirSaldo&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Saldo da conta de "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;titular&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;": R$ "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;saldo&lt;/span&gt;&lt;span class="o"&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;h3&gt;
  
  
  Explicação:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Métodos de Instância&lt;/strong&gt;: &lt;code&gt;depositar&lt;/code&gt;, &lt;code&gt;sacar&lt;/code&gt; e &lt;code&gt;exibirSaldo&lt;/code&gt; são métodos de instância, que alteram ou acessam os atributos específicos de cada objeto da classe &lt;code&gt;ContaBancaria&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Método Estático&lt;/strong&gt;: O método &lt;code&gt;somarEstatica&lt;/code&gt; poderia ser chamado sem a criação de um objeto &lt;code&gt;Calculadora&lt;/code&gt;, utilizando apenas a classe, por exemplo, &lt;code&gt;Calculadora.somarEstatica(2, 3)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. A Relação entre Estado e Comportamento
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;estado&lt;/strong&gt; de um objeto é alterado pelos &lt;strong&gt;comportamentos&lt;/strong&gt; definidos por seus métodos. Esses métodos podem modificar diretamente os atributos do objeto, ou seja, o comportamento de um objeto influencia diretamente seu estado.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. JavaScript também é Orientado a Objetos
&lt;/h2&gt;

&lt;p&gt;Embora JavaScript seja uma linguagem &lt;strong&gt;multiparadigma&lt;/strong&gt;, ela também suporta o paradigma orientado a objetos. Isso significa que, assim como em Java, podemos definir &lt;strong&gt;objetos&lt;/strong&gt; com propriedades e comportamentos. No entanto, em JavaScript, a criação de objetos e a definição de métodos podem ser feitas de maneira mais flexível.&lt;/p&gt;

&lt;p&gt;Em JavaScript, a orientação a objetos é implementada de maneira baseada em protótipos, ao invés de classes, como em Java. No entanto, desde a introdução das &lt;strong&gt;classes&lt;/strong&gt; em ES6, JavaScript permite uma sintaxe mais similar à de linguagens orientadas a objetos clássicas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo em JavaScript:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Carro&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;modelo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ano&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modelo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;modelo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ano&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ano&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;velocidadeAtual&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;acelerar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;velocidadeAtual&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Acelerando... Velocidade atual: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;velocidadeAtual&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; km/h`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;parar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;velocidadeAtual&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;O carro parou.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;carro&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;Carro&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Fusca&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Azul&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1980&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;carro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;acelerar&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;carro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parar&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, o comportamento de um objeto &lt;code&gt;Carro&lt;/code&gt; é definido pelos métodos &lt;code&gt;acelerar&lt;/code&gt; e &lt;code&gt;parar&lt;/code&gt;, que alteram o estado do objeto (&lt;code&gt;velocidadeAtual&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Encapsulamento
&lt;/h2&gt;

&lt;p&gt;Em Java, o conceito de &lt;strong&gt;encapsulamento&lt;/strong&gt; envolve esconder os detalhes internos de implementação de um objeto, permitindo acesso aos seus atributos apenas por meio de métodos públicos. Isso é feito com o uso de &lt;strong&gt;modificadores de acesso&lt;/strong&gt;, como &lt;code&gt;private&lt;/code&gt;, &lt;code&gt;protected&lt;/code&gt; e &lt;code&gt;public&lt;/code&gt;, que controlam a visibilidade e a modificação dos atributos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo de Encapsulamento:
&lt;/h3&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Carro&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ano&lt;/span&gt;&lt;span class="o"&gt;;&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;getModelo&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="n"&gt;modelo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setModelo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;modelo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;acelerar&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Acelerando o "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="o"&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;Aqui, os atributos &lt;code&gt;modelo&lt;/code&gt;, &lt;code&gt;cor&lt;/code&gt; e &lt;code&gt;ano&lt;/code&gt; estão &lt;strong&gt;encapsulados&lt;/strong&gt; com o modificador &lt;code&gt;private&lt;/code&gt;, o que significa que não podem ser acessados diretamente fora da classe &lt;code&gt;Carro&lt;/code&gt;. A modificação do atributo &lt;code&gt;modelo&lt;/code&gt; deve ser feita através do método &lt;code&gt;setModelo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para mais detalhes sobre &lt;strong&gt;modificadores de acesso&lt;/strong&gt; e &lt;strong&gt;encapsulamento&lt;/strong&gt;, consulte &lt;a href="https://dev.to/emanoelcarvalho/encapsulamento-em-programacao-orientada-a-objetos-3nf5"&gt;este artigo sobre modificadores de acesso&lt;/a&gt; explicará de uma maneira mais elaborada sobre este pilar da orientação a objetos.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Propriedades (Estado)&lt;/strong&gt;: São os atributos de um objeto, que definem as características e condições do objeto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comportamento (Métodos)&lt;/strong&gt;: São as ações que um objeto pode realizar. Métodos de instância operam sobre o estado do objeto, enquanto métodos estáticos pertencem à classe e não a uma instância específica.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encapsulamento&lt;/strong&gt;: É a prática de restringir o acesso aos atributos de um objeto, permitindo que a manipulação de seu estado seja feita de forma controlada.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Objetos Mutáveis e Imutáveis em Java</title>
      <dc:creator>Emanoel Carvalho</dc:creator>
      <pubDate>Thu, 14 Nov 2024 01:29:36 +0000</pubDate>
      <link>https://dev.to/emanoelcarvalho/objetos-mutaveis-e-imutaveis-em-java-1omp</link>
      <guid>https://dev.to/emanoelcarvalho/objetos-mutaveis-e-imutaveis-em-java-1omp</guid>
      <description>&lt;p&gt;Em Java, a mutabilidade de um objeto está relacionada à capacidade de alterar o seu estado (valores dos atributos) após a sua criação. Objetos &lt;strong&gt;mutáveis&lt;/strong&gt; podem ter seus estados alterados ao longo do tempo, enquanto objetos &lt;strong&gt;imutáveis&lt;/strong&gt; têm um estado fixo que não pode ser alterado depois que o objeto é criado.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Objetos Mutáveis
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Objetos mutáveis&lt;/strong&gt; são aqueles cujo estado (valores dos atributos) pode ser modificado após sua criação. Isso significa que, depois de criar um objeto mutável, você pode modificar seus atributos diretamente, ou por meio de métodos, se a classe permitir.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo de Objeto Mutável:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Carro&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Atributos mutáveis&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cor&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;ano&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;velocidadeAtual&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Construtor para inicializar o objeto&lt;/span&gt;
    &lt;span class="nc"&gt;Carro&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cor&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;ano&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;modelo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ano&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ano&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;velocidadeAtual&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Inicializando a velocidade&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Método para acelerar&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;acelerar&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;velocidadeAtual&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Acelerando... Velocidade atual: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;velocidadeAtual&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" km/h"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Método para mudar a cor&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;mudarCor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;novaCor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;cor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;novaCor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"A nova cor do carro é: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;cor&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TesteCarroMutavel&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Criando um objeto mutável&lt;/span&gt;
        &lt;span class="nc"&gt;Carro&lt;/span&gt; &lt;span class="n"&gt;carro&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;Carro&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Fusca"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Azul"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1980&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Exibindo estado inicial&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Cor inicial do carro: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;carro&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cor&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Alterando o estado do objeto&lt;/span&gt;
        &lt;span class="n"&gt;carro&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;acelerar&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;carro&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mudarCor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Vermelho"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Mudando o estado (atributo) do objeto&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;h3&gt;
  
  
  Explicação:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Objeto Mutável&lt;/strong&gt;: O objeto &lt;code&gt;carro&lt;/code&gt; é mutável porque seus atributos, como &lt;code&gt;cor&lt;/code&gt; e &lt;code&gt;velocidadeAtual&lt;/code&gt;, podem ser alterados depois de sua criação. O método &lt;code&gt;mudarCor&lt;/code&gt; permite alterar o valor do atributo &lt;code&gt;cor&lt;/code&gt;, e o método &lt;code&gt;acelerar&lt;/code&gt; modifica o atributo &lt;code&gt;velocidadeAtual&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alterações no Estado&lt;/strong&gt;: O estado do objeto pode ser modificado diretamente após a criação, refletindo o comportamento mutável.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Objetos Imutáveis
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Objetos imutáveis&lt;/strong&gt; são aqueles cujo estado não pode ser alterado depois de sua criação. Uma vez que os valores dos atributos são definidos, não é possível modificá-los diretamente ou por meio de métodos. Objetos imutáveis são frequentemente usados para garantir a segurança e a integridade dos dados, já que o estado do objeto não pode ser alterado de forma inesperada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo de Objeto Imutável:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CarroImutavel&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Atributos imutáveis&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ano&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Construtor para inicializar o objeto&lt;/span&gt;
    &lt;span class="nc"&gt;CarroImutavel&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cor&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;ano&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;modelo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ano&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ano&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Métodos getters para acessar os valores (sem setters)&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;getModelo&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="n"&gt;modelo&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&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;getCor&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="n"&gt;cor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&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;getAno&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="n"&gt;ano&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TesteCarroImutavel&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Criando um objeto imutável&lt;/span&gt;
        &lt;span class="nc"&gt;CarroImutavel&lt;/span&gt; &lt;span class="n"&gt;carro&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;CarroImutavel&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Fusca"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Azul"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1980&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Exibindo os valores dos atributos&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Modelo do carro: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;carro&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getModelo&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Cor do carro: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;carro&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCor&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Ano do carro: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;carro&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAno&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;

        &lt;span class="c1"&gt;// Não podemos alterar os atributos diretamente&lt;/span&gt;
        &lt;span class="c1"&gt;// carro.cor = "Vermelho";  // Erro: atributo final&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;h3&gt;
  
  
  Explicação:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Objeto Imutável&lt;/strong&gt;: O objeto &lt;code&gt;carro&lt;/code&gt; é imutável porque seus atributos são declarados como &lt;code&gt;final&lt;/code&gt; e não há métodos que permitem modificá-los após a criação do objeto. Uma vez que o objeto é construído, seus valores são fixos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Segurança e Integridade&lt;/strong&gt;: O uso de atributos &lt;code&gt;final&lt;/code&gt; e a ausência de métodos modificadores (setters) garantem que o estado do objeto não seja alterado. Isso é especialmente útil quando você precisa de segurança em relação ao estado de objetos compartilhados em sistemas concorrentes ou quando deseja garantir que certos dados não sejam modificados.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Diferenças Entre Objetos Mutáveis e Imutáveis
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Objetos Mutáveis
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Estado&lt;/strong&gt;: O estado do objeto pode ser alterado após a criação.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uso&lt;/strong&gt;: Útil quando você precisa modificar o estado de um objeto ao longo do tempo, como em uma conta bancária ou em um jogo, onde o estado de um objeto (como a posição de um jogador ou o saldo de uma conta) muda frequentemente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exemplo&lt;/strong&gt;: A classe &lt;code&gt;Carro&lt;/code&gt; do exemplo acima é mutável, já que podemos mudar a cor e a velocidade do carro após a criação.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Objetos Imutáveis
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Estado&lt;/strong&gt;: O estado do objeto não pode ser alterado depois de sua criação.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uso&lt;/strong&gt;: Útil quando você deseja garantir que o estado do objeto seja seguro, consistente e não seja alterado acidentalmente. Isso é importante, por exemplo, em sistemas financeiros ou em dados compartilhados entre múltiplas threads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exemplo&lt;/strong&gt;: A classe &lt;code&gt;CarroImutavel&lt;/code&gt; no exemplo acima é imutável, já que não podemos modificar o modelo, a cor ou o ano do carro após sua criação.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Vantagens de Usar Objetos Imutáveis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Segurança&lt;/strong&gt;: Objetos imutáveis são naturalmente mais seguros, pois seu estado não pode ser alterado por outras partes do programa.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Concorrência&lt;/strong&gt;: Eles são mais seguros em sistemas multithreaded, já que não há risco de mudanças inesperadas no estado do objeto por diferentes threads ao mesmo tempo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Previsibilidade&lt;/strong&gt;: Como o estado do objeto não muda, você pode ter uma maior certeza sobre os valores que o objeto possui, o que torna o comportamento mais previsível.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Exemplo de Classe Imutável Usando a Classe &lt;code&gt;String&lt;/code&gt;:
&lt;/h3&gt;

&lt;p&gt;A classe &lt;code&gt;String&lt;/code&gt; em Java é um exemplo clássico de &lt;strong&gt;objeto imutável&lt;/strong&gt;. Depois de uma &lt;code&gt;String&lt;/code&gt; ser criada, seu valor não pode ser alterado.&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExemploString&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Olá"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Texto original: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Tentando modificar o texto (não é possível)&lt;/span&gt;
        &lt;span class="n"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;concat&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;", Mundo!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Cria um novo objeto String&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Texto modificado: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// A string original "Olá" não foi modificada&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;h3&gt;
  
  
  Explicação:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A classe &lt;code&gt;String&lt;/code&gt; é imutável em Java. No exemplo acima, quando tentamos adicionar ", Mundo!" ao texto original, o método &lt;code&gt;concat&lt;/code&gt; cria uma nova string com o valor concatenado, mas o objeto original &lt;code&gt;texto&lt;/code&gt; não é alterado.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Objetos Mutáveis&lt;/strong&gt;: São objetos cujo estado pode ser alterado após sua criação. Eles são úteis em situações em que o estado de um objeto precisa mudar ao longo do tempo, mas podem ser propensos a erros em sistemas complexos, especialmente quando o estado pode ser alterado de forma inesperada.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Objetos Imutáveis&lt;/strong&gt;: São objetos cujo estado é definido uma vez no momento da criação e não pode ser alterado. Eles são úteis para garantir segurança, consistência e previsibilidade, especialmente em ambientes concorrentes ou quando a integridade dos dados precisa ser protegida.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;O uso de &lt;strong&gt;objetos imutáveis&lt;/strong&gt; pode aumentar a segurança e reduzir a complexidade do código, enquanto &lt;strong&gt;objetos mutáveis&lt;/strong&gt; oferecem maior flexibilidade quando as mudanças de estado são necessárias.&lt;/p&gt;

&lt;p&gt;Compreender quando usar objetos mutáveis ou imutáveis é uma habilidade importante para criar sistemas mais seguros e eficientes.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Entendendo Variáveis por Valor e por Referência em Java</title>
      <dc:creator>Emanoel Carvalho</dc:creator>
      <pubDate>Fri, 08 Nov 2024 23:49:50 +0000</pubDate>
      <link>https://dev.to/emanoelcarvalho/entendendo-variaveis-por-valor-e-por-referencia-em-java-3hah</link>
      <guid>https://dev.to/emanoelcarvalho/entendendo-variaveis-por-valor-e-por-referencia-em-java-3hah</guid>
      <description>&lt;p&gt;Em Java, entender como as variáveis são passadas para os métodos é crucial para escrever código eficiente e evitar bugs. A linguagem utiliza dois conceitos principais para manipulação de variáveis: &lt;strong&gt;passagem por valor&lt;/strong&gt; e &lt;strong&gt;passagem por referência&lt;/strong&gt;. Além disso, a forma como objetos são comparados, instanciados e manipulados também desempenha um papel importante na compreensão dos comportamentos de variáveis e objetos. Neste artigo, vamos abordar esses conceitos de forma detalhada e explorar aspectos adicionais, como comparação de objetos, implementação de &lt;code&gt;equals&lt;/code&gt; e &lt;code&gt;hashCode&lt;/code&gt;, além de diferenças no comportamento de tipos imutáveis como &lt;code&gt;String&lt;/code&gt; e &lt;code&gt;Integer&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passagem por Valor
&lt;/h3&gt;

&lt;p&gt;Em Java, &lt;strong&gt;passagem por valor&lt;/strong&gt; significa que o valor da variável é copiado para o parâmetro do método. Esse comportamento ocorre com &lt;strong&gt;tipos primitivos&lt;/strong&gt; (como &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;float&lt;/code&gt;, &lt;code&gt;boolean&lt;/code&gt;, etc.), onde qualquer modificação do parâmetro dentro do método não afeta a variável original.&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplo de Passagem por Valor
&lt;/h4&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PassagemPorValor&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&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;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Antes: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;modificarValor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Depois: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;modificarValor&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;a&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="o"&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;&lt;strong&gt;Saída:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Antes: 10
Depois: 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, &lt;code&gt;x&lt;/code&gt; é passado para o método &lt;code&gt;modificarValor()&lt;/code&gt;, mas, como &lt;code&gt;x&lt;/code&gt; é um tipo primitivo, a modificação de &lt;code&gt;a&lt;/code&gt; dentro do método não altera o valor de &lt;code&gt;x&lt;/code&gt; fora dele.&lt;/p&gt;

&lt;h3&gt;
  
  
  Passagem por Referência
&lt;/h3&gt;

&lt;p&gt;Ao contrário da passagem por valor, a &lt;strong&gt;passagem por referência&lt;/strong&gt; ocorre com objetos. Quando você passa uma variável de objeto para um método, o que é realmente passado é a referência para o objeto, não o objeto em si. Isso significa que, se o objeto for modificado dentro do método, a alteração será refletida fora dele, pois ambos os locais (o original e o parâmetro) estão apontando para o mesmo objeto na memória.&lt;/p&gt;

&lt;p&gt;Em Java, a passagem por referência ocorre com &lt;strong&gt;tipos não primitivos&lt;/strong&gt;, como instâncias de classes, arrays e outros objetos.&lt;/p&gt;

&lt;h4&gt;
  
  
  Exemplo de Passagem por Referência
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.ArrayList&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PassagemPorReferencia&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;lista&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;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
        &lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Antes: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;modificarLista&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Depois: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;modificarLista&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="o"&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;&lt;strong&gt;Saída:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Antes: [10]
Depois: [10, 20]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, a variável &lt;code&gt;lista&lt;/code&gt; é passada para o método &lt;code&gt;modificarLista()&lt;/code&gt;. Como &lt;code&gt;lista&lt;/code&gt; é um objeto, a modificação do conteúdo do objeto dentro do método afeta a lista original.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comparação de Objetos: &lt;code&gt;==&lt;/code&gt; vs &lt;code&gt;equals()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Quando comparamos objetos em Java, é importante entender como a comparação é realizada. A comparação de objetos pode ser feita de duas maneiras:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Usando o operador &lt;code&gt;==&lt;/code&gt;&lt;/strong&gt;: Este operador compara se duas variáveis de objetos referenciam o mesmo local de memória, ou seja, se são o &lt;strong&gt;mesmo objeto&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Usando o método &lt;code&gt;equals()&lt;/code&gt;&lt;/strong&gt;: O método &lt;code&gt;equals()&lt;/code&gt; compara o conteúdo de dois objetos, ou seja, se os dois objetos são &lt;strong&gt;equivalentes&lt;/strong&gt; em termos de estado (não necessariamente o mesmo objeto na memória).&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Exemplo de Comparação de Objetos com &lt;code&gt;==&lt;/code&gt; e &lt;code&gt;equals()&lt;/code&gt;
&lt;/h4&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ComparacaoObjetos&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;a&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;String&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;b&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;String&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// false - compara se são o mesmo objeto&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// true - compara o conteúdo dos objetos&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;Saída:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;false
true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo, &lt;code&gt;a == b&lt;/code&gt; retorna &lt;code&gt;false&lt;/code&gt; porque os objetos &lt;code&gt;a&lt;/code&gt; e &lt;code&gt;b&lt;/code&gt; não são o mesmo objeto na memória, embora seus conteúdos sejam iguais. Por outro lado, &lt;code&gt;a.equals(b)&lt;/code&gt; retorna &lt;code&gt;true&lt;/code&gt;, porque o método &lt;code&gt;equals()&lt;/code&gt; verifica a equivalência do conteúdo das strings.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Implementação de &lt;code&gt;equals()&lt;/code&gt; e &lt;code&gt;hashCode()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Quando se trabalha com objetos em Java, especialmente em coleções como &lt;code&gt;HashMap&lt;/code&gt; ou &lt;code&gt;HashSet&lt;/code&gt;, é fundamental que as classes implementem corretamente os métodos &lt;code&gt;equals()&lt;/code&gt; e &lt;code&gt;hashCode()&lt;/code&gt;. O contrato entre esses métodos estipula que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Se dois objetos são considerados iguais pelo método &lt;code&gt;equals()&lt;/code&gt;&lt;/strong&gt;, eles &lt;strong&gt;devem ter o mesmo valor de &lt;code&gt;hashCode()&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Se dois objetos têm o mesmo &lt;code&gt;hashCode()&lt;/code&gt;, isso não implica que sejam iguais, mas se forem iguais, terão o mesmo &lt;code&gt;hashCode()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Exemplo de Implementação de &lt;code&gt;equals()&lt;/code&gt; e &lt;code&gt;hashCode()&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.Objects&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Pessoa&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&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;idade&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&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="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;getClass&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getClass&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="n"&gt;pessoa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Pessoa&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;obj&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;idade&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;pessoa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&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;equals&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;pessoa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&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;idade&lt;/span&gt;&lt;span class="o"&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;h3&gt;
  
  
  Comparação de Strings e Tipos Imutáveis
&lt;/h3&gt;

&lt;p&gt;Em Java, tipos como &lt;strong&gt;&lt;code&gt;String&lt;/code&gt;&lt;/strong&gt; e &lt;strong&gt;&lt;code&gt;Integer&lt;/code&gt;&lt;/strong&gt; são &lt;strong&gt;imutáveis&lt;/strong&gt;. Isso significa que, uma vez que um objeto desse tipo é criado, seu estado não pode ser alterado. Isso tem um impacto direto na forma como esses objetos são manipulados e comparados.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;String Pool&lt;/strong&gt;: Quando você cria uma string em Java, usando uma atribuição simples como &lt;code&gt;String a = "Hello";&lt;/code&gt;, ela é armazenada em uma área especial da memória chamada &lt;strong&gt;String Pool&lt;/strong&gt;. Isso significa que se outra string &lt;code&gt;"Hello"&lt;/code&gt; for criada, a variável irá referenciar o mesmo objeto de string, economizando memória.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instanciação de String e Integer sem Construtor&lt;/strong&gt;: Em Java, as classes &lt;strong&gt;&lt;code&gt;String&lt;/code&gt;&lt;/strong&gt; e &lt;strong&gt;&lt;code&gt;Integer&lt;/code&gt;&lt;/strong&gt; não utilizam construtores diretamente para instanciar objetos. A razão disso é que o Java tem mecanismos especiais (como o &lt;strong&gt;String Pool&lt;/strong&gt; para &lt;code&gt;String&lt;/code&gt; e o &lt;strong&gt;cache de valores&lt;/strong&gt; para &lt;code&gt;Integer&lt;/code&gt;) que ajudam a otimizar a criação e a comparação de objetos dessas classes.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Exemplo de String Pool
&lt;/h4&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;StringPool&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true - ambos apontam para o mesmo objeto no String Pool&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;h3&gt;
  
  
  Considerações Finais sobre Passagem de Variáveis
&lt;/h3&gt;

&lt;p&gt;Em Java, a diferença entre &lt;strong&gt;passagem por valor&lt;/strong&gt; e &lt;strong&gt;passagem por referência&lt;/strong&gt; pode ter um impacto significativo no comportamento do seu código, especialmente ao lidar com objetos mutáveis e imutáveis. Compreender como a &lt;strong&gt;referência de objetos&lt;/strong&gt; funciona e como comparar objetos corretamente usando &lt;code&gt;==&lt;/code&gt; e &lt;code&gt;equals()&lt;/code&gt; ajudará você a evitar erros sutis e a escrever código mais eficiente e previsível.&lt;/p&gt;

&lt;p&gt;Além disso, a compreensão das classes imutáveis, como &lt;code&gt;String&lt;/code&gt;, e o funcionamento do &lt;strong&gt;String Pool&lt;/strong&gt; são essenciais para otimizar o uso de memória e melhorar a performance de seu código.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
