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?
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.
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??
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.