id:backpaper0さんが内部クラスはエンクロージングインスタンスが無くてもインスタンス化できる?と書かれていました。 Inner.class.getConstructor(Outer.class).newInstance((Outer) null); 実行してみたところ、確かにインスタンス化できました。 でも、これってバグなんでしょうか?仕様なんでしょうか? id:backpaper0さんは「わからない」、これを検証したid:ryoasaiさんは「バグに近い」としています。 そこで、調べてみました。 内部クラスのコンストラクタ まず、内部クラスの挙動を確認してみました。 id:ryoasaiさんの検証コード(普通のSI会社では評価されにくいのだけど、多くのシステムは研究熱心な技術者の小さな発見と工夫の積み重ねによって支えられているのでは? - 達人プログラマーを目指して)を改良し、
昨晩遅く、id:backpaper0さんの以下のツイートが目にとまりました。 staticでない本物の内部クラスは暗黙で外側のインスタンス(エンクロージングインスタンス)のthisにアクセスできる仕様なので、newを使った普通のインスタンス化の方法では決して外部のインスタンスが存在しない状態でnewできないようになっています。つまり、内部クラスのインスタンス化にはエンクロージングインスタンスの存在が前提となるというのが私が長年Javaのコードを書いてきた中での常識でした。 実際、エンクロージングインスタンスの外側で内部クラスのインスタンスを作成する場合、以下のようにnew演算子の前にエンクロージングインスタンスを書かなくてなならない仕様となっているため、これがnullでは決して内部クラスが生成できないように構文上工夫されています。 public class Outer { private
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く