JavaとInnerClassとGroovy
内部クラスはエンクロージングインスタンスが無くてもインスタンス化できる? - 裏紙 http://htn.to/jGepTb
2011-04-30 02:00:10@backpaper0 この事実は私も知らなかったので衝撃的でした。ただ、Constractor.newInstance()のJavaDOCでも内部クラスの場合は外側のインスタンスを渡す必要があると書かれていますし、new演算子の振る舞いと整合しないためバグのように思うのですが?
2011-04-30 02:02:58@backpaper0 サンプルを書いたのですが、外部のインスタンスがnullだと内部クラスからフィールドを参照しただけでNullPointerExceptionになるなどおかしな動作になりますね。バグはどこに報告すればよいのかな。 http://bit.ly/k5HJMD
2011-04-30 02:19:08@backpaper0 Groovyの内部クラスの仕様については、実は良くしらないので、明日ちょっと調べてみたいとは思いますが。ちなみに、ちょっとググったところではこの問題に関してはそれらしきレポートが見つかりませんね。バグパレードは以前と同様に運用されているのかな。
2011-04-30 02:31:28@backpaper0 Groovyだとリフレクションがカプセル化されているため、このふるまいが余計に奇妙ということですね。Groovyのコミュニティーの方に報告されていないでしょうかね?
2011-04-30 02:34:02@backpaper0 普通クロージャーとか使いますのでね。内部クラスという発想がなかったかもしれませんが、考えてみれば言語的には可能なのですね。とにかく、今回の件は勉強になりました。できればGroovyのコミュニティーにも聞いてみたいものです。
2011-04-30 02:42:55てかinnerクラスをstaticにすればすむとかいう話ではなく?(Groovy知らんのでjavaだけど)。なんにせよ個人的にはあのinner-outer縛りのどこが嬉しいのかさっぱり判らないのでほぼ常にstaticつけてる。
2011-04-30 10:11:15そういえば無名クラスは自動的に非staticになるんだったな。そして(にわとりたまごだが)その瞬間にインスタンスをnewすることも強要されててクラスそのものを持ち回れない。なに考えてたんだろ?と思う。java設計者は老害か?
2011-04-30 10:12:26@naka_aki_spl outerClass.new InnerClass()とか?w以前そういうノリのライブラリを作ろうとして、変態的すぎて理解されないだろうから、new InnerClass(outerClass)に書き換えました。
2011-04-30 10:14:49@susumuis いや、「外クラスなんて単なる名前空間と同じ扱いでいいじゃん」派なので、new outerClass.InnnerClass() あたりでいいっす。
2011-04-30 10:27:56@irof わはは。そういうものなんすか。「つけないと」怒られる、つまりつけろなんですね。個人的には賛成。他人は知らんけど。
2011-04-30 10:35:39@naka_aki_spl それか、outerClassga FactoryMethodをもって、innerClassを隠蔽してしまうかですね。iteratorとかcomparatorなら、インスタンスインナークラスが便利ですし。
2011-04-30 10:39:30@susumuis あれ?便利でしたっけ?無名クラスが便利で、無名クラスはインスタンスインナークラス(てゆんだっけ)になっちゃう縛りがあるので止むなく、という流れかなと思ってたのですが。
2011-04-30 10:41:37