3
respostas

[Projeto] Projeto final do curso - desafio, vamos consultar a API ViaCEP - Versão com valida CEP Evitar consumo de recursos. Uma boa prática de progração

Olá professores e professoras!

Vai nova versão com uma nova classe ValidaCep para realizar teste de validação o que pode render economia de recursos de tempo de processamento, de acesso a rede externa e de tanto outros problemas que podem ser evitados. Testar a validação dos dados de entrada informados em qualquer aplicação é ótima prática de programação. Evitar que o usuário digite qualquer coisa e trave, provoque erros e paralise o sistema é sempre bem vindo.
Usei também janelas para a entrada do CEP e exibir menssagens o que aprendi em outro curso que fiz de programação comercial com java e banco de dados MySQL no Instituto Federal de Rondônia - IFRO

Fiz uma mudança no código da classe GeradorDeArquivo.java com o uso do BufferedWriter.

Principal.java
import javax.swing.;
//import javax.swing.JOptionPane;
import java.awt.
;
import java.io.IOException;
import java.util.Scanner;
public class Principal {
public static void main(String[] args) {
//classe externa para validar um CEP
ValidaCEP validator = new ValidaCEP();
//Criação do TextField para entrada de dados
JTextField textField = new JTextField();
JOptionPane.showMessageDialog(null, textField, "Digite o CEP p/ consulta (só números):", JOptionPane.PLAIN_MESSAGE);
//Captura do texto inserido no TextField
String cep = textField.getText();
ConsultaCep consultaCep = new ConsultaCep();
if (!validator.isValidFormat(cep)) {
JOptionPane.showMessageDialog(null, "CEP inválido! Digite exatamente 8 números. Use 00000-000 ou 00000000.",
"Erro",
JOptionPane.ERROR_MESSAGE);
return;
}
try {
Endereco novoEndereco = consultaCep.buscaEndereco(cep);
System.out.println(novoEndereco);
GeradorDeArquivo gerador = new GeradorDeArquivo();
gerador.salvaJson(novoEndereco);
} catch (RuntimeException | IOException e) {
System.out.println(e.getMessage());
JOptionPane.showMessageDialog(
null,
e.getMessage(),
"Erro",
JOptionPane.ERROR_MESSAGE
);
JOptionPane.showMessageDialog(null, "Finalizando a aplicação");
//System.out.println("Finalizando a aplicação");
}
}
}

ValidaCEP.java
import java.util.Scanner;
import java.util.regex.Pattern;
public class ValidaCEP {
private static final Pattern CEP_PATTERN = Pattern.compile("^\d{5}-?\d{3}$");
/**
* Valida o formato do CEP.
*
* @param cep CEP informado pelo usuário.
* @return true se o formato for válido, false caso contrário.
*/
public boolean isValidFormat(String cep) {
if (cep == null) return false;
return CEP_PATTERN.matcher(cep).matches();
}
}

Endereco.java
public record Endereco(String cep, String logradouro,
String complemento, String bairro,
String localidade, String uf) {
}

ConsultaCep.java
import com.google.gson.Gson;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class ConsultaCep {
public Endereco buscaEndereco(String cep) {
URI endereco = URI.create("https://viacep.com.br/ws/" + cep + "/json/");
HttpRequest request = HttpRequest.newBuilder()
.uri(endereco)
.build();
try {
HttpResponse response = HttpClient
.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
return new Gson().fromJson(response.body(), Endereco.class);
} catch (Exception e) {
throw new RuntimeException("Não consegui obter o endereço a partir desse CEP.");
}
}
}

GeradorDeArquivo.java
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class GeradorDeArquivo {
public void salvaJson(Endereco endereco) throws IOException {
Gson gson = new GsonBuilder().setPrettyPrinting().create();

    //Principais Pontos:
    //•	FileWriter: Cria o arquivo ou o abre para gravação.
    //•	BufferedWriter: Melhora a performance da escrita.
    //BufferedWriter + FileWriter → Cria e escreve no arquivo.
    BufferedWriter escrita = new BufferedWriter(new FileWriter(endereco.cep()+ ".json" ));
            //(endereco.cep() + ".json");
    escrita.write(gson.toJson(endereco));
    escrita.close();
}

}

3 respostas

Oi, Fábio! Como vai?

Agradeço por compartilhar seu código com a comunidade Alura.

Achei muito interessante a forma como você organizou o projeto, principalmente criando a classe ValidaCEP pra validar os dados antes de fazer a chamada da API. Essa separação de responsabilidades é uma boa prática de programação, pois evita consumo desnecessário de rede e processamento. O uso de BufferedWriter também foi uma ótima escolha pra melhorar a eficiência na escrita do arquivo JSON, além da utilização do JOptionPane pra interação com o usuário.

Uma dica interessante para o futuro é usar o try-with-resources, que ajuda a garantir que arquivos e streams sejam fechados automaticamente.


import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class ExemploArquivo {
    public static void main(String[] args) throws IOException {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter("arquivo.txt"))) {
            writer.write("exemplo de escrita em arquivo");
        }
    }
}

Neste exemplo, o BufferedWriter é fechado automaticamente ao final do bloco try, evitando esquecer de fechar o recurso e deixando o código mais seguro e organizado.

Conteúdos relacionados
Alura

Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Olá professora vai agora uma nova versão com o uso do try-with-resources.
O //escrita.write(gson.toJson(endereco)); estava fora do bloco como a professora ensinou antes então eu coloquei dentro do bloco.

try-with-resources
O que é: um recurso sintático do Java para uso seguro de recursos de forma segura.
Objetivo: garantir que recursos escassos - como conexões com o banco de dados, referências a arquivos, conexões de rede - sejam devidamente fechadas após o uso, mesmo num cenário excepcional.
Funcionamento: os recursos declarados no try (entre os parêntesis) devem implementar a interface AutoCloseable e terão seu método close() automaticamente chamado ao final do bloco try.
Uso simples:

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
}
Benefícios:

Substitui o tratamento manual de exceções:
Menos propenso a erros de codificação, quando o programador não sabe ou esquece de executar todo o tratamento necessário.
Evita vazamento de recursos, quando o programador esquece de fechá-lo ou não trata corretamente uma situação excepcional.
Menos código boilerplate:
Facilita e agiliza a codificação.
Menos chance de esquecer algo.
Menos código significa menos bugs e menos coisas para dar manutenção.

GeradorDeArquivo.java

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class GeradorDeArquivo {
public void salvaJson(Endereco endereco) throws IOException {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
//Principais Pontos:
//• FileWriter: Cria o arquivo ou o abre para gravação.
//• BufferedWriter: Melhora a performance da escrita.
//BufferedWriter + FileWriter → Cria e escreve no arquivo.
try (BufferedWriter escrita = new BufferedWriter(new FileWriter(endereco.cep()+ ".json" ))){
//(endereco.cep() + ".json");

        escrita.write(gson.toJson(endereco));
        //escrita.close();
    }
    //escrita.write(gson.toJson(endereco));
    //escrita.close();
}

}

Olá professora vai agora uma nova versão com o uso do try-with-resources.
O //escrita.write(gson.toJson(endereco)); estava fora do bloco como a professora ensinou antes então eu coloquei dentro do bloco.

try-with-resources
O que é: um recurso sintático do Java para uso seguro de recursos de forma segura.
Objetivo: garantir que recursos escassos - como conexões com o banco de dados, referências a arquivos, conexões de rede - sejam devidamente fechadas após o uso, mesmo num cenário excepcional.
Funcionamento: os recursos declarados no try (entre os parêntesis) devem implementar a interface AutoCloseable e terão seu método close() automaticamente chamado ao final do bloco try.
Uso simples:

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
}
Benefícios:

Substitui o tratamento manual de exceções:
Menos propenso a erros de codificação, quando o programador não sabe ou esquece de executar todo o tratamento necessário.
Evita vazamento de recursos, quando o programador esquece de fechá-lo ou não trata corretamente uma situação excepcional.
Menos código boilerplate:
Facilita e agiliza a codificação.
Menos chance de esquecer algo.
Menos código significa menos bugs e menos coisas para dar manutenção.

GeradorDeArquivo.java

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class GeradorDeArquivo {
public void salvaJson(Endereco endereco) throws IOException {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
//Principais Pontos:
//• FileWriter: Cria o arquivo ou o abre para gravação.
//• BufferedWriter: Melhora a performance da escrita.
//BufferedWriter + FileWriter → Cria e escreve no arquivo.
try (BufferedWriter escrita = new BufferedWriter(new FileWriter(endereco.cep()+ ".json" ))){
//(endereco.cep() + ".json");

        escrita.write(gson.toJson(endereco));
        //escrita.close();
    }
    //escrita.write(gson.toJson(endereco));
    //escrita.close();
}

}