最終オブジェクト (以下のコードの A String) を渡すと、匿名の内部クラスから出力されると null として表示されます。ただし、最終的な値の型またはストレートの最終的な文字列が渡されると、その値は正しく表示されます。final
匿名内部クラスのコンテキストで実際に意味することは何ですか?また、オブジェクトが null に渡されるのはなぜですか?
public class WeirdInners
{
public class InnerThing
{
public InnerThing()
{
print();
}
public void print(){
}
}
public WeirdInners()
{
final String aString = "argh!".toString();
final String bString = "argh!";
System.out.println(aString);
System.out.println(bString);
InnerThing inner =new InnerThing(){
public void print()
{
System.out.println("inner"+aString); // When called from constructor, this value is null.
System.out.println("inner"+bString); // This value is correctly printed.
}
};
inner.print();
}
public static void main(String[] args)
{
WeirdInners test1 = new WeirdInners();
}
}
Stringはオブジェクトであることが期待されるため、これは私にとって非常に奇妙な動作です。なぜ呼び出すとtoString()
物事が変わるのでしょうか?
その他の情報: この動作は、Java 5 ではなく、Java 1.4 を使用してのみ観察されます。回避策に関する提案はありますか? 既存の Stringを呼び出さないことtoString()
は十分に公平ですが、これは単なる例であるため、String 以外のオブジェクトで実行すると現実世界に影響を与えます。