Dúvida Encapsulamento-Iniciante

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

Olá ggero!

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

[code]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() );

}
}[/code]

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.

Só um detalhe nesse trecho

obj.setCpf("123456789-10");

Faltou as aspas…

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

[code]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;
}
}[/code]

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;

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…

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
}

}

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).

[quote=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…[/quote]

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

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:

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

[quote=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??[/quote]

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 !?

[quote=ggero]Comprei o livro do Deitel Java como programar, mas achei muito
cansativo, preferia que ele fosse mais direto ao assunto.[/quote]

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

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…