2
class ABC {
    private int[] variable;
    public int[] getVariable() {
        return variable;
    }
    public ABC() {
        variable = new int[123456];
    }
}

class DEF extends ABC {
    public int[] getVariable() {
        return new int[0];
    }
} 

variable中古ですABCが完全未使用で不要ですDEFDEFしかし、常にスーパークラスのコンストラクターを実行する必要があるため、この大きな配列の作成を防ぐ適切な方法がわかりません。ABC の新しい「偽の」コンストラクターです。

protected ABC(boolean whatever) {}

次に、次のDEFように記述できます。

public DEF() {
    super(true);
}

そしてそれは動作します -初期化されvariableていません。

しかし、私の質問は、これをもっと適切に解決できますか?

おそらく、変数が使用されていない場合、コンパイラは自動的に変数を削除しますか? そのような機能が役立つ場合がよくあります。

4

1 に答える 1

6

本当にDEF拡張する必要がありますか? つまり、 ABCa はDEF論理的に aABCですか? 継承は強力ですが、注意して使用する必要があります。

あなたの場合、私はむしろ持っています:

public interface WithVariable {
  int[] getVariable();
}

ABCDEF実装の両方がありますWithVariable。このように、ABCオブジェクトを構築すると必要な変数が初期化され、オブジェクトを構築DEFしても何も起こりませんが、どちらも同じメッセージに応答します ( getVariable())。

于 2013-09-13T15:15:14.460 に答える