Declarando tudo como public

Pessoal, gostaria de saber de vocês que têm mais chão percorrido, há alguma razão especial para não se declarar tudo como public?
Tive esta dúvida hoje pois tive que declarar os componentes de um form como public para serem alterados por um método que está em outro package…
Aguardo seus comentários, abraços.

Todas as razões que você conseguir imaginar e mais um pouco.

Um dos princípios de um bom projeto OO é o encapsulamento. Outro é a alta coesão. Outro é o baixo acoplamento (ainda não escrevi sobre esse =) ).

Para começar, indicaria a você a leitura do Fundamentals of Object-Oriented Design in UML do Meilir Page-Jones. Depois, desse aqui.

Neles tem todas as razões que você precisa para adotar o encapsulamento. Vou começar o segundo já já. Estou só esperando chegar a encomenda da Amazon.

Bons estudos.

Faça uma busca no fórum por Encapsulamento que você encontrará muitas opiniões a respeito.

Bah pessoal segui as dicas de vocês e li o artigo do nosso amigo celso.martins, porém isto me deixou ainda mais confuso, porque estou mais no início mesmo e lá tratam-se de assuntos bastante avançados pra minha cabecinha…
Afinal, se eu usar todos os meus objetos de um determinado form como PUBLIC, qual será o problema gerado por isto?
Para um programinha de pequena proporção isto influi ou é somente para grandes softwares…?
Me sinto um homenzinho das cavernas no meio de tanta gente culta, hehehe!
Obrigado de novo!

Cara, tudo tem que ter um início. Você está precisando de conceitos de OO.

:arrow: Estes conceitos não dizem respeito a aplicações pequenas, médias ou grandes. Dizem respeito a engenharia de software.
:arrow: Como eu já disse por aqui há algum tempo atrás, nunca vi uma aplicação pequena que continuasse pequena ao longo do seu ciclo de vida. Normalmente ela cresce.

Os livros que te sugeri podem te ajudar bastante. Não desconsidere essa dica.

Mas se você quer algo mais imediato, tem essa apostila da Caelum. Com certeza ela dissipará muitas nuvens.

Mas seja persistente. Se não conseguir entender de primeira, leia novamente e novamente e novamente. Depois que os conceitos básicos estiverem sedimentados, tudo correrá naturalmente.

Outros posts do meu blog podem te ajudar também. Pesquise e leia muito. Essa é a melhor dica que posso te dar.

EDIT: Não só o meui blog pode te ajudar como outros também. Lá no meu tem uma lista dos blogs que acompanho. Fique a vontade para “roubar” os links.

[quote=celso.martins]Cara, tudo tem que ter um início. Você está precisando de conceitos de OO.

:arrow: Estes conceitos não dizem respeito a aplicações pequenas, médias ou grandes. Dizem respeito a engenharia de software.
:arrow: Como eu já disse por aqui há algum tempo atrás, nunca vi uma aplicação pequena que continuasse pequena ao longo do seu ciclo de vida. Normalmente ela cresce.

Os livros que te sugeri podem te ajudar bastante. Não desconsidere essa dica.

Mas se você quer algo mais imediato, tem essa apostila da Caelum. Com certeza ela dissipará muitas nuvens.

Mas seja persistente. Se não conseguir entender de primeira, leia novamente e novamente e novamente. Depois que os conceitos básicos estiverem sedimentados, tudo correrá naturalmente.

Outros posts do meu blog podem te ajudar também. Pesquise e leia muito. Essa é a melhor dica que posso te dar.

EDIT: Não só o meui blog pode te ajudar como outros também. Lá no meu tem uma lista dos blogs que acompanho. Fique a vontade para “roubar” os links.[/quote]
Humm, vou seguir este teu conselho sim cara e vou fazer o que você sugeriu. Parece que você tem longa esperiência na área então acredito que o que falou seja válido.
Vou adicionar um link no meu blog para o seu para acompanhá-lo.
Queria ter uma resposta simples de imediato para continuar arquitetando meu programinha aqui mas como já mencionei se você diz que devo entender bem o conceito da coisa é porque deve ser. Vamos lá!
Muito obrigado pelos conselhos!

Um dos principais conceitos de OO é o encapsulamento, ao declarar todos os atributos da classe como public o conceito de empsular a informacão é violado.
Ao definir os atributos da classe como public, outros códigos java podem acessá-los diretamente. :wink:

Como algumas pessoas gostam de analogias(eu não gosto pq na maioria das vezes elas são tendenciosas), vou te dar uma:
imagina que vc é uma instância da classe Pessoa
uma pessoa tem um objeto ContaBanco
vc gostaria que outra Pessoa(Joãozinho, por exemplo) pudesse roubar a sua ContaBanco ???
seria mais ou menos isso:

Pessoa voce = .......;
Pessoa joaozinho = new Pessoa();
joaozinho.contaBanco = voce.contaBanco;
voce.contaBanco = null;

a partir desse ponto, vc não tem mais conta no banco, e o Joãozinho é quem pode mexer na sua conta
Perigoso, não é?

Como os colegas ja disseram voce quebrara o encapsulamento. E vai deixar tuas classes totalmente acopladas.
E nao tem dessa de projetinho pequeno, se voce ja começar errado desde o principio, depois vai ficar preso nesta metodologia e nao vai mais querer fazer da forma correta.

Para o teu caso, o padrao é que apenas a propria classe(teu form) tenha a capacidade de alterar alguma coisa dela mesmo, tipo um estado de algum componente da tela. Entao como voce precisa que isto seja feito por outras classes(a exemplo de um controller) entao voce faz metodos publicos para fazerem isto pra voce.

tipo assim:

public class TeuForm {
    private JLabel status;
    private JTextField nome;
    ...
    ...


    public void alteraStatus(String newStatus) {
        this.status.setText(newStatus);
    }
}


Entao na tua outra classe

public class TuaOutraClasse{
    ...
    ...
    teuForm.alteraStatus("Blz agora estou fazendo da forma correta");
}

[quote=fredferrao]Como os colegas ja disseram voce quebrara o encapsulamento. E vai deixar tuas classes totalmente acopladas.
E nao tem dessa de projetinho pequeno, se voce ja começar errado desde o principio, depois vai ficar preso nesta metodologia e nao vai mais querer fazer da forma correta.

Para o teu caso, o padrao é que apenas a propria classe(teu form) tenha a capacidade de alterar alguma coisa dela mesmo, tipo um estado de algum componente da tela. Entao como voce precisa que isto seja feito por outras classes(a exemplo de um controller) entao voce faz metodos publicos para fazerem isto pra voce.

tipo assim:

public class TeuForm {
    private JLabel status;
    private JTextField nome;
    ...
    ...


    public void alteraStatus(String newStatus) {
        this.status.setText(newStatus);
    }
}


Entao na tua outra classe

public class TuaOutraClasse{
    ...
    ...
    teuForm.alteraStatus("Blz agora estou fazendo da forma correta");
}

[/quote]

Humm… Então agora começo a compreender, é que eu não estava vendo problemas nisso pois estava tendo o seguinte princípio: “Uma outra classe não poderá fazer alterações que eu não tenha programado…”
Mas acho que agora começou a fazer sentido…
Muito obrigado amigos fredferrao, clone_zealot, Marcio_Nogueira, celso.martins e francilson.
Mas e se eu quiser alterar um estado… Por exemplo quero usar o seguinte comando através deste meu outro método que está em outro package:

tfCodigo.setEditable(false);

Então ele não retornaria um String, int ou boolean, né? Como é que eu poderia declarar o método public que ficaria dentro da classe onde há o tfCodigo?
Obrigado de novo, um abraço!

[quote=ronaldoo]
Humm… Então agora começo a compreender, é que eu não estava vendo problemas nisso pois estava tendo o seguinte princípio: “Uma outra classe não poderá fazer alterações que eu não tenha programado…”
Mas acho que agora começou a fazer sentido…
Muito obrigado amigos fredferrao, clone_zealot, Marcio_Nogueira, celso.martins e francilson.
Mas e se eu quiser alterar um estado… Por exemplo quero usar o seguinte comando através deste meu outro método que está em outro package:

tfCodigo.setEditable(false);

Então ele não retornaria um String, int ou boolean, né? Como é que eu poderia declarar o método public que ficaria dentro da classe onde há o tfCodigo?
Obrigado de novo, um abraço!
[/quote]

public void setaEditavel(Boolean editavel){
    tfCodigo.setEditable(editavel);
}

Porem geralmente voce nao vai ter isto pra cada componente, senao tu teria uns trocentos metodos, geralmente voce seta o estado da tela, por exemplo

 public class TeuForm {  
     private JLabel status;  
     private JTextField nome;  
     ...  
     ...  
     public static final int CONSULTANDO = 0;
     public static final EDITANDO = 1;
     public static final  = INSERINDO = 2;
     //quantos mais voce tiver
     ...
     ...
   
   
     public void alteraStatus(int newStatus) {  
          switch(newStatus) {
               case TeuForm.CONSULTANDO:
                    tfCodigo.setEditable(false);
                    tfOutroCampo.setEditable(false);
                    tfMaisUmCampo.setEditable(true);
                    lbStatus.setText("Consultando");
                    ...
               case TeuForm.EDITANDO:
                    tfCodigo.setEditable(true);
                    tfOutroCampo.setEditable(true);
                    tfMaisUmCampo.setEditable(true);
                    lbStatus.setText("Editando");
               ...
               ...
              
     }  
 }  


e entao voce setaria o status atual na outra classe

 public class TuaOutraClasse{  
     ...  
     ...  
     teuForm.alteraStatus(TeuForm.EDITANDO);  
 }

É, na engenhoca que fiz aqui ainda não funcionou do jeito certo… Agora está dando vários erros de listener não sei o quê… Vou dar uma olhada aí no fórum e qualquer coisa se não achar eu pergunto aqui, obrigado de novo !