私はJavaで働いています。
私は通常、いくつかのオブジェクトを次のようにセットアップします。
public class Foo {
private SomeObject someName;
// do stuff
public void someMethod() {
if (this.someName != null) {
// do some stuff
}
}
}
質問は次のとおりです。この例のsomeName
はnull
と同等で、reliably for all objects
は初期化されていないオブジェクトのNULLチェックが正確であると想定できますか?
正しい、明示的に初期化されていない参照型の静的メンバーとインスタンスメンバーの両方が、Javaによってnull
に設定されます。同じ規則が配列メンバーに適用されます。
Java言語仕様 のセクション4.12.5から:
変数の初期値
プログラム内のすべての変数は、値が使用される前に値を持っている必要があります。
各クラス変数、インスタンス変数、または配列コンポーネントは、作成時にデフォルト値で初期化されます
[...]すべての参照タイプについて、デフォルト値は
null
です。
上記のルールはローカル変数を除外することに注意してください。ローカル変数は明示的に初期化する必要があります。そうしないと、プログラムはコンパイルされません。
Object
参照が宣言されているがインスタンス化されていない場合、その値はnull
です。
namespace Design
{
class Program
{
static void Main(string[] args)
{
Logger obj1; // By Default, the value of obj1 is null
Logger obj2 = new Logger(); // By Default the value of obj2 is
// Design.Logger which is not null
Console.WriteLine(obj2);
Console.Read();
}
}
class Logger
{
public Logger()
{
Console.writeline("Called");
}
}
}