Projeto para casa em java: Private(-) e Public(+)

Projeto para casa em java: Private(-) e Public(+)

by Victor Sanches Portella -
Number of replies: 4

Olá,

Estava lendo um pouco, e vi que no diagrama de classes, (-) significa
atirbuto/método private e (+) significa public. Não sei se estamos seguindo
esse padrão. Assim, no projeto, todos os atributos seriam private, deixando
mais chato de se fazer a coisa em geral (varios getters e setters...).

Podemos ignorar essa simbologia?

In reply to Victor Sanches Portella

Re: Projeto para casa em java: Private(-) e Public(+)

by Thiago Pereira Bueno -

Acho que permitir que os atributos sejam public violaria o encapsulamento da classe... 

Talvez pelo menos permitir que os atributos possam ser protected (#)  no caso da hierarquia do Funcionario já ajudaria... thoughtful

In reply to Victor Sanches Portella

Re: Projeto para casa em java: Private(-) e Public(+)

by Marco Aurélio Gerosa -

Uma boa prática para melhorar o encapsulamento e ter maior controle sobre acessos aos dados é deixar os atributos privados e prover acesso por meio de getters e setters. O Eclipse gera para você automaticamente os getters e setters:

http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Freference%2Fref-dialog-gettersetter.htm

abraço

In reply to Marco Aurélio Gerosa

Re: Projeto para casa em java: Private(-) e Public(+)

by Thiago Pereira Bueno -

Seria então para seguir a risca e manter todos os atributos privados ??

Para a hierarquia de classes Funcionario-Vendedor-Secretaria não faria sentido promover os atributos para protected ??

In reply to Thiago Pereira Bueno

Re: Projeto para casa em java: Private(-) e Public(+)

by Gustavo Ansaldi Oliva -

Sim, mantenha todos os atributos privados. A hierarquia, contudo, é uma exceção: promova os atributos de funcionario para "protected". Um resumo sobre os níveis de acesso em Java pode ser encontrado aqui: http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

E por que encapsulamos atributos via métodos get/set? Existem várias situações que justificam isso. Imagine, por exemplo, que você tem uma classe "Pagina" que tem um atributo chamado "conteudo" que armazena o texto dessa pagina. Se esse conteúdo for grande (muito texto), talvez seja interessante comprimir (compactar) esse texto e guarda-lo na forma de um atributo do tipo byte[]. Contudo, você não quer que as outras classes que dependem de Pagina tenham que lidar com um array de bytes. Portanto, no "getter" desse método, a classe Pagina pode descompactar o texto on-the-fly e devolver uma String pra quem pediu (note que é alguma outra classe que descompacta o texto em si, já que não é responsabilidade da classe Pagina saber como compactar e descompactar textos). Feito isso, ela devolve a String pra quem pediu (embora o atributo continue sendo o array de bytes). O Setter age de modo análogo. Portanto, nesse caso, usamos getter/setter pra esconder a complexidade e simplificar a interface da classe Página. Se você não tivesse os getters/setters desde o começo, o seu código estaria com esse array de bytes espalhado por todos os lados e ficaria bem mais complicado de arrumar. Por isso, colocamos getters/setters desde o começo.

Uma reflexão importante, por outro lado, é que embora getters e setters aumentem o encapsulamento, esse aumento não é muito alto (principalmente quando o Get é público). Alguns atributos são internos a uma classe e só fazem sentido no escopo dela. Nesses casos, o atributo é privado e não há nem get e nem set para esse atributo. Sempre tente manter o nível de encapsulamento alto, pois isso torna o seu código mais previsível e mais fácil de manter.