1
resposta

[Dúvida] Gostaria Apenas de uma análise de modo geral do meu código, acertos erros, pontos a melhorar, boas práticas segue em anexo:

PraticandoPoo

-Classe Main-
import br.com.Alura.*;

import java.util.ArrayList;

public class Main {
    static void main(String[] args) {


        ArrayList<Tarefa> listaDeTarefas = new ArrayList<>();

        Tarefa tarefa_01 = new Tarefa();
        tarefa_01.preencherDados();
        listaDeTarefas.add(tarefa_01);

        Tarefa tarefa_02 = new Tarefa();
        tarefa_02.preencherDados();
        listaDeTarefas.add(tarefa_02);

        for(Tarefa t : listaDeTarefas) {
            System.out.println(t);
        }


    }
}

-Classe Tarefa-
package br.com.Alura;

import java.util.Scanner;

public class Tarefa {
    private String nomeDaTarefa;
    private String descricao;
    private boolean statusTarefa;

    public String getNomeDaTarefa() {
        return nomeDaTarefa;
    }


    public String getDescricao() {
        return descricao;
    }


    public boolean isStatusTarefa() {
        return statusTarefa;
    }


    public void preencherDados() {
        Scanner input = new Scanner(System.in);

        System.out.print("Digite um título para a tarefa: ");
        nomeDaTarefa = input.nextLine();
        System.out.print("==============================\n");

        System.out.println("Agora digite uma descrição para esta tarefa: ");
        descricao = input.nextLine();

        System.out.println("!!Digite apenas(Sim) ou (Não)!!");
        System.out.println("A tarefa está concluída?: ");
        String resposta = input.nextLine();

        while(true) {
            if (resposta.equalsIgnoreCase("sim")) {
                statusTarefa = true;
                break;
            } else if (resposta.equalsIgnoreCase("nao") || resposta.equalsIgnoreCase("não")) {
                statusTarefa = false;
                break;
            } else {
                System.out.println("!!!OPÇÃO INVALIDA!!!");
                System.out.println("!!Digite apenas(Sim) ou (Não)!!");
                System.out.println("A tarefa está concluída?: ");
                resposta = input.nextLine();
            }
        }
    }


    @Override
    public String toString() {
        String statusDaTarefa = statusTarefa? "Concluído" : "Pendente";

        return "Tarefa: " +nomeDaTarefa+
                "\nDescrição da tarefa: " +descricao+
                "\nStatus da tarefa: " +statusDaTarefa+ "\n==========";

    }
}
1 resposta

Ola!!

O código está bem legal para o nível do curso. Dá pra ver claramente que você entendeu o conceito de classes, atributos, métodos, encapsulamento e uso de listas. A separação entre Main e Tarefa está correta e o programa funciona de ponta a ponta, o que já é um ótimo sinal.

Você usou bem:

  • Encapsulamento: os atributos estão private e existem getters.
  • Sobrescrita do toString(), o que é uma excelente prática para representar o objeto.
  • ArrayList<Tarefa> com generics, evitando uso de listas cruas.
  • Laço for-each, que deixa o código mais limpo.
  • Validação de entrada do usuário com while(true), garantindo que o status seja válido.

Tudo isso mostra uma boa base de orientação a objetos.

Pontos que podem melhorar

Na classe Main, o método main deveria ser public static void main(String[] args). Sem o public, algumas IDEs ou ambientes podem não reconhecer corretamente o ponto de entrada da aplicação.

Ainda na Main, o código está um pouco repetitivo na criação das tarefas. Isso não é um erro, mas conforme o sistema cresce, repetir esse padrão pode virar um problema. Mais pra frente, você pode extrair isso para um método ou até usar um loop para criar várias tarefas.

Na classe Tarefa, o método preencherDados() mistura duas responsabilidades:

  • lógica da entidade (o que é uma tarefa)
  • entrada de dados pelo usuário (Scanner, prints)

Para fins didáticos do curso, isso é totalmente aceitável. Mas como boa prática, o ideal seria que a classe Tarefa apenas representasse a tarefa, e a leitura de dados ficasse na Main ou em uma classe específica de interação com o usuário. Isso deixa o código mais organizado e reutilizável.

Outro ponto importante: você cria um Scanner dentro do método e não o fecha. O ideal é criar um único Scanner no main e reutilizá-lo, passando os dados para a tarefa ou usando setters. Fechar o Scanner também é importante para evitar avisos e possíveis problemas.

Sobre os getters: você criou, mas não está usando nenhum ainda. Não é errado, só significa que eles estão preparados para uso futuro. Conforme o projeto evoluir, você provavelmente vai começar a usá-los.

Detalhes de estilo e boas práticas

Os nomes das variáveis estão claros, o que é ótimo. Só uma observação: em Java, o padrão é usar camelCase sem underscore, então tarefa_01 poderia ser tarefa01. Não quebra nada, mas seguir o padrão ajuda na legibilidade e em projetos maiores.

A validação do “sim” e “não” está bem feita e robusta, inclusive tratando acento. Isso é um cuidado que muita gente iniciante não tem.

Para o contexto do curso, o código está bem acima da média:

  • está organizado
  • funciona corretamente
  • aplica conceitos de OO
  • já tem preocupação com validação e apresentação

Os principais próximos passos seriam:

  • separar melhor responsabilidades (entrada de dados vs modelo)
  • evitar repetição de código
  • começar a pensar em métodos construtores e setters no lugar de métodos que “fazem tudo”

É um ótimo exercício e mostra que você está no caminho certo.