Você pode usar a inicialização lenta.
Na programação de computadores, a inicialização lenta é a tática de atrasar a criação de um objeto, o cálculo de um valor ou algum outro processo caro até a primeira vez que for necessário.
Dessa forma, você evita o acoplamento temporal, o que significa que o consumidor de sua classe precisa chamar certos métodos em uma certa ordem. Ter que ligar start()
primeiro é uma maneira de saber como a classe funciona internamente, o que é ruim, porque você pode mudar isso no futuro.
Atraso na inicialização cara até que seja necessário primeiro.
Exemplo:
public class FooClass{
private ExpensiveResource resource;
private CheapResource cheap;
public FooClass(String someParameter){
// constructor: initialize CheapResource cheap
// but NOT ExpensiveResource resource
}
public ExpensiveResource getExpensiveResource(){
if (resource == null) {
this.initializeExpensiveResource();
}
return this.resource
}
public String getExpensiveResourceName(){
if (resource == null) {
this.initializeExpensiveResource();
}
return this.resource.getName();
}
public CheapResource getCheapResource(){
return this.cheap;
}
private initializeExpensiveResource(){
// do expensive initialization of field "resource"
}
}
public class Test{
public static void main (String args[]){
FooClass foo = new FooClass("some string");
CheapResource cr = foo.getCheapResource();
String s = foo.getExpensiveResourceName();
// just now is the expensive resource initialized
}
}
start
e o construtor? etc ...