Encapsulamento

Aí galerinha so pra finalizar…

Tenho abaixo duas classes e gostaria de saber de vocês se efetuei com sucesso o encapsulamento
de minhas classes…
Valeuuuu!!!




import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;


public class Clientes extends JFrame {


	private JTextField txtCodigo;
	private JButton btnCadastrar;




public Clientes() {

	super("Cadastro de Clientes");

GridBagLayout layout = new GridBagLayout();
Container quadro = getContentPane();
JPanel painel = new JPanel();
painel.setLayout(layout);
  
GridBagConstraints posicao0 = new GridBagConstraints();  
posicao0.fill = GridBagConstraints.NONE;   
posicao0.insets = new Insets(10,10,10,10);
posicao0.anchor = GridBagConstraints.NORTHWEST;
JLabel codigo = new JLabel("Código:");
Color cor = new Color(00,60,33);
codigo.setForeground(cor);
posicao0.weightx = 0; 
painel.add(codigo, posicao0);
posicao0.fill = GridBagConstraints.NONE;   
posicao0.weightx = 1;   
posicao0.gridwidth = GridBagConstraints.REMAINDER;
txtCodigo = new JTextField(6);
txtCodigo.setForeground(Color.red);
txtCodigo.setFont(new Font("Arial",Font.BOLD,12));
painel.add(txtCodigo,posicao0);



GridBagConstraints posicao1 = new GridBagConstraints();  
posicao1.fill = GridBagConstraints.NONE;   
posicao1.insets = new Insets(10,10,10,10);
posicao1.anchor = GridBagConstraints.NORTHEAST;
JLabel data = new JLabel("Data:");
data.setForeground(cor);
posicao1.weightx = 3; 
posicao1.gridx = 1;
posicao1.gridy = 0;
painel.add(data, posicao1);
posicao1.fill = GridBagConstraints.NONE;   
posicao1.weightx = 0; 
posicao1.gridx = 2;  
posicao1.gridwidth = GridBagConstraints.REMAINDER;
JTextField txtData = new JTextField(8);
txtData.setFont(new Font("Arial",Font.BOLD,12));
painel.add(txtData,posicao1);



GridBagConstraints posicao2 = new GridBagConstraints();
posicao2.fill = GridBagConstraints.NONE;   
posicao2.insets = new Insets(10,10,10,10);
posicao2.anchor = GridBagConstraints.NORTHWEST;
JLabel nome = new JLabel("Nome:");
nome.setForeground(cor);
posicao2.weightx = 0; 
painel.add(nome,posicao2);
posicao2.fill = GridBagConstraints.NONE;   
posicao2.weightx = 0;   
posicao2.gridwidth = GridBagConstraints.REMAINDER;
JTextField txtNome = new JTextField(25);
txtNome.setFont(new Font("Arial",Font.BOLD,12));
painel.add(txtNome,posicao2);



GridBagConstraints posicao12 = new GridBagConstraints();  
posicao12.fill = GridBagConstraints.NONE;   
posicao12.insets = new Insets(10,10,10,10);
posicao12.anchor = GridBagConstraints.NORTHEAST;
ImageIcon icone3 = new ImageIcon("btnDependenetes.jpg");
JButton btnDependentes = new JButton(icone3);
btnDependentes.setForeground(cor);
posicao12.weightx = 0; 
posicao12.gridx = 2;
posicao12.gridy = 1;
posicao12.ipadx = 1;   
posicao12.ipady = 1;
painel.add(btnDependentes, posicao12);
btnDependentes.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
		
		Encapsulado enc = new Encapsulado();
		//Integer.parseInt(String.valueOf(Lancamentos.cai_codigo.getText()));
		enc.setComProtecao(Integer.parseInt(txtCodigo.getText()));	
		JOptionPane.showMessageDialog(null,enc.getComProtecao());
		
	}});

GridBagConstraints posicao3 = new GridBagConstraints();
posicao3.fill = GridBagConstraints.NONE;   
posicao3.insets = new Insets(10,10,10,10);
posicao3.anchor = GridBagConstraints.NORTHWEST;
JLabel rg = new JLabel("RG:");
rg.setForeground(cor);
posicao3.weightx = 0; 
painel.add(rg,posicao3);
posicao3.fill = GridBagConstraints.NONE;   
posicao3.weightx = 0;   
posicao3.gridwidth = GridBagConstraints.REMAINDER;
JTextField txtRg = new JTextField(15);
txtRg.setFont(new Font("Arial",Font.BOLD,12));
painel.add(txtRg,posicao3);

GridBagConstraints posicao4 = new GridBagConstraints();
posicao4.fill = GridBagConstraints.NONE;   
posicao4.insets = new Insets(10,10,10,10);
posicao4.anchor = GridBagConstraints.NORTHWEST;
JLabel cpf = new JLabel("CPF:");
cpf.setForeground(cor);
posicao4.weightx = 0; 
painel.add(cpf,posicao4);
posicao4.fill = GridBagConstraints.NONE;   
posicao4.weightx = 0;   
posicao4.gridwidth = GridBagConstraints.REMAINDER;
JTextField txtCpf = new JTextField(20);
txtCpf.setFont(new Font("Arial",Font.BOLD,12));
painel.add(txtCpf,posicao4);

GridBagConstraints posicao5 = new GridBagConstraints();
posicao5.fill = GridBagConstraints.NONE;   
posicao5.insets = new Insets(10,10,10,10);
posicao5.anchor = GridBagConstraints.NORTHWEST;
JLabel endereco = new JLabel("Endereço:");
endereco.setForeground(cor);
posicao5.weightx = 0; 
painel.add(endereco,posicao5);
posicao5.fill = GridBagConstraints.NONE;   
posicao5.weightx = 0;   
posicao5.gridwidth = GridBagConstraints.REMAINDER;
JTextField txtEndereco = new JTextField(30);
txtEndereco.setFont(new Font("Arial",Font.BOLD,12));
painel.add(txtEndereco,posicao5);

GridBagConstraints posicao6 = new GridBagConstraints();
posicao6.fill = GridBagConstraints.NONE;   
posicao6.insets = new Insets(10,10,10,10);
posicao6.anchor = GridBagConstraints.NORTHWEST;
JLabel cep = new JLabel("CEP:");
cep.setForeground(cor);
posicao6.weightx = 0; 
painel.add(cep,posicao6);
posicao6.fill = GridBagConstraints.NONE;   
posicao6.weightx = 0;   
posicao6.gridwidth = GridBagConstraints.REMAINDER;
JTextField txtCep = new JTextField(10);
txtCep.setFont(new Font("Arial",Font.BOLD,12));
painel.add(txtCep,posicao6);

GridBagConstraints posicao7 = new GridBagConstraints();
posicao7.fill = GridBagConstraints.NONE;   
posicao7.insets = new Insets(10,10,10,10);
posicao7.anchor = GridBagConstraints.NORTHWEST;
JLabel bairro = new JLabel("Bairro:");
bairro.setForeground(cor);
posicao7.weightx = 0; 
painel.add(bairro,posicao7);
posicao7.fill = GridBagConstraints.NONE;   
posicao7.weightx = 0;   
posicao7.gridwidth = GridBagConstraints.REMAINDER;
JTextField txtBairro = new JTextField(20);
txtBairro.setFont(new Font("Arial",Font.BOLD,12));
painel.add(txtBairro,posicao7);

GridBagConstraints posicao8 = new GridBagConstraints();
posicao8.fill = GridBagConstraints.NONE;   
posicao8.insets = new Insets(10,10,10,10);
posicao8.anchor = GridBagConstraints.NORTHWEST;
JLabel telefone = new JLabel("Telefone:");
telefone.setForeground(cor);
posicao8.weightx = 0; 

painel.add(telefone,posicao8);
posicao8.fill = GridBagConstraints.NONE;   
posicao8.weightx = 0;   
posicao8.gridwidth = GridBagConstraints.REMAINDER;
JTextField txtTelefone = new JTextField(10);
txtTelefone.setFont(new Font("Arial",Font.BOLD,12));
painel.add(txtTelefone,posicao8);

GridBagConstraints posicao9 = new GridBagConstraints();  
posicao9.fill = GridBagConstraints.NONE;   
posicao9.insets = new Insets(10,10,10,10);
posicao9.anchor = GridBagConstraints.NORTHEAST;
JLabel celular = new JLabel("Celular:");
celular.setForeground(cor);
posicao9.weightx = 0; 
posicao9.gridx = 1;
posicao9.gridy = 7;
painel.add(celular,posicao9);
posicao9.fill = GridBagConstraints.NONE;   
posicao9.weightx = 0; 
posicao9.gridx = 1;  
posicao9.gridwidth = GridBagConstraints.REMAINDER;
JTextField txtCelular = new JTextField(8);
txtCelular.setFont(new Font("Arial",Font.BOLD,12));
painel.add(txtCelular,posicao9);


GridBagConstraints posicao10 = new GridBagConstraints();
posicao10.fill = GridBagConstraints.NONE;   
posicao10.insets = new Insets(10,50,10,10);//posiciona os componentes 1ºB, 2ºD,3ºC,4E,
posicao10.anchor = GridBagConstraints.NORTHWEST;
posicao10.fill = GridBagConstraints.NONE;   
posicao10.weightx = 0; 
posicao10.gridx = 0;
posicao10.gridy = 8;
posicao10.ipadx = 5;   
posicao10.ipady = 5;
posicao10.gridwidth = GridBagConstraints.REMAINDER;
ImageIcon icone1 = new ImageIcon("btnCadastrar.jpg");
btnCadastrar = new JButton("Cadastrar",icone1);
btnCadastrar.setFont(new Font("Arial",Font.BOLD,12));
btnCadastrar.setForeground(cor);
painel.add(btnCadastrar,posicao10);


GridBagConstraints posicao11 = new GridBagConstraints();
posicao11.fill = GridBagConstraints.NONE;   
posicao11.insets = new Insets(10,10,10,50);
posicao11.anchor = GridBagConstraints.NORTHEAST;
posicao11.fill = GridBagConstraints.NONE;   
posicao11.weightx = 0; 
posicao11.gridx = 0;
posicao11.gridy = 8;
posicao11.ipadx = 5;   
posicao11.ipady = 5;
posicao11.gridwidth = GridBagConstraints.REMAINDER;
ImageIcon icone2 = new ImageIcon("btnAlterar.jpg");
JButton btnAlterar = new JButton(" Alterar ",icone2);
btnAlterar.setFont(new Font("Arial",Font.BOLD,12));
btnAlterar.setForeground(cor);
painel.add(btnAlterar,posicao11);



quadro.add(painel);
setSize(500,500);
setVisible(true);
setLocationRelativeTo(null);
setResizable(false);
}


public static void main(String[] args) {


Clientes cli = new Clientes();
cli.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}


class Encapsulado {
   
   private int codigo;	   

   public void setComProtecao(int codigo) {
       this.codigo = codigo;
   }

   public int getComProtecao() {
       return this.codigo;
   }
}

Talvez na classe Encapsulado sim. Entretanto, perceba que o método setComProtecao é público e a menos que esse seja realmente o objetivo, todas as classes do mesmo pacote poderá acessá-lo e modificar o atributo codigo. Mas isso é somente uma nota.

Abraço :lol:

Você pode atribuir qualquer valor a “ComProteção”?
O atributo é obrigatório ou o valor padrão é 0?

Uma vez atribuído, ele pode mesmo ser alterado?

O objetivo do encapsulamento é não permitir que um objeto acesse um atributo de outro objeto diretamente inserindo algum valor inválido para aquele atributo (me corrijam se eu estiver errado).

Você criou os métodos de acesso para ‘codigo’ na sua classe. Mas qualquer valor pode ser atribuido àquele atributo? Se sim, está certo. Normalmente, o set e o get são seguidos pelo nome do atributo, tipo, setCodigo e getCodigo, como boa prática.

E quanto a sua outra classe… tente não escrever construtores/métodos tão grandes como aquele. Classes tem 240 linhas e não um construtor. Tente dividí-lo em vários pequenos métodos, ajuda MUITO na hora de fazer manutenção.

O ideal é que a classe encapsule não só a representação física do atributo (no caso, o fato dele ser um int), mas também contenha toda a lógica de como usa-lo. Isso inclui não só verificações de tipo, mas também a gerência de seus estados (quando for o caso), o que garante um comportamento consistente em todo sistema. E é uma das principais razões pela qual gets e sets foram criados em primeiro lugar.

Por exemplo, considere a seguinte classe de semáforo (já dei esse exemplo várias vezes aqui):

[code]public class Semaforo {
public enum Cor {VERDE, AMARELO, VERMELHO};
private Cor cor;

   public Semaforo() { cor = Cor.VERDE };
   public void setCor(Cor cor) { this.cor = cor; }
   public void getCor() { return cor; }
}

[/code]

A presença do get e set garantem encapsulamento? Da representação física, até que sim. Poderíamos mudar o enum ali de dentro por um int, sem que os usuários da classe externa vissem, bastanto que mantivessemos os método gets e sets ainda usando a cor…

O enum garante o encapsulamento? Sim, ele não permite a atribuição de cores inválidas.

O que falta aí? A classe, desse jeito, permite que vc faça trocas de cores absurdas. Como do vermelho para o amarelo e depois para o vermelho novamente. Ou, permite até que nunca passe pelo amarelo.

Novamente, a parte física do atributo está encapsulada, mas sua lógica não. Suas trocas de estado não são garantidas.
O correto mesmo seria eliminar o método setter e trocar para um método chamado trocaCor(). Esse método trocaria cores sempre na ordem correta: Verde->Amarelo->Vermelho->Verde

http://blog.fragmental.com.br/2006/03/04/fowler-e-getters/

Pera, vc tem um metodo com quase 250 linhas, e ta perguntando sobre encapsulamento?!

http://www.refactoring.com/catalog/extractMethod.html

Pessoal na linha 97 sim, eu tenho um metodo…
Caso contrario o resto e uma tela de layout…
E quanto a pergunta sobre encapsulamento e referente as variaveis private JTextField etc…

R. Sim seu atributo está encapsulado, logo se vc precisar mudar a lógica dentro do método de acesso ao atributo vc tem toda a liberdade para alterar a logica ou fazer validação e qlqr coisa que vc precisar.
ex: o ’ int codigo’ não puder ser mais menor que zero, vc só mudara sua lógica dentro do método setComProtecao(int codigo).

Assim qdo vc encapsula o atributo vc força quem kiser usar ele utilizar seu método para acessar o atributo e assim passar pela lógica que esse método…

abr