[quote=RafaelViana][quote=asaudate]O que acontece é o seguinte: você precisa modelar seus objetos da maneira como eles acontecem no mundo real. Como acontece no mundo real? Cada tipo de documento (RG, CPF, etc.) é um documento. Óbvio, você tem documentos que são usados por pessoas físicas e por pessoas jurídicas, mas é certo modelá-los assim? Sim e não, depende… cada documento específico deveria ter sua própria classe, já que eles podem ter sua própria lógica de validação. Assim, seria interessante você fazer mais ou menos assim:
public abstract class Pessoa {
public abstract Collection<Documento> getDocumentos();
}
public class PessoaFisica {
private Documento documento;
public Collection<Documento> getDocumentos() {
return Collections.singletonList(documento);
}
}
public abstract class Documento {
public abstract void validar() throws ValidationException;
}
public class RG extends Documento {
private String numero;
private Date dataEmissao;
public void validar() throws ValidationException {
//Ponha aqui lógica de validação para RG
}
}
E assim por diante. Note que eu não coloquei todas as classes porque queria somente demonstrar o conceito. Dessa maneira, seu sistema fica muito mais flexível (porque, por exemplo, se o documento principal de pessoa física deixar de ser o RG, por exemplo, você só precisa trocar a instância do atributo rg. Se o seu fornecedor for pessoa física ou pessoa jurídica, não importa, porque você só vai precisar referenciar a superclasse Pessoa no seu código. E assim por diante.
[]'s[/quote]
Legal essa modelagem.
Pegando o seguinte cenário:
Pessoa pessoa = new PessoaFisica();
pessoa.addDocumento( new RG("1111", 21/04/2011) );
Agora e se eu quero pegar o numero de RG dessa PessoaFisica? No seu ponto de vista, qual seria a maneira mais adequada?
Collection documentos = pessoa.getDocumentos();
//.... e para pegar o RG? só iterando e comparando o tipo de objeto ou tem alguma maneira mais elegante?
Viajando um pouco…
o ideal seria ter um método que fizesse esse filtro (mas mesmo assim não tem como escapar da verificação instanceof, que teria que ser feita no método ofType):
RG documento = pessoa.getDocumentos().ofType(RG.class);
Das duas uma: ou você coloca um método getNumero() na própria classe Documento (afinal, todo documento tem um número) ou, caso o documento necessário seja sempre um RG, você troca o tipo do atributo. Varia de acordo com a necessidade.
EDIT: Só não faça testes de acordo com o tipo, pelo amor de James Gosling!
[]'s