-3

どうやら Java は私のコンストラクター コードは重要ではないと考えているようです。コンストラクターに任意のパラメーターを追加した場合にのみ、Java はそれを調べる価値があると判断します。

import java.util.ArrayList;

public class DataManager {
    ArrayList<Variable> vars;

    public DataManager() {
        vars = new ArrayList<Variable>();
    }

    public void createVar(String type, String name, String strValue, int numValue) {
        vars.add(new Variable(type, name, strValue, numValue));
    }
}

そして、これを呼び出すコード:

DataManager data = new DataManager();
data.createVar(...);

変数クラス:

class Variable {
    String type;
    String name;
    String strValue;
    int numValue;

    public Variable(String type, String name, String strValue, int numValue) {
            this.type = type; this.name = name;
            this.strValue = strValue;
            this.numValue = numValue;
    }
}

これを実行すると、

スレッド「メイン」の例外 java.lang.ArrayIndexOutOfBoundsException: 1 で Parser.start(Parser.java:25) で SudoCode.go(SudoCode.java:10) で SudoCode.main(SudoCode.java:6)

それで...どうしたの?パラメータ化されていないコンストラクタが無視されるのはなぜですか? それはあまり直感的ではありません。これは、明らかな意味を理解できないような設計上の選択でしたか? もしそうなら、私を啓発してください。そして、コンストラクターが実行されるように任意のパラメーターを追加するだけですか、それとも、ArrayList を初期化するためだけに設計されたメソッドを作成して明示的に呼び出す必要がありますか?

ありがとう!

4

3 に答える 3

6

あなたの仮定は誤りです。コンストラクターを実行せずにオブジェクトをインスタンス化することはできません。

コンストラクターなしでクラスを定義すると、Javaはパラメーターなしで暗黙的な(「デフォルト」)コンストラクターを作成します。

于 2013-01-20T22:43:02.153 に答える
2

クラスの属性を初期化する最良の方法は、可能であれば宣言の時点です。初期化は、使用するコンストラクターに関係なく、コンストラクター内のコードの前に実行されます。したがって、複数のコンストラクターがある場合は、コード行を保存します。あなたの場合は以下を使用してください:

public class DataManager {
    ArrayList<Variable> vars = new ArrayList<Variable>();

    public DataManager() {
    }
}
于 2013-01-20T23:01:43.083 に答える
0

コンストラクターを定義しない場合、JAVAはデフォルトのコンストラクターを使用します。

public MyClass() {
}
于 2013-01-20T22:44:51.397 に答える