遅延初期化を使用できます。
  コンピュータープログラミングでは、遅延初期化は、オブジェクトの作成、値の計算、または他の高価なプロセスを最初に必要になるまで遅らせる戦術です。
これにより、一時的なカップリングを回避できます。つまり、クラスのコンシューマーは特定のメソッドを特定の順序で呼び出す必要があります。start()最初に呼び出さなければならないのは、クラスが内部でどのように機能するかを知る必要がある方法です。
最初に必要になるまで、高価な初期化を遅らせます。
例:
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コンストラクタの違いは?など