質問

クラスのNCSカウント(〜850)を減らすために、すべての方法を独自のクラスに分割し、物事を簡単にするために、すべてのヘルパー機能を保持する抽象クラスを拡張しました。

AbstractMethod.class

public class AbstractMethod {
    protected String requestWebPage(URL url) {
        // download a webpage as a string
    }
}

Example "account" subclass

public class AccountData extends AbstractMethod {
    public String getAccount(String sessionId){
        String webPage = requestWebPage("http://google.com/"+sessionId);
        system.out.println(webPage);
        return webPage;
    }
}

これらのメソッドクラスのうち約10個があり、メイン/ベースクラスのメソッドの1つが呼び出された場合にのみ初期化したいと考えています。

public class MyBaseClass() {
    private static AccountData ad;

    public MyBaseClass() {
        ad = new AccountData();  // Is there a better way?
    }

    public String getAccount(String sessionId) {
        return ad.getAccount(String sessionId);
    }
}

サブタイプをパラメーターとして受け入れ、クラスに基づいてオブジェクトを作成するMyBaseClassクラスで初期化関数を作成しようとしました。

private void initAccount() {
    if (ad == null) {
        ad = new AccountData();
    }
}

しかし、それは醜く、私はサブクラスごとに1つを持っている必要があります。

それで、これを行う「正しい」方法は何ですか?クラスが呼び出された場合、1つまたは2のメソッドのみを使用する場合があるため、毎回すべてのサブクラスを初期化する必要はありません。

役に立ちましたか?

解決 2

Javaのインスタンス化クラスは安いです。クラスがコントラクタで実質的なことをしていない場合は、

public String getAccount(String sessionId) {
    AccountData ad = new AccountData();
    return ad.getAccount(String sessionId);
}

それがnessaryではない場所を最適化しないでください。前にあなたのコードをプロファイルしてください。あなたはあなたの仮定がどれほど間違っているかを驚かせるかもしれません(私は何度もあったことを知っています)。

他のヒント

あなたが本当に望んでいるのは、おそらく抽象的なヘルパークラスではなく静的な方法を使用することだと思われるでしょう。 import static.

そうすれば、これらのメソッドを定義するクラス(ES)は、必要なように、メソッドが実際に呼び出されたら初期化されます。

また、一般的には、メソッドが定義されている場所に継承構造を制限しません。

もちろん、これらのメソッドにインスタンスデータを使用しないと仮定しています。しかし、サンプルコードの外観からは、そのようには見えません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top