0

Java のコンストラクターについていくつか質問があります。

  1. クラスが依存するオブジェクトをどのように初期化/作成することになっていますか? たとえば、'time' クラスに DateTime オブジェクトがあります。クラスの一部としてフィールドを持ち、コンストラクターprivate DateTime _date;に固執する必要がありますか? _date = new DateTime();または、関連するメソッドでこのオブジェクトを初期化する方が良いですか?

  2. クラスの新しいオブジェクトが作成されたときにフィールドが初期化されていないことが想定されている場合 (つまり、オブジェクトでクラスのメソッドが呼び出されたときにフィールドの値が後で設定される場合) はどうしますか? コンストラクターで、それらをnullまたはナンセンスな値に初期化しますか?

ご協力いただきありがとうございます。

4

4 に答える 4

2

基本的に、両方の質問に対する答えは次のとおりです。それはあなた次第です。

  1. 実行するとprivate DateTime _date = new DateTime();、コンストラクター内にあるかのように、インスタンス構築の一部として発生します (コンストラクター内のステップバイステップ コードが実行される直前に発生します)。JLSで大げさなことを言っているのを見つけることができません(それがそこにないという意味ではありません)が、セクション8および/またはセクション15のどこかにあるでしょう。したがって、それが宣言であろうとコンストラクタであろうと、あなたの呼び出しです。複数のコンストラクターがある場合、どのコンストラクターが呼び出されても発生するという利点があります。建設コードが複数の場所にあるという欠点があります。

  2. これらは、Java 言語の定義の一部として、型に応じてnull0false、 など (「デフォルト値」) に暗黙的に初期化されます。したがって、明確さ、強調、読みやすさなどが必要な場合は、それらを明示的に初期化できますが、必須ではありません。null

于 2013-04-12T08:05:28.637 に答える
1
  1. 正直に言うと、私はいつも違う方法でそれを扱います。initDefaults()宣言時に変数を設定することもあれば (TJ Crowder のように)、コンストラクターで変数を設定することもありますが、コンストラクターによって呼び出されるメソッド pl は めったにありません。
  2. フィールドを無意味な値に初期化しないことをお勧めします。フィールドを読むとき、それがナンセンスなのか意図的にその値なのかはわかりません。システム全体に対して、値が何をnull意味するか、または (避けられない場合は) 特別な「デフォルト」値を定義し、メソッドが値を返す方法を定義する必要があります。たとえば、Robert Martinは空のリストよりも空の配列を返すことを推奨してnullいます (そうすれば、NPE を回避できます)。

幸運を :-)

于 2013-04-12T08:21:54.897 に答える
1

2 番目の質問への回答として、オブジェクトであるフィールドをnullコンストラクター内で明示的に設定できます。ただし、オブジェクトを構築または作成しないと、自動的に に設定されるため、これは必要ありませんnull。例えば、

 Public class MyClass {
     private User user;

     public MyClass(){
         this.user; 
     }
 }

上記のコンストラクターは次と同じです。

public MyClass(){
    this.user = null;
}
于 2013-04-12T08:12:11.047 に答える
1

インスタンスがクラスの不変条件に従って設定されるようにすることは、コンストラクターの主な役割です (例外がスローされない限り)。フィールドが非nullである必要がある場合、不変条件はおそらくより単純になります。一般に、使用は避けたいと思いますnull。NPE は非常に一般的であり、そうであってはなりません。

(また、標準の Java 規則に従うことを強くお勧めします。)

于 2013-04-12T08:16:20.777 に答える