Por que não objetos públicos ao invés de getters e setters?

Logo quando comecei a programar em Java, fui ensinado que objetos publicos são imperdoáveis, são como as variaveis globais da programacao estruturada, e que eu nunca deveria usar.

Mas tenho um amigo que vive dizendo que setters e getters sao inuteis, que deve-se usar objetos publicos.

Então, desapegando-se um pouco aos padroes, gostaria de propor essa discussão. Há realmente vantagem em fazer getters e setters ao inves de objetos publicos? E quais sao as vantagens?

Valeu!

acho que setters e getters são uteis qdo se usa reflection e caso seja necessario algum tipo de tratamento

Existe varias vantagens como o colega pm ja citou algumas…

usando gets/sets ao inves de atributos publicos, sua classe tem total
(pelo menos deveria) controle sobre o seu estado…

Digamos que sua classe tenha um atributo public. Isso quer dizer que
qualquer um pode alterar o valor desse atributo com o valor que
bem entender, sem sua classe ao menos saber que foi alterada.

Entao você pode, ao inves de deixa-lo publico, criar um método que
altere seus valores, e pode colocar nesses métodos algum tipo de validação,
pode executar alguma ação informando a outras classes que seu estado
mudou, pode fazer log do que mudou, etc, enfim, tem controle do que
está acontecendo.

Mas use com moderação. Não saia criando get/set pra tudo.

Recomendo dar uma passada nesse post
http://www.guj.com.br/posts/list/20668.java

[]´s

Objetos públicos = atributos públicos?

Pessoal,

Poxa, era só eu ter pensado um pouco, e não faria essa pergunta mané!!!

hehe, valeu pessoal!

Realmente está pergunta ñ tem muito sentido, ñ querendo tirar de ninguém, mas bastava ter pensado um pouco p/ descobrir inumeros motivos pelos quais vc ñ deve usar atributos publicos, embora sempre existirão as exeções.

Agora imagine q uma classe Pessoa possua um atributo idade e imagine q este atributo é publico como vc impediria isto

Pessoa p = new Pessoa(); p.idade = -10000000;

Ou se tivesse uma classe cujos objetos renderizam imagens em um janela de acordo com seu estado interno, como está os objetos desta classe ficariam sabendo q seu estado interno mudou se seus atributos forém publicos??

O ideal é não ter atributos públicos, getters ou setters. Expor o estado interno do teu objeto é sempre uma péssima idéia.

Olá Davi,

seu amigo disse isso pq ele deve ter lido o livro J2EE Design Pattern, sobre Transfer Object. Eu só não sei de onde ele tirou o “inutil”! :?

Uma vez eu já até pensei em usar atributos publicos para evitar qualquer tipo de regra de negocio espalhado nos getter/setter, já que era uma prática muito comum nessa empresa onde trabalhava, o que tornava dificil a manutenção. Mas logo desisti da idéia quando eu vi que atributos publicos não funciona com JSTL (é necessário ter getter/setter!).

Por isso, como o proprio livro diz, tem que analisar para decidir qual método usar. Como eu sou fã do JSTL, sempre preferi getter/setter.

Espero ter ajudado!