JavaとInnerClassとGroovy

JavaのInnnerClassをリフレクションで呼んでみたらGroovyの話に吹っ飛んだよ。 http://d.hatena.ne.jp/irof/20110426/p1 https://gist.github.com/942601 http://d.hatena.ne.jp/backpaper0/20110429/1304096170 続きを読む
5
Ryo Asai @ryoasai74

内部クラスはエンクロージングインスタンスが無くてもインスタンス化できる? - 裏紙 http://htn.to/jGepTb

2011-04-30 02:00:10
Ryo Asai @ryoasai74

@backpaper0 この事実は私も知らなかったので衝撃的でした。ただ、Constractor.newInstance()のJavaDOCでも内部クラスの場合は外側のインスタンスを渡す必要があると書かれていますし、new演算子の振る舞いと整合しないためバグのように思うのですが?

2011-04-30 02:02:58
このツイートは権利者によって削除されています。
このツイートは権利者によって削除されています。
このツイートは権利者によって削除されています。
Ryo Asai @ryoasai74

@backpaper0 サンプルを書いたのですが、外部のインスタンスがnullだと内部クラスからフィールドを参照しただけでNullPointerExceptionになるなどおかしな動作になりますね。バグはどこに報告すればよいのかな。 http://bit.ly/k5HJMD

2011-04-30 02:19:08
このツイートは権利者によって削除されています。
このツイートは権利者によって削除されています。
このツイートは権利者によって削除されています。
Ryo Asai @ryoasai74

@backpaper0 Groovyの内部クラスの仕様については、実は良くしらないので、明日ちょっと調べてみたいとは思いますが。ちなみに、ちょっとググったところではこの問題に関してはそれらしきレポートが見つかりませんね。バグパレードは以前と同様に運用されているのかな。

2011-04-30 02:31:28
Ryo Asai @ryoasai74

@backpaper0 Groovyだとリフレクションがカプセル化されているため、このふるまいが余計に奇妙ということですね。Groovyのコミュニティーの方に報告されていないでしょうかね?

2011-04-30 02:34:02
このツイートは権利者によって削除されています。
このツイートは権利者によって削除されています。
このツイートは権利者によって削除されています。
Ryo Asai @ryoasai74

@backpaper0 普通クロージャーとか使いますのでね。内部クラスという発想がなかったかもしれませんが、考えてみれば言語的には可能なのですね。とにかく、今回の件は勉強になりました。できればGroovyのコミュニティーにも聞いてみたいものです。

2011-04-30 02:42:55
このツイートは権利者によって削除されています。
このツイートは権利者によって削除されています。
非実在naka aki @naka_aki_spl

てかinnerクラスをstaticにすればすむとかいう話ではなく?(Groovy知らんのでjavaだけど)。なんにせよ個人的にはあのinner-outer縛りのどこが嬉しいのかさっぱり判らないのでほぼ常にstaticつけてる。

2011-04-30 10:11:15
非実在naka aki @naka_aki_spl

そういえば無名クラスは自動的に非staticになるんだったな。そして(にわとりたまごだが)その瞬間にインスタンスをnewすることも強要されててクラスそのものを持ち回れない。なに考えてたんだろ?と思う。java設計者は老害か?

2011-04-30 10:12:26
susumuis/いしがみプロ @susumuis

@naka_aki_spl outerClass.new InnerClass()とか?w以前そういうノリのライブラリを作ろうとして、変態的すぎて理解されないだろうから、new InnerClass(outerClass)に書き換えました。

2011-04-30 10:14:49
非実在naka aki @naka_aki_spl

@susumuis いや、「外クラスなんて単なる名前空間と同じ扱いでいいじゃん」派なので、new outerClass.InnnerClass() あたりでいいっす。

2011-04-30 10:27:56
irof @irof

何気に内部クラスにstaticつけないとFindBugsに怒られたりする。

2011-04-30 10:33:43
非実在naka aki @naka_aki_spl

@irof わはは。そういうものなんすか。「つけないと」怒られる、つまりつけろなんですね。個人的には賛成。他人は知らんけど。

2011-04-30 10:35:39
susumuis/いしがみプロ @susumuis

@naka_aki_spl それか、outerClassga FactoryMethodをもって、innerClassを隠蔽してしまうかですね。iteratorとかcomparatorなら、インスタンスインナークラスが便利ですし。

2011-04-30 10:39:30
非実在naka aki @naka_aki_spl

@susumuis あれ?便利でしたっけ?無名クラスが便利で、無名クラスはインスタンスインナークラス(てゆんだっけ)になっちゃう縛りがあるので止むなく、という流れかなと思ってたのですが。

2011-04-30 10:41:37