Dúvida Encapsulamento-Iniciante

10 respostas
G

Boa Noite, pessoal estou iniciando em java e estou estudando
a apostila da Caelum (FJ11), estou procurando entender e fixar bem
os conceitos de OO. Estou na parte de encapsulamento, e me
surgiu uma dúvida:

Supondo que eu queira montar um Sistema Comercial (Estoque,
Emissão de nfs, Receber, etc),umas das classes necessarias
ao meu ver seria a de Clientes:

class Clientes {

// definindo privados
private String cpf;
private String nome;

// métodos get/set

}

class UsaClientes {

Clientes obj = new Clientes();
.
.
.

}

Por exemplo, essa classe eu usaria somente como “modelo” vamos
dizer assim…, seria a classe que eu iria instanciar ?

E por exemplo um método de validar o cpf deveria ser definido
nesta classe mesmo?, e depois utilizá-lo na instância?, assim
como também colocar nesta instância (UsaClientes) os JTextFields??

Comprei o livro do Deitel Java como programar, mas achei muito
cansativo, preferia que ele fosse mais direto ao assunto.

Obrigado… são dúvidas de um iniciante… mas são dúvidas rss

10 Respostas

dfsilva86

Olá ggero!

É basicamente por ai mesmo....os métodos de acesso aos seus atributos privados você deve implementar na classe clientes.

class Clientes {

private String cpf;
private String nome; 

public String getNome() {
  
      return nome;
}

public String setNome(String nome) {

       this.nome = nome;
}


public String getCpf() {
  
      return cpf;
}

public String setCpf(String cpf) {

       this.cpf = cpf;
}

} //fim da classe Clientes

class UsaClientes {

public static void main(String...args) {

Clientes obj = new Clientes();

obj.setNome("João");
obj.setCpf(123456789-10);

System.out.println("Cliente 1" + obj.getNome() + "CPF: " + obj.getCpf() );

}
}

Certifique-se de que as duas classes estão no mesmo pacote, do contrário você terá que tornar a classe Clientes pública.

Espero ter ajudado.

dfsilva86

Só um detalhe nesse trecho

obj.setCpf("123456789-10");

Faltou as aspas…

Lavieri

O ideal é que vc trate em outra classe.... numa classe so para o CPF, visto que... c vc tratar em clientes... não vai ter como reusar o código...

imagine que depois vc necessite fazer uma classe Funcionario... imagina ter que reescrever o código ??

agora imagina isso acontecendo milhoes de vezes ???

então o ideal seria criar uma classe CPF + ou - assim
public class Cpf {
   private String cpf;
   
   public Cpf(String cpf) {
      this.cpf = cpf;
   }

   public boolean isValid() {
      //.... rotina para verificar se é valido
   }
   
   public String toString() {
      return cpf;
   }
}

Assim vc pode usar diretamente uma classe com o valor do Cpf ja encapsulado, e com os métodos para o tratamento do mesmo...

assim vc pode reusar essa classe CPF em qualquer tipo de objeto onde vc tenha cadastro de pessoas...

na sua classe cliente... vc subustituiria o trecho

private String cpf;

por

private Cpf cpf;

G

Muito obrigado David por sua atenção, será que existe alguma publicação que seja mais voltada para um aplicativo comercial, ou seja, uma situação real, o que mais se encontra são exemplos do tipo: Animal gato = new Animal(), ou
Carro fusca = new Carro()., não sei se vcs me compreendem…

M

Quanto a verificação citada, sim, é recomendável fazer essa verificação no método setCpf, para que ao chamá-lo, possamos ter certeza que somente CPFs válidos serão aceitos.

Talvez um construtor caisse bem, uma vez que todo cliente deve ter um nome e um CPF (requerindo esses argumentos pelo construtor, obrigatóriamente estes terão algum valor).

Ah… outra coisa: eu acho que o nome da classe faz mais sentido no singular (Cliente), uma vez que cada instância se refere a um único cliente.

Resumindo, seria algo como:

class Cliente {

private String cpf;
private String nome;

public Cliente(String nome, String cpf) {
    setNome(nome);
    setCpf(cpf);
}

public String getNome() {
      return nome;
}

public String setNome(String nome) {
       this.nome = nome;
}


public String getCpf() {
      return cpf;
}

public String setCpf(String cpf) {
        if (isValidCpf(cpf)) { // fazendo a verificação
            this.cpf = cpf;
        }
}

private static boolean isValidCpf(String s) {
    return true; // TODO fazer a verificação verdadeira
}

}
M

E considere como bastante importante o que Lavieri disse (só não coloquei no exemplo porque estava editando quando ele postou), mas sugiro que implemente essa classe CPF (até porque a validação de CPF é algo chato de se fazer, mas existem vários exemplos e algoritmos prontos aqui no fórum).

Lavieri

ggero:
Muito obrigado David por sua atenção, será que existe alguma publicação que seja mais voltada para um aplicativo comercial, ou seja, uma situação real, o que mais se encontra são exemplos do tipo: Animal gato = new Animal(), ou
Carro fusca = new Carro()., não sei se vcs me compreendem…

vc ve isso em apostilas, pq é mais facil de entender conceitos OO com objetos reais… e não com coisas já viciadas vindo de outras linguagem… quase todo programador, tem certos vicios com relações a coisas comerciais, por isso os exemplos são bem mais reais… o ideal é vc abstrair… tentar enchergar as coisas com um objeto…

Por exemplo…

Cliente é um “objeto” ou seja… é uma pessoa… pessoa tem as caracteristicas principais que te interessam… ai vc modela especificando estas caracteristicas… ai vc pensa… Cpf é um objeto, com carcteristicas proprias… então se para o nivel de modelo que vc esta fazenod, é relevante… vc modela o objeto Cpf tb… caso contrario, vc abstrai um pouco…

Tudo depende do seu foco… quanto + dentro do seu problema vc estiver, melhor vc precisa modelar… por exemplo… c vc estiver fazendo um pequeno sistema de cadastro de estoque… onde exista um fornecedor, e que tenha um contato… vc não precisa da data de nascimento do contato… pq isso não interessa pro foco da tua modelagem ^^…

espero ter ajudado

dfsilva86

Situações reais você pode encontrar em vídeo aulas, sobre materiais as explicações são bem didáticas mesmo.

Mas antes o ideal mesmo é você fixar os conceitos, principalmente o que o Lavieri disse…meu trecho de código funciona mas leve em consideração o que o Lavieri mencionou.

Como eu disse é +/- por ai :wink:

ellison

Fala ae cara…blz ??
então…como o sábio jack o stripador disse…“vamos por partes” hehehehe

ggero:
E por exemplo um método de validar o cpf deveria ser definido
nesta classe mesmo?, e depois utilizá-lo na instância?, assim
como também colocar nesta instância (UsaClientes) os JTextFields??

Yes !! Porém um pequeno há detalhe que costumo seguir. Você concorda comigo que um método de validação de cpf dentro de clientes seria algo específico para clientes ? Tipo, só uma pessoa tem cpf, mais ninguem…então não existe uma necessidade clara para deixar esse método acessível. Por fim, acredito que o ideal seria que esse método de validação fosse private e o mesmo fosse chamado no momento em que o atributo está sendo setado. Assim não há necessidade de invocar esse método. Ele já seria invocado no momento que você fosse preencher o atributo com algum valor. blz !?

ggero:
Comprei o livro do Deitel Java como programar, mas achei muito
cansativo, preferia que ele fosse mais direto ao assunto.

Além de não ter dinheiro pra comprar muitos livros, esse seu motivo é mais um pelo qual eu baixo livros para ler…se o livro me agrada eu compro, se não eu nem continuo lendo. Afinal, dinheiro não é pra ser jogado fora e sim investido !!
Eu aconselho o core java - Fundamentos (Volume I) … é um livro muito bom … repleto de exemplos e que o autor gosta muito de explicar detalhadamente o que está acontecendo, muito bom para entender a linguagem. Eu achei legal !!

Mas dê um olhadinha no thinking Java (Tradução: Use a cabeça JAVA) … não tenho certeza se a versão brasileira tem esse título…Enfim, dizem que é muito bom !

flws !!
bons estudos

G

Aproveitando:

na sua classe cliente vc subustituiria o trecho

private String cpf;

por

private Cpf cpf;

esta última linha, trata-se de Composição???
se for, eu procurei aqui no Guj sobre o assunto e não achei nenhum exemplo
de uso bem simples…

Criado 5 de fevereiro de 2009
Ultima resposta 6 de fev. de 2009
Respostas 10
Participantes 5