0

いくつかの Java コードを確認しているときに、次のようなコードに出くわしました。

Integer initialQ = someObject.getInitialQ();
Integer finalQ = null;
BigDecimal factor = calculateFactor(initialQ, finalQ);

if (finalQ.compareTo(initialQ) != 0){
   //do something
}

finalQメソッド calculateFactor で変更されます。

Eclipse で「Null ポインター アクセス: The variable idUnidadFinal can only be null at this location」という警告が表示されif (finalQ...)ます。factorメソッドから返される必要があるため、変更する唯一の方法finalQはそれを参照として渡すことだと理解しています。しかし、これは正しい、受け入れられている方法ですか?

finalQ私が考えることができる唯一の代替手段は、フィールドとしてandを持つ新しいクラスを設計することですがfactor、不必要に複雑に見えます。

4

2 に答える 2

4

これは参照渡しではありません。渡された関数で作成された新しいオブジェクトがあります。の値はfinalQnull のみです。finalQ値を変更したり、グローバルにしたい場合は、そのオブジェクトを戻す必要があります。

于 2013-02-28T10:15:57.330 に答える
2

Java には参照渡しというものはなく、紛らわしい用語です。

オブジェクトを別の関数に渡すとき、渡されるのは参照の値です。このメソッドでは、参照のローカル コピーが作成され、同じメモリ アドレスを指します。したがって、通常、null 以外の変数を渡して別のメソッドで変更すると、元のオブジェクトとメソッドのローカル コピーが同じメモリ アドレスを指しているため、元のオブジェクトも変更されますが、新しいインスタンスをメソッド ローカル コピー、その後のローカル コピーへの変更は、元のコピーとは何の関係もありません。

あなたの場合、null 以外のインスタンスをcalculateFactorのfinalQに割り当てると思います。これにより、 finalQ のローカル コピーが別のメモリ アドレスを指し、元の finalQがそのまま残ります。

したがって、メソッドに渡されたオブジェクトを変更したい場合、それ自体を変更することはできますが、別の参照を割り当てることはできません。最初に渡されたオブジェクトが null で、元のオブジェクトに対する変更が予想される場合は、変更されたオブジェクトを戻す必要があります。

于 2013-02-28T10:24:49.097 に答える