Problema Básico

Boa tarde! Eu sou iniciante na programação (no meu caso tô fazendo em Java por conta da faculdade), e eu sinto que meu maior problema muito além de entender os conceitos, é colocar eles em prática. Eu não consigo abstrair, por exemplo, o professor diz crie uma agenda, só que eu não consigo abstrair a ideia da agenda, o que a agenda tem? o que ela faz? Não sei se ficou claro, mas se alguém pudesse me dar um dica de como melhorar isso, ficaria grato!

Comece pensando que uma agenda guarda uma lista de contatos.

Só nisso você já percebe que seu programa deve conter pelo menos duas entidades: Agenda e Contato.

class Agenda {
  private List<Contato> contatos = new ArrayList<>();
}

class Contato {
  String nome;
  String telefone;

  Contato(String nome, String telefone) {
    this.nome = nome;
    this.telefone = telefone;
  }

  @Override
  public String toString() {
    return this.nome + " " + this.telefone;
  }
}

Uma agenda permite que você realize as seguintes operações:

  • Adição de contatos (com seu telefone)
  • Exclusão de contatos
  • Listagem de contatos cadastradas

Com isso podemos incrementar nossa classe Agenda pra ela ficar assim:

class Agenda {
  List<Contato> contatos = new ArrayList<>();

  void adicionarContato(Contato contato) {
    this.contatos.add(contato);
  }

  void removerContato(Contato contato) {
    this.contatos.remove(contato);
  }

  List<Contato> pegarContato() {
    return Collections.unmodifiableList(this.contatos);
  }
}

Depois você cria uma outra classe, que será a principal, que vai testar a ideia:

public class Main {
  public static void main(String... args) {
    Agenda agenda = new Agenda();

    Contato contato1 = new Contato("Contato 1", "1111");
    Contato contato2 = new Contato("Contato 2", "2222");
    Contato contato3 = new Contato("Contato 3", "3333");

    agenda.adicionarContato(contato1);
    agenda.adicionarContato(contato2);
    agenda.adicionarContato(contato3);

    agenda.pegarContato().forEach(System.out::println);

    agenda.removerContato(contato2);

    System.out.println("");

    agenda.pegarContato().forEach(System.out::println);
  }
}

Em seguida você desenvolver uma lógica para que o usuário consiga realizar essas operações a partir da linha de comando, mas isso é outra história.

Muito Obrigado! Só uma duvida, poderia me explicar essa parte do código:
List pegarContato() {
return Collections.unmodifiableList(this.contatos);
}
Mais especificamente esse metodo “unmodifiableList”.

O método unmodifiableList transforma uma lista normal em uma lista que não pode ser modificada.

Isto é, em uma lista que não permite a adição ou remoção de elementos.

Agenda possui a lista de contatos, logo, somente Agenda deveria ser capaz de modificar esta lista. Se eu tivesse retornado a lista diretamente assim:

public List<Contato> pegarContato() {
  return this.contatos;
}

Código de fora poderia alterar a lista a vontade e coisas como no código abaixo seriam possíveis.

public class Main {
  public static void main(String... args) {
    Agenda agenda = new Agenda();
    List<Contato> contatos = agenda.pegarContato();

    contatos.add(new Contato("Contato 1", "1111"));
    contatos.add(new Contato("Contato 2", "2222"));
    contatos.add(new Contato("Contato 3", "3333"));

    agenda.pegarContato().forEach(System.out::println);
  }
}

Viu ali como eu fui capaz de adicinar contatos sem precisar invodar o método Agenda.adicionarContato? Pois então, isso não deveria ser possível.

Contudo, como eu estou retornando uma lista não-modificavél eu posso até tentar alterar, mas vai causar um erro.

Program

Tipo eu estava tentando fazer recebendo os valores do usuário, mas eu não estou conseguindo entender como eu faria para remover um contato especifico, ou mostrar apenas determinado contato, a partir da entrada do usuário, por exemplo ele passaria o nome e eu mostraria o telefone e nome desse contato a partir disso.

Eu adicionei essa função ai no final (eu acredito que se eu tiver feito direito ela vai retornar a posição da lista que esse contato se encontra), então a partir dessa posição eu poderia mostrar ou remover um contato especifico com o usuário passando apenas o nome desse contato, tem como fazer isso, ou meio raciocínio esta errado?

Pelo que eu testei, a lógica que vc usou está funcionando sim. Só não to conseguindo pensar agora se isso é util.