Existem diversas
maneiras de instanciar um objeto em Java sem que um de seus
construtores seja executado. Estes objetos não são
seguros pois seu estado pode estar inconsistente ou em desacordo com
o invariante da classe (ver item “Usar classes não desserializáveis”).
É necessário garantir que os objetos usados na
aplicação estejam corretamente inicializados.
Para garantir que um
objeto tenha sido inicializado antes de usá-lo:
- Torne todas as
variáveis private,
conforme o item “Limitar acesso às variáveis, classes e métodos”.
- Declare os métodos
de acesso às variáveis final,
de acordo com as instruções do item “Tornar todos os métodos e classes “final””.
- Adicione uma
variável booleana privada (private
boolean) initialized
em sua classe.
- Adapte todos os
construtores para que atribuam o valor true
à variável initialized
como a última ação antes de retornarem.
- Faça com
que todos os métodos (exceto os construtores) verifiquem a
variável initialized
antes de executar. Caso a variável esteja com o valor false,
o método deve terminar com uma exceção. Métodos
usados pelos construtores não podem fazer esta verificação
e devem ser declarados privados (private).
A classe abaixo é
um exemplo da utilização destas regras:
public
class MyClass{
private boolean initialized =
false;
//outras variáveis
public MyClass (){
//inicialização das variáveis
method1();
initialized = true;
}
private void method1(){
//não verifica initialized
//código do método
}
public void method2() throws Exception {
if (initialized == false) throw new Exception(“Objeto não foi inicializado”);
//código do método
}
}
|