Duvida atributos e composicao de classes

bom dia galera, estou com uma dúvida basica sobre fazer composição de classes e atributos no meu codigo abaixo. eu criei 4 classes: Cliente, Conta, Programa e Endereco. A classe Cliente eu estou fazendo composição com a classe Conta e a classe Endereço eu estou fazendo composição com a classe Cliente. Então para acessar os dados do endereço do cliente eu tenho que fazer: referenciaObjeto.atributo(Conta).atributo(Cliente).atributo(Endereco), eu sei que está funcionando do jeito q eu programei, mas achei meio estranho e confuso, existe outra forma de fazer sem trabalhar com herança ou interface pq eu ainda não estou dominando esse assuntos?? valeu!!

Classe Conta:

package Contas;

public class Conta {

	int numero;
	// String dono;
	double saldo;
	double limite;
	Cliente titular;

	boolean saca(double valor) {
		if (this.saldo < valor) {
			System.out.println("Não sacou");
			return false;
		} else {
			this.saldo -= valor;
			System.out.println("Sacou!!!");
			return true;
		}
	}

	void deposita(double valor) {
		this.saldo += valor;
		System.out.println("Depositou!!!");
	}

	boolean transfere(Conta destino, double valor) {
		if (this.saldo < valor) {
			System.out.println("Não tem saldo disponivel para tranferir");
			return false;
		} else {
			this.saldo -= valor;
			destino.saldo += valor;
			System.out.println("transferido com sucesso!!");
			return true;
		}
	}
}

Classe Cliente:

package Contas;

public class Cliente {

	String nome;
	String sobrenome;
	String cpf;
	Endereco cliente;
}

Classe Endereco:


package Contas;

public class Endereco {

	String endereco;

}

Classe Programa:

public class Programa {

	/**
	 * @author Rodrigo Da Col
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Conta conta1 = new Conta();
		Cliente a = new Cliente();
		Endereco clienteA = new Endereco();
		conta1.titular = a;
		a.cliente = clienteA;

		// conta1.dono = "Rodrigo";
		conta1.limite = 200;
		conta1.saldo = 1000;
		conta1.numero = 1;
		conta1.titular.nome = "Rodrigo";
		conta1.titular.sobrenome = "Da Col";
		conta1.titular.cpf = "123";
		conta1.titular.cliente.endereco = "Rua da Praia";

		Conta conta2 = new Conta();
		Cliente b = new Cliente();
		conta2.titular = b;

		// conta2.dono = "Eda";
		conta2.limite = 200;
		conta2.saldo = 1000;
		conta2.numero = 2;
		conta2.titular.nome = "Eda";
		conta2.titular.sobrenome = "Da Col";
		conta2.titular.cpf = "321";

		System.out.println("o saldo da minha conta 1 é:\n" + conta1.saldo);
		System.out.println("o saldo da minha conta 2 é:\n" + conta2.saldo);

		conta1.saca(200);
		conta1.deposita(300);
		System.out.println(conta1.saldo);
		conta1.transfere(conta2, 1400);
		System.out.println(conta1.saldo + " " + conta2.saldo);
		System.out.println(clienteA.endereco);

	}
}

A linha 22 da classe Endereco: “conta1.titular.cliente.endereco” tá certo isso??? faz parte das boas práticas de progrmação??

Utilize encapsulamento…
Não acesse atributos, apenas métodos do tipo GET…

Sou novo em java também, me corrijam se estiver errado, mas não faz parte das boas práticas de programação. Porque os atributos de uma classe (Cliente) devem ser private pra que outras classes (Programa) não acessem-a diretamente. Fazendo isso, voce irá encapsular a classe.

Pesquise por métodos getters e setters. Tem um artigo muito bom no blog mostrando o uso moderado dos mesmos.

André.

valeu galera, eu estou refazendo com todos os atributos privados e utilizando setters/getters, mas de qualquer forma eu vou precisar acessar os atributos, e queria saber se a composição das classes está correte. valeu

Expresse as relações de negócio com as relações entre as classes.