<?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>Forem: Adilson Oliveira</title>
    <description>The latest articles on Forem by Adilson Oliveira (@adilsonoj).</description>
    <link>https://forem.com/adilsonoj</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%2F378428%2Fc6ef8a9b-c76d-464a-a72f-df93acb91da0.jpeg</url>
      <title>Forem: Adilson Oliveira</title>
      <link>https://forem.com/adilsonoj</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/adilsonoj"/>
    <language>en</language>
    <item>
      <title>Docker Multi-Stage para Aplicações JAVA 21</title>
      <dc:creator>Adilson Oliveira</dc:creator>
      <pubDate>Tue, 11 Jun 2024 15:53:52 +0000</pubDate>
      <link>https://forem.com/adilsonoj/docker-multi-stage-para-aplicacoes-java-21-2n02</link>
      <guid>https://forem.com/adilsonoj/docker-multi-stage-para-aplicacoes-java-21-2n02</guid>
      <description>&lt;p&gt;Para criar um Dockerfile com dois estágios para uma aplicação Java 21, você pode seguir um processo de multi-stage build. Isso ajuda a &lt;strong&gt;reduzir o tamanho da imagem final&lt;/strong&gt; e garante que apenas os artefatos necessários sejam incluídos na imagem final de execução. Vamos seguir um exemplo com 2 estágios:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Primeiro estágio (build)&lt;/strong&gt;: Compilar a aplicação usando uma imagem que tenha o &lt;strong&gt;JDK 21&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Segundo estágio (runtime)&lt;/strong&gt;: Criar uma imagem mais leve &lt;strong&gt;apenas com o JRE&lt;/strong&gt; para rodar a aplicação.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Estrutura do projeto
&lt;/h2&gt;

&lt;p&gt;Deixei um projeto bem simples, feito em Spring Boot 3.3.0 que você pode baixar no meu &lt;a href="https://github.com/adilsonoj/java-docker-demo"&gt;github&lt;/a&gt;, que iremos seguir como exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/meu-projeto
|-- src
|   `-- main
|       `-- java
|           `-- com
|               `-- exemplo
|                   `-- DemoApplication.java
|                   `-- HelloWorldController.java
|-- pom.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Exemplo de Dockerfile
&lt;/h2&gt;

&lt;p&gt;Se você baixar o projeto de exemplo, o Dockerfile já existe e você pode apenas acompanhar o artigo, caso esteja com no seu projeto crie um arquivo chamado Dockerfile na raiz do seu projeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Etapa 1: Compilar a aplicação&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;maven:3.9.7-eclipse-temurin-21-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;build&lt;/span&gt;

&lt;span class="c"&gt;# Define o diretório de trabalho dentro do contêiner&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="c"&gt;# Copia o arquivo pom.xml e os arquivos de dependências para o diretório de trabalho&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; pom.xml ./&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; src ./src&lt;/span&gt;

&lt;span class="c"&gt;# Compila a aplicação&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;mvn package

&lt;span class="c"&gt;# Etapa 2: Criar a imagem final para execução&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; eclipse-temurin:21-jre-alpine&lt;/span&gt;

&lt;span class="c"&gt;# Define o diretório de trabalho dentro do contêiner&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="c"&gt;# Cria um argumento para o nome da aplicação&lt;/span&gt;
&lt;span class="k"&gt;ARG&lt;/span&gt;&lt;span class="s"&gt; JAR_FILE=target/*.jar&lt;/span&gt;

&lt;span class="c"&gt;# Copia o jar compilado da etapa anterior&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=build /app/${JAR_FILE} app.jar&lt;/span&gt;

&lt;span class="c"&gt;# Expõe a porta da aplicação&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8080&lt;/span&gt;

&lt;span class="c"&gt;# Define o comando padrão para rodar a aplicação&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["java", "-jar", "app.jar"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Explicação do Dockerfile
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Primeiro estágio (build):&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;FROM maven:3.9.7-eclipse-temurin-21-alpine AS build&lt;/code&gt;: Usa uma imagem oficial do Maven base no Eclipse Temurin JDK 21 para compilar a aplicação.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;WORKDIR /app&lt;/code&gt;: Define &lt;code&gt;/app&lt;/code&gt; como o diretório de trabalho.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;COPY pom.xml ./&lt;/code&gt; e &lt;code&gt;COPY src ./src&lt;/code&gt;: Copia os arquivos do projeto para dentro do contêiner.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RUN mvn package&lt;/code&gt;: Compila e cria o artefato da aplicação usando Maven.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Segundo estágio (runtime):&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;FROM eclipse-temurin:21-jre-alpine&lt;/code&gt;: Usa uma imagem oficial do Eclipse Temurin JRE 21 para executar a aplicação, resultando em uma imagem mais leve.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;WORKDIR /app&lt;/code&gt;: Define &lt;code&gt;/app&lt;/code&gt; como o diretório de trabalho.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;COPY --from=build /app/target/minha-aplicacao.jar ./minha-aplicacao.jar&lt;/code&gt;: Copia o arquivo JAR compilado da etapa anterior para o diretório de trabalho.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CMD ["java", "-jar", "minha-aplicacao.jar"]&lt;/code&gt;: Define o comando padrão para executar a aplicação.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Passos para construir e rodar a imagem
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Construir a imagem:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; minha-aplicacao:latest &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Executar o contêiner:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 minha-aplicacao:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Teste a aplicação:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;GET http://localhost:8080/hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Vantagens da construção em dois estágios
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Imagens mais leves:
&lt;/h3&gt;

&lt;p&gt;Quando usamos multi-stage builds, a imagem final só contém os artefatos necessários para rodar a aplicação. Isso significa que todas as ferramentas de compilação e dependências de desenvolvimento não são incluídas, resultando em uma &lt;strong&gt;imagem mais leve e eficiente.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Segurança melhorada:
&lt;/h3&gt;

&lt;p&gt;Reduzir o número de componentes na imagem final &lt;strong&gt;diminui a superfície de ataque&lt;/strong&gt;, melhorando a segurança. Menos dependências e ferramentas significam menos possíveis vulnerabilidades.&lt;/p&gt;

&lt;h3&gt;
  
  
  Desempenho otimizado:
&lt;/h3&gt;

&lt;p&gt;Imagens menores são mais rápidas para baixar e iniciar, o que é especialmente importante em ambientes de produção onde a &lt;strong&gt;eficiência&lt;/strong&gt; e a &lt;strong&gt;velocidade&lt;/strong&gt; são cruciais.&lt;/p&gt;

&lt;h3&gt;
  
  
  Separação de responsabilidades:
&lt;/h3&gt;

&lt;p&gt;Dividir o processo em estágios distintos ajuda a manter uma separação clara entre as etapas de construção e execução. Isso facilita a &lt;strong&gt;manutenção&lt;/strong&gt; e a &lt;strong&gt;compreensão&lt;/strong&gt; do Dockerfile.&lt;/p&gt;

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

&lt;p&gt;Construir imagens Docker em dois estágios é uma prática poderosa que traz eficiência e simplicidade. Com essa técnica, você cria imagens mais leves, seguras e fáceis de manter. &lt;br&gt;
Espero que este guia tenha ajudado você a entender melhor essa prática e como implementá-la em seus projetos. Boa sorte e feliz codificação!&lt;/p&gt;

&lt;p&gt;Codigo fonte: &lt;a href="https://github.com/adilsonoj/java-docker-demo"&gt;github&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>docker</category>
      <category>backend</category>
      <category>devops</category>
    </item>
    <item>
      <title>Você sabe o que é SOLID❓</title>
      <dc:creator>Adilson Oliveira</dc:creator>
      <pubDate>Mon, 11 Mar 2024 02:32:28 +0000</pubDate>
      <link>https://forem.com/adilsonoj/voce-sabe-o-que-e-solid-jbj</link>
      <guid>https://forem.com/adilsonoj/voce-sabe-o-que-e-solid-jbj</guid>
      <description>&lt;p&gt;Não tenha medo, &lt;strong&gt;S.O.L.I.D&lt;/strong&gt; é um acrônimo que representa cinco princípios de design de software orientado a objetos. Cada letra corresponde a um princípio específico. Aqui está uma breve descrição de cada um, juntamente com um exemplo de código em Java:&lt;/p&gt;

&lt;p&gt;➡️ &lt;strong&gt;S - Single Responsibility Principle (Princípio da Responsabilidade Única)&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Descrição: Uma classe deve ter apenas um motivo para mudar, ou seja, ela deve ter apenas uma responsabilidade.&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;Calculadora&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;soma&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;/div&gt;



&lt;p&gt;➡️ &lt;strong&gt;O - Open/Closed Principle (Princípio Aberto/Fechado)&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Descrição: Uma classe deve estar aberta para extensão, mas fechada para modificação. Isso significa que você pode adicionar novas funcionalidades sem alterar o código existente.&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;interface&lt;/span&gt; &lt;span class="nc"&gt;Forma&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;calcularArea&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;Quadrado&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Forma&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;double&lt;/span&gt; &lt;span class="nf"&gt;calcularArea&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// lógica de cálculo de área para quadrado&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;Circulo&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Forma&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;double&lt;/span&gt; &lt;span class="nf"&gt;calcularArea&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// lógica de cálculo de área para círculo&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;L - Liskov Substitution Principle (Princípio da Substituição de Liskov)&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Descrição: Subtipos devem ser substituíveis por seus tipos base sem alterar a corretude do programa.&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;Retangulo&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;largura&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;altura&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;setLargura&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;largura&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;largura&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;largura&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;setAltura&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;altura&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;altura&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;altura&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;Quadrado&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Retangulo&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;setLargura&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;lado&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;largura&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lado&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;altura&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lado&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;setAltura&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;lado&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;largura&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lado&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;altura&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lado&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;I - Interface Segregation Principle (Princípio da Segregação de Interfaces)&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Descrição: Uma classe não deve ser forçada a implementar interfaces que ela não utiliza. Interfaces devem ser específicas para os clientes que as utilizam.&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;interface&lt;/span&gt; &lt;span class="nc"&gt;Trabalhador&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;trabalhar&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;descansar&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;Programador&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Trabalhador&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;trabalhar&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// lógica específica para programador&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;descansar&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// lógica específica para programador&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;Gerente&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Trabalhador&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;trabalhar&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// lógica específica para gerente&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;descansar&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// lógica específica para gerente&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;D - Dependency Inversion Principle (Princípio da Inversão de Dependência)&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Descrição: Módulos de alto nível não devem depender de módulos de baixo nível. Ambos devem depender de abstrações. Além disso, abstrações não devem depender de detalhes, mas detalhes devem depender de abstrações.&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;Motor&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;ligar&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// lógica para ligar o motor&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Veiculo&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Carro&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Veiculo&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;Motor&lt;/span&gt; &lt;span class="n"&gt;motor&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;Carro&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Motor&lt;/span&gt; &lt;span class="n"&gt;motor&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;motor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;motor&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;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;motor&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="c1"&gt;// lógica específica para acelerar o carro&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;Em conclusão, compreender e aplicar os princípios SOLID é crucial para desenvolver software robusto e flexível. Estes princípios fornecem uma base sólida para a construção de sistemas escaláveis, de fácil manutenção e extensíveis. 📚Ao continuar estudando e praticando esses conceitos, você estará investindo no aprimoramento das suas habilidades de design de software. Lembre-se de que a busca constante pelo conhecimento é essencial no campo do desenvolvimento de software, pois as tecnologias evoluem e novos desafios surgem. Continue explorando, participando de comunidades e projetos, e desafiando-se a aplicar esses princípios em seus próprios códigos. O compromisso com a excelência no design de software contribuirá significativamente para o seu desenvolvimento profissional. Continue estudando e progredindo!🚀&lt;/p&gt;

</description>
      <category>java</category>
      <category>beginners</category>
      <category>codereview</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Formatar moeda de forma simples e rápida em JAVA</title>
      <dc:creator>Adilson Oliveira</dc:creator>
      <pubDate>Wed, 15 Feb 2023 00:29:46 +0000</pubDate>
      <link>https://forem.com/adilsonoj/formatar-moeda-de-forma-simples-e-rapida-em-java-1h81</link>
      <guid>https://forem.com/adilsonoj/formatar-moeda-de-forma-simples-e-rapida-em-java-1h81</guid>
      <description>&lt;p&gt;A formatação de moeda é uma tarefa comum em aplicativos Java que lidam com transações financeiras. A linguagem Java fornece uma classe java.text.NumberFormat para ajudar na formatação de valores numéricos, incluindo valores monetários. Neste artigo, vamos ver como usar a classe NumberFormat para formatar moeda.&lt;/p&gt;

&lt;p&gt;Passo 1: Importe a classe NumberFormat&lt;br&gt;
Para usar a classe NumberFormat, primeiro você precisa importá-la no seu código Java. Adicione a seguinte linha no início do seu código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import java.text.NumberFormat;

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

&lt;/div&gt;



&lt;p&gt;Passo 2: Crie uma instância de NumberFormat&lt;br&gt;
Para formatar um valor monetário, você precisa criar uma instância da classe NumberFormat. A classe NumberFormat é uma classe abstrata, portanto, você não pode criar uma instância diretamente. Em vez disso, você pode usar um dos métodos estáticos fornecidos pela classe NumberFormat para criar uma instância. Por exemplo, o método getCurrencyInstance() retorna uma instância da classe NumberFormat que pode ser usada para formatar valores monetários. Aqui está um exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NumberFormat currencyFormat = NumberFormat.getCurrencyInstance();

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

&lt;/div&gt;



&lt;p&gt;Passo 3: Formate o valor monetário&lt;br&gt;
Depois de criar uma instância de NumberFormat, você pode usá-la para formatar um valor monetário. O método format() da classe NumberFormat recebe um valor numérico como parâmetro e retorna uma string formatada que representa o valor monetário. Aqui está um exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;double value = 1234.56;
String formattedValue = currencyFormat.format(value);
System.out.println(formattedValue);

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

&lt;/div&gt;



&lt;p&gt;O resultado desse código seria:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;R$1.234,56

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

&lt;/div&gt;



&lt;p&gt;O símbolo da moeda e o formato da string podem variar de acordo com a localidade padrão do sistema.&lt;/p&gt;

&lt;p&gt;Passo 4: Personalize o formato&lt;br&gt;
Você pode personalizar o formato da string formatada usando os métodos fornecidos pela classe NumberFormat. Por exemplo, o método setMaximumFractionDigits() define o número máximo de dígitos após a vírgula decimal na string formatada. Aqui está um exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;currencyFormat.setMaximumFractionDigits(0);
String formattedValue = currencyFormat.format(value);
System.out.println(formattedValue);

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

&lt;/div&gt;



&lt;p&gt;O resultado desse código seria:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;R$1.235
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso define o número máximo de dígitos fracionários como zero, o que arredonda o valor para o inteiro mais próximo.&lt;/p&gt;

&lt;p&gt;Conclusão&lt;br&gt;
A classe NumberFormat fornece uma maneira fácil de formatar valores monetários em Java. Com algumas linhas de código, você pode criar uma instância de NumberFormat, formatar um valor monetário e personalizar o formato da string formatada. Usando a classe NumberFormat, você pode garantir que seus valores monetários sejam apresentados de forma consistente e fácil de entender para seus usuários.&lt;/p&gt;

</description>
      <category>watercooler</category>
    </item>
  </channel>
</rss>
