Get e set para mostrar mais de um atributo

Fala galera.
Bom o meu problema começou quando eu comecei a modificar alguns itens da classe de acordo com o exercício do livro. Antes minhas classe eram assim (Resumo):

public class Programa { public static void main (String [] args){ Conta minhaConta = new Conta(); minhaConta.titular.nome = "Duke"; System.out.println(minhaConta.titular.nome); }public class Conta { Cliente titular; }public class Cliente { String nome; String sobrenome; String cpf; } Depois comecei a usar um get e set na classe Conta:[code]public class Conta {
private Cliente titular;

public Cliente getTitular(){
	return this.titular;
}

public void setTitular(Cliente titular){
	this.titular = titular;
}

}[/code]As dúvidas são:
1-Na classe Programa como faço para chamar o set para acrescentar valor de nome ao titular sem modificar o set da classe Conta? Da mesma forma como imprimir sem mudar o get.
2-Se não for possível chamar e devolver os atributos da classe Cliente através da classe Conta por meio de get e set eu teria que criar outros com nomes que indiquem o que eles fazem ex: Cliente getTitularNome(){return this.titular.nome // Será que isso deixa o código exagerado e mal orientado a objetos ou têm alguma outra maneira de trazer valores um a um?

OBS: Eu não tenho dúvidas para chamar get e set como saldo, limite e outros que não deixei para simplificar o código na hora de postar.

[quote]1-Na classe Programa como faço para chamar o set para acrescentar valor de nome ao titular sem modificar o set da classe Conta? Da mesma forma como imprimir sem mudar o get.
[/quote]

Bom, você refez a classe Conta, agora com os métodos get e set, e um campo titular (do tipo Cliente) agora como private.
Indicaria você a refazer também a classe Cliente com todos os campos private e com métodos get e set.

Mas considerando o modo como já está feito, para alterar (ou acrescentar) o nome do titular da maneira que está no programa você deve criar instanciar o objeto titular que está dentro do seu objeto minhaConta. Você faz isso utilizando o método get:

public class Programa {
	public static void main (String [] args){
		Conta minhaConta = new Conta();

                /*Criando variável para instanciar o Cliente dentro da Conta:
                 getTitular irá retornar a instância do cliente existente dentro 
                do objeto minhaConta*/
                Cliente clienteTemp = minhaConta.getTitular();

                //Agora você pode utilizar a vontade o clienteTemp
                clienteTemp.nome = "Nukem";

                /*Ou se você modificar a classe Cliente e adicionar
                um método para setar o nome, por exemplo: setNome(String nome)
                ficaria assim:*/
                //clienteTemp.setNome("Nukem");


                /*Usando a mesmas intância clienteTemp, você pode imprimir
                o nome do cliente, no exemplo abaixo, imprimindo diretamente:*/

                System.out.println("Nome do Cliente: "+clienteTemp.nome);

                /*E caso você crie um método get para o nome na classe Cliente,
                com a assinatura:

                public String getNome()

                Ficaria assim:*/
                //System.out.println("Nome do Cliente: "+ clienteTemp.getNome());

        }
}

Não entendi muito bem a sua pergunta. Mas o ideal para POO seria você criar também métodos get e set dentro da classe Cliente para cada um dos campos, da mesma maneira que você fez para a classe Conta:

[code]public class Cliente {
private String nome;
private String sobrenome;
private String cpf;

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

    /*Note que neste método get o que será retornado é uma String,
    no caso, o nome do cliente, por isso o tipo de retorno "String"*/
    public String getNome() {
            return this.nome;
    }

    public void setSobrenome(String sobreNomeCliente) {
            this.sobrenome = sobreNomeCliente;
    }

    public String getSobrenome() {
            return this.sobrenome;
    }

    //Fazer o mesmo para os demais campos...

}[/code]

A idéia seria a mesma do primeiro caso. Você consegue pegar o objeto Cliente que está dentro da sua conta (utilizando o método getTitular()). Através deste cliente você pode utilizar qualquer método de dentro da sua classe Cliente. Quando você não tinha colocado private você fazia de certa forma a mesma coisa, só que de uma maneira mais direta:

[code]//Você fazia assim:
minhaConta.titular.nome = “Duke Nukem”;

//Que seria mesma coisa de fazer assim:

Cliente clienteTemp = minhaConta.titular;
clienteTemp.nome = “Duke Nukem”;

/acessando minhaConta.titular você acessa o campo “titular” de dentro do objeto
minhaConta (que é do tipo Conta). Este objeto “titular” é do tipo Cliente, então agora
você utilizou um objeto intermediário para poder acessar o campo “nome” do seu
Cliente “titular”
/
[/code]

Espero ter ajudado, se ainda tiver dúvidas poste novamente.

A explicação ficou boa não tenho aquelas dúvidas. O problema é que os códigos da minhas classes estão enormes e são muitos eu só postei um “super resumo” para fazer a explicação, e se eu colocar um getTitularNome, getTitularSobrenome etc… só vai piorar porque no meu caso quero deixar o programa final o mais simplificado possível até mesmo para chamar os atributos um a um fica mais complicado.
Bom acho que no getTitular se eu fizesse um toString() em Cliente ele teria alguma utilidade não testei mas acho que pode funcionar, porém vai puxar toda a informação da outra classe e não um a um como eu queria porque “getTitular().nome” não existe.

Não sei porque o livro pede para fazer esse tipo de metódo na minha opinião só trouxe desvantagem mas eu ainda não tenho a visão final da aplicação. Na sua opinião você acha que vou ter algum problema no futuro se continuar acessando diretamente como eu fazia antes esses atributos? Eu pergunto isso porque têm alguns atributos que têm esse tipo de problema como int saldo que eu não postei, acessar ele direto é ruim por causa do metódo que deve ser acessado obrigatóriamente deposita(); que eu também não postei.

Na verdade essa idéia de encapsular campos (colocar eles private e usar get e set para acessar) é uma boa prática de orientação a objeto e deveria ser seguida.

Um bom exemplo para essa prática. Imagine que você e um outro amigo estão desenvolvendo um projeto, cada um fica responsável por uma parte do projeto.
Você fica com toda a parte de implementação da conta do cliente, a geração de extratos e estatísticas.
Seu amigo fica com a parte de acesso à conta. Para você poderem fazer o projeto vocês devem chegar em um ponto em comum, você oferece os métodos de acesso para ele receber e alterar os dados. Ele será obrigado a utilizar esses métodos.

Por exemplo com um método void sacar(float valorParaSacar). A interface do programa em um caixa eletrônico não se preocupa se o valor para ser sacado é maior que o disponível em saldo. Isso é algo com o qual você deve se preocupar dentro do método sacar. Seu amigo também pode fazer uma operação errada e sem querer alterar um valor de saldo. Para isso você deve deixar o campo saldo como private e se disponibilizar o acesso à ele através de métodos…

Num sei se foi muito claro, mas com o tempo você vai perceber que o processo de encapsulamento é bastante útil. Para sistemas pequenos e pequenos testes não há necessidade de sua utilização, na verdade ele deixa o código um pouco maior e demora mais tempo pra fazer… Mas se for para aprendizagem, utilize, e utilize muito!