Uso de get e set

Olá pessoal, bom dia!

estava pesquisando no google sobre uso de set e get e não achei nada que deixasse muito claro
o uso de set e get, no que diz respeito as beans.

Qual a necessidade de usar set e get, ao invés de simplesmente utilizar atributos públicos?
Li algo sobre validação, mas a validação não é feita no controller, antes de instanciar a Bean para definir os valores dos atributos?
Li algo também sobre segurança no acesso, mas as outras classes do projeto teriam q ser zumbis para quebrar
a integridade…

Enfim, muitas dúvidas…hehehe

Por gentileza, postem suas considerações.

Abraços.

Estude sobre o conceito de encapsulamento.

++

No guj tem diversos tópicos sobre o assunto get e set

Esqueça o controller agora, isso é irrelevante para a sua dúvida, na verdade até atrapalha.

Foque nos conceitos de orientação a objetos.

Leia esse post do ViniGodoy sobre encapsulamento: http://www.guj.com.br/java/104592-heranca#564414

Até hoje não consegui descobrir isso amigo, a não ser em certas situações onde você precisa restringir a atribuição de valores à regras específicas do seu negócio.

Mas relacionado aos JavaBeans acho que isso é uma convenção.

[quote=ul1sses]Até hoje não consegui descobrir isso amigo, a não ser em certas situações onde você precisa restringir a atribuição de valores à regras específicas do seu negócio.

Mas relacionado aos JavaBeans acho que isso é uma convenção.[/quote]

tb achei isso…questão de convenção…
se vc tem o set… q modifica… pq nao ser public? =/
e spring, vraptor td esse padrão…
se vc for ver é uma montueira de code, tanto que os IDE’s fizeram “Generate getters e setters”
sinal q é algo só de praxe msmo.

public class MyBean {
     
    private int id;
    private String nome;
     
    public MyBean() {
         
    }
     
    public String getNome() {
        return a;
    }
     
    public void setNome(String nome) {
        this.nome = nome;
    }
     
    public String getId() {
        return id;
    }
     
    public void setId(int id) {
        this.id = id;
    }
     
}

encapsulamento é de praxe?

você chegou a ler o post que te mandei?

Claro que você não vai criar getters e setters pra todos os seus atributos, isso é uma prática terrível, mas acessar os atributos diretamente é pior ainda.

[quote=claudioivp][quote=ul1sses]Até hoje não consegui descobrir isso amigo, a não ser em certas situações onde você precisa restringir a atribuição de valores à regras específicas do seu negócio.

Mas relacionado aos JavaBeans acho que isso é uma convenção.[/quote]

tb achei isso…questão de convenção…
se vc tem o set… q modifica… pq nao ser public? =/
e spring, vraptor td esse padrão…
se vc for ver é uma montueira de code, tanto que os IDE’s fizeram “Generate getters e setters”
sinal q é algo só de praxe msmo.

[code]
public class MyBean {

private int id;
private String nome;
 
public MyBean() {
     
}
 
public String getNome() {
    return a;
}
 
public void setNome(String nome) {
    this.nome = nome;
}
 
public String getId() {
    return id;
}
 
public void setId(int id) {
    this.id = id;
}

}
[/code][/quote]
Sinceramente, entender encapsulamento como “uma montoeira de código” é algo que me deixa transtornado.
Este é um conceito da orientação a objetos, não está ligado apenas ao java, mas, a toda linguagem que se denomine orientada a objetos.

Vamos supor que você possua somente atributos public em suas classes. Sabe-se que atributos públicos são herdados e os seus valores são alterados apenas referenciando o objeto e a respectiva variável.

public class A{
   public int x;
   public A(){
     x = 0;
   }
}

A primeira e mais simples coisa que se pode fazer é, através de herança, quebrar qualquer integridade que a sua classe possa ter, sem o uso de getters e setters e atributos públicos.

public class B extends A{
   public B(){
     x = 10;
   }
}

Isto me permitiria substituir coisas que necessitassem que x tivesse valor 0, ocasionando uma falha no sistema (E não, as classes não precisam ser zumbis).
Aí você pergunta, “ok, mas o que o setter tem de tão mais seguro, se é público?”
Não preciso definir o setter de um atributo que apenas fornecerá um valor definido. Posso ter apenas seu getter.
E, se não quero que alguém saiba quais valores um determinado atributo pode possuir, eu omito o getter e forneço apenas um setter. Você pode fazer isso com variáveis públicas?

Neste link tem uma definição bem sintetizada e até certo ponto bacana.

Eu, particulamente, não sou adepto ao uso irracional de getters and setters. Se eu não preciso, nem vai fugir da minha regra de negócio, eu acesso diretamente.

Não estou dizendo que o encapsulamento é desnecessário, claro que não é, mas dizer que acessar qualquer valor diretamente é terrível… parei por aqui.

Já bastam as discussões entre nossas equipes aqui onde trabalho. hehe

Mas é como o Vini falou no post citado aqui: Nem tudo faz sentido para a visão de um programador solitário, mas para a visão de uma equipe de desenvolvimento sim.

Então lhe digo que é preferível você fazer como todo mundo faz.

Manero!
fico bem definido agora pra mim quando usar!
obrigado a todos!

[quote=claudioivp]Olá pessoal, bom dia!

estava pesquisando no google sobre uso de set e get e não achei nada que deixasse muito claro
o uso de set e get, no que diz respeito as beans.

Qual a necessidade de usar set e get, ao invés de simplesmente utilizar atributos públicos?
Li algo sobre validação, mas a validação não é feita no controller, antes de instanciar a Bean para definir os valores dos atributos?
Li algo também sobre segurança no acesso, mas as outras classes do projeto teriam q ser zumbis para quebrar
a integridade…

Enfim, muitas dúvidas…hehehe

Por gentileza, postem suas considerações.

Abraços.[/quote]

A primeira coisa a entender é o conceito de Propriedade. Um atributo e uma propriedade não são a mesma coisa.
Normalmente trabalhamos com propriedades e usamos atributos privados para guardar os valores da propriedade. Isto não é uma necessidade ( poderiamos usar um Map, por exemplo) é simplesmente mais prático.

Uma vez entendido o conceito de Propriedade , ha que entender o conceito de conjunto de propriedade (padrão Property Bag) e como um objeto simples pode ser usado como um Property Bag.

O uso de métodos acessores (get) e modificadores (set) da propriedade são um padrão de nomenclatura em java derivado da tecnologia JavaBean. O seu objetivo é criar um contrato para definição da propriedade e encapsular a implementação. Graças a este encapsulamento coisas como o hiberante são possiveis.
Outras linguagens , como C#, têm mecanismos especiais para declarar propriedades. Em java isso não é necessário.

Os métodos modificadores não fazem validação no sentido que vc pensa. Eles fazem consistencia. Portanto, vc tem razão, a validação é feita pelo controler , ou qualquer outro objeto que não o bean. O que o set faz é consistencia. Isto é muito raro na prática.

Em relação à segurança é preciso entender que estamos falando de controle de acesso entendido como visibilidade em java e não a questão de usuários e permissões.
O uso de get/set publico permite que a implementação ( normalmente um atributo, mas não necessáriamente) seja privada. O get/set pode até ser protected em vez de publico mas o atributo sempre tem que ser private (deixar o atributo protected para ser acessado por uma classe filha é um erro de design)

Na prática, os beans de dados java são implementações de PropertyBag e são totalmente burros no sentido de controlar regras.

[quote=sergiotaborda][quote=claudioivp]Olá pessoal, bom dia!

estava pesquisando no google sobre uso de set e get e não achei nada que deixasse muito claro
o uso de set e get, no que diz respeito as beans.

Qual a necessidade de usar set e get, ao invés de simplesmente utilizar atributos públicos?
Li algo sobre validação, mas a validação não é feita no controller, antes de instanciar a Bean para definir os valores dos atributos?
Li algo também sobre segurança no acesso, mas as outras classes do projeto teriam q ser zumbis para quebrar
a integridade…

Enfim, muitas dúvidas…hehehe

Por gentileza, postem suas considerações.

Abraços.[/quote]

A primeira coisa a entender é o conceito de Propriedade. Um atributo e uma propriedade não são a mesma coisa.
Normalmente trabalhamos com propriedades e usamos atributos privados para guardar os valores da propriedade. Isto não é uma necessidade ( poderiamos usar um Map, por exemplo) é simplesmente mais prático.

Uma vez entendido o conceito de Propriedade , ha que entender o conceito de conjunto de propriedade (padrão Property Bag) e como um objeto simples pode ser usado como um Property Bag.

O uso de métodos acessores (get) e modificadores (set) da propriedade são um padrão de nomenclatura em java derivado da tecnologia JavaBean. O seu objetivo é criar um contrato para definição da propriedade e encapsular a implementação. Graças a este encapsulamento coisas como o hiberante são possiveis.
Outras linguagens , como C#, têm mecanismos especiais para declarar propriedades. Em java isso não é necessário.

Os métodos modificadores não fazem validação no sentido que vc pensa. Eles fazem consistencia. Portanto, vc tem razão, a validação é feita pelo controler , ou qualquer outro objeto que não o bean. O que o set faz é consistencia. Isto é muito raro na prática.

Em relação à segurança é preciso entender que estamos falando de controle de acesso entendido como visibilidade em java e não a questão de usuários e permissões.
O uso de get/set publico permite que a implementação ( normalmente um atributo, mas não necessáriamente) seja privada. O get/set pode até ser protected em vez de publico mas o atributo sempre tem que ser private (deixar o atributo protected para ser acessado por uma classe filha é um erro de design)

Na prática, os beans de dados java são implementações de PropertyBag e são totalmente burros no sentido de controlar regras.[/quote]

hm cara… vc abordou exatamente o contexto q eu queria… :smiley: muito bom!