-
Trabalhar com padrões dentro
da programação é muito importante.
-
Nós vamos ver agora
um pouquinho de JavaBeans,
-
que é a forma de padronizar
a implementação do conceito
-
de encapsulamento
de orientação a objetos.
-
Na programação Java,
é usual criarmos classes
-
para que essas classes
possam gerar objetos
-
a serem reutilizados
em vários outros sistemas.
-
A especificação JavaBeans padroniza
justamente a criação dessas classes,
-
que nós batizamos
de classes beans.
-
Para fazer uma classe Java
ser uma classe JavaBeans,
-
você precisa seguir
três regras.
-
A primeira, é que essa classe precisa
implementar um construtor padrão
-
mesmo que você tenha
um construtor de classe.
-
Por quê? Porque outras APIs
vão se utilizar desse construtor padrão
-
para criação
de um JavaBean.
-
A segunda regra é o conceito
de encapsulamento.
-
É necessário você encapsular
os atributos, ou seja,
-
proteger esses atributos
e permitir que outros métodos
-
acessem sim
esses atributos.
-
E a terceira regra que,
na realidade, é uma boa prática,
-
é você implementar
a interface Serializable.
-
Essa interface vai marcar aquela classe
como uma classe serializável.
-
O que significa isso?
-
Todos os dados que estiverem
contidos no objeto
-
serão transformados em bits
para serem trafegados
-
sem que a informação
seja tão transparente.
-
Para entender um pouquinho mais
a criação de uma classe
-
no padrão JavaBeans, vou criar
uma nova classe chamada "pessoa"
-
dentro do projeto
do sistema bancário.
-
Vou clicar no pacote aqui
com o botão direito,
-
opção New,
opção Class.
-
Vou nomear a classe
com o nome pessoa e dar um finish.
-
Essa classe, por hora,
é uma classe comum.
-
Mas eu vou criar o atributo
nome da pessoa,
-
só que eu já vou criar
no padrão JavaBeans,
-
ou seja, eu vou encapsular
o atributo nome
-
para que nenhuma outra classe
externa altere esse nome.
-
Então, eu declaro
o modificador private,
-
declaro o atributo
nome do tipo String,
-
e ele está
protegido.
-
Nenhuma outra classe
consegue alterar esse atributo.
-
Mas eu preciso,
de alguma forma,
-
fazer com que esse
atributo seja alterado,
-
mas simplesmente por algum
método da própria classe.
-
É aí que eu utilizo
os métodos padrões
-
chamados
getters and setters.
-
O método get vai ser responsável
por obter aquela informação
-
e o método set por alterar
aquela informação.
-
Então, eu venho aqui
e defino esses métodos.
-
Vou definir manualmente
e depois eu vou mostrar
-
como fazemos
automaticamente.
-
Ambos os métodos têm
modificadores públicos
-
justamente para serem acessados
fora do escopo dessa classe.
-
O método get vai retornar
o tipo de dado
-
justamente do atributo em questão,
que é o atributo nome.
-
Então, vai ter um retorno String
e o nome vai ser "getNome".
-
Ele não vai ter
nenhum parâmetro,
-
e a grande lógica dele é retornar
o nome daquele atributo da pessoa.
-
Vou criar aqui também
o que chamamos de método set.
-
Esse método não vai
ter nenhum retorno.
-
Vai ter o prefixo set mais o nome
do atributo que eu quero trabalhar,
-
e ele tem que receber
como parâmetro
-
o novo nome
que será associado.
-
E a lógica
desse método é:
-
eu alterar o atributo
nome da classe
-
pelo novo nome
que veio de parâmetro.
-
Nesse exemplo, nós criamos
então o atributo nome, privado,
-
e demos dois métodos
de acesso a esse atributo nome.
-
Você pode pensar:
"Poxa, mas esses métodos
-
estão simplesmente
fazendo o acesso
-
de obter e de alterar
a informação".
-
Ok, mas eu posso colocar
mais lógicas dentro dos métodos,
-
ou seja, o atributo não vai ser
acessado diretamente,
-
mas esses métodos podem,
além de alterar o atributo,
-
fazer outras lógicas
a respeito desse atributo.
-
E para que essa classe
realmente tenha
-
a característica
de uma classe JavaBeans,
-
eu preciso implementar
a interface Serializable,
-
que vai marcar aquela classe
como uma classe serializável.
-
Então, eu adiciono lá
o implements,
-
adiciono a interface
Serializable,
-
que está dentro
do pacote java.io.
-
E, com isso, essa classe já é
marcada como serializável,
-
ou seja, quando eu gerar
um objeto a partir dessa classe pessoa,
-
as informações desse objeto
serão serializáveis,
-
transformadas, de fato, em pacotes de bits
para serem trafegados pela rede.
-
Note que, ao implementar
a interface Serializable,
-
aparece em amarelinho
o nome da classe.
-
Isso significa o quê?
-
Que a classe está requisitando
algum identificador de serialização.
-
Por que isso acontece?
-
Porque eu posso ter num mesmo
ambiente de memória
-
mais de um objeto da classe pessoa
com versões diferentes.
-
Então, com isso, eu consigo identificar
qual versão é aquele objeto
-
para que os objetos
não se confundam.
-
Então, eu posso simplesmente pegar
a opção que o próprio Eclipse me dá,
-
que é adicionar
um default serialVersionUID.
-
E aí você pode
colocar a identificação
-
que melhor for compatível
com o seu projeto.
-
Agora, eu vou
fazer o seguinte:
-
vou alterar o código
do meu sistema bancário
-
da classe conta
e da classe teste
-
para ser colocado
no padrão de JavaBeans.
-
Vou acessar
a minha classe conta,
-
e na classe conta eu vou fazer
as devidas alterações.
-
A primeira coisa que eu devo fazer
é deixar encapsulado todos os atributos.
-
Então, eu vou colocar
o assessor private
-
em todos os atributos
do escopo da minha classe.
-
Então, private dentro de agência,
para o número da conta e para o saldo.
-
Dessa forma, nenhuma dessas informações
pode ser alterada diretamente.
-
Notem que, logo que eu
protejo esses atributos,
-
a classe teste
passa a dar erro.
-
Por quê? Porque tanto o saldo,
quanto a agência, quanto o número,
-
não são mais acessíveis
diretamente.
-
E isso está ok.
-
Outra coisa que eu
preciso fazer aqui
-
é trabalhar com os métodos
getters and setters.
-
Mas é claro que eu
preciso identificar
-
se todos eles são válidos
de serem colocados ou não.
-
Por exemplo: eu posso permitir
a alteração de um saldo diretamente?
-
Ou esse saldo só pode
ser atualizado
-
através de um depósito
ou de uma retirada?
-
Nesse caso, eu não preciso
ter um método setSaldo,
-
mas eu posso ter
um método getSaldo.
-
E aqui eu também posso ter
os métodos setAgencia, getAgencia,
-
setNumero, getNumero.
-
Nós podemos fazer essas
alterações na programação
-
ou eu posso fazer a geração
automática dos getters and setters.
-
Para fazer a alteração automática
dos getters and setters,
-
eu posso fazer
de duas maneiras.
-
Eu posso clicar com o botão
direito no código,
-
ir à opção Source,
Generate Getters and Setters,
-
ou, ainda, através
do atalho Ctrl + Shift + S.
-
Uma vez selecionada a opção
Generate Getters and Setters,
-
eu seleciono quais os atributos
que eu quero gerar os getters and setters.
-
Nesse caso, eu quero simplesmente
gerar da agência e do número.
-
Clico em ok, e ele
gera automaticamente
-
os métodos getAgencia,
setAgencia,
-
getNumero,
setNumero.
-
"Mas, professor, e o método
getSaldo e setSaldo?".
-
Nesse caso, para fazer
as devidas adaptações,
-
eu vou simplesmente
substituir
-
o nome do método
verificarSaldo para getSaldo,
-
e a alteração do saldo
já está sendo realizada
-
através dos métodos
retirar e depositar.
-
Portanto, eu não preciso
criar o método setSaldo.
-
Para que essa minha classe
vire, de fato, um JavaBean,
-
eu ainda preciso implementar
a interface Serializable.
-
Então, basta fazer
o implements
-
na interface
Serializable.
-
Eu posso completar
com um Ctrl + espaço,
-
e também posso implementar
o meu controle de versão.
-
Pois bem, agora vamos
adaptar a classe teste
-
para que ela possa
usar a classe conta
-
da maneira correta
no padrão de JavaBeans.
-
Então, ao invés de eu acessar
diretamente o atributo,
-
eu posso simplesmente
setar essas informações.
-
Ao invés de colocar
o saldo como 50,
-
então eu vou setar
o método depositar...
-
... com o valor 50.
-
Então, não vai ser mais possível
eu alterar diretamente um atributo.
-
Também vou dar
um set na agência
-
passando o valor daquela
agência dentro do método
-
e também o número da conta
através do método setNumero.
-
Com isso, quaisquer lógicas
que eu tenha que fazer
-
dentro da alteração de uma agência
ou dentro da alteração de um número,
-
ou até no saldo, eu consigo fazer dentro
desses métodos previamente criados,
-
gerando assim, uma segurança
e uma melhor manutenção.
-
E uma última alteração
a ser realizada aqui
-
é alterar o método
verificarSaldo para getSaldo
-
em ambos os objetos
que estamos trabalhando.
-
"Ah, professor, eu preciso alterar
alguma coisa do construtor de classe?".
-
Nesse caso, não, porque o construtor
de classe já está utilizando
-
e alterando os atributos
da própria classe.
-
Vou realizar o teste aqui,
e é possível verificar
-
que não houve alteração
no resultado.
-
Simplesmente
implementamos um padrão
-
que é muito utilizado
no mercado de programação Java.
-
Duas dicas muito importantes
a respeito do padrão JavaBeans.
-
Primeira: nem todas as classes
devem ser colocadas nesse padrão.
-
Somente aquelas classes
que carregam informações,
-
ou seja, que serão gerados
objetos em memória
-
para armazenar
e carregar informações.
-
E a segunda dica é que,
toda essa estrutura de padrões,
-
não deve ser pensada
diretamente na programação.
-
Isso pode ser realizado
durante a análise do sistema
-
desde o ato da criação
de diagramas de classes,
-
onde eu já consigo identificar
toda a parte de construtores,
-
de encapsulamento, e também
da geração dos métodos.