Monday 16 October 2006

Java 三昧



なわけで、今度は、JavaSound をいじってます。Sunの作った例題だな。この間、引き受けた仕事向け。

JavaSound のソース自体はいじらずに、継承したクラスだけで新しいものを作るってのが、オブジェクト指向的なんだが....

オブジェクトを作る時に動くメソッドはJavaの場合は Constructor と呼ばれます。クラス名と同じメソッドが自動的にそうなる。

でも、JavaSound だと、Default Constructor がない場合がある。継承したクラス側で、明示的に親クラスの「既にある」Constructor を呼ぶ必要があるらしい。一方で、Default Constructor があるプログラムで、Default Constructor に、がんがんコードが書いてある。

ってことは、どっちの場合でも、Constructor の振舞いをSub Class 側から変えることはできない。だめじゃん。なので、Default Constructor がない場合は空なものを付け加え、Default Constructor にごちゃごちゃ書いてある場合は、余計な引数を持つダミーの空なConstructor を付け加えるってな感じで逃げたんだけど。こんなもの?!

static main(String arg[]) から起動するのは許すんだが、そこに、また、いろいろごちゃごちゃ書いてある。そこで、Class 名を指定してinstance を作ってしまっているから、継承側は、main を上書きするしかない。でも、そこにごちゃごちゃ書かれてたら、それをコピーするしかない。余計なコード書くなら別メソッドにしてくれていれば、問題ないのに。あるいは、MyClass self = new this(); self.start(); とか書けるのか?

Class 定義の中に局所的に Class 定義をする Inner Class が多用されてる。Inner Class って、

 まったく、何の役にもたたないゴミな概念

だと思う。そんなに名前空間が大切か? package あるのに? 再利用する時には、親Class の中のInner Class をさらに継承するInner Classを子側に作るなんて言うばかげたはめになる。それが可能なところが、さらに Inner Class の不要さ加減を強くする。もちろん、親側では Inner Class 名を指定してinstanceを作っているわけなので、その部分は、子側にコピーしてやる必要がある。でないと、子側のInner Class は冢wれない。しかも、その部分に、また、ごちゃごちゃしたコードが書いてある。

しかも、Inner Class 側に private method なんかもある。継承した子側から利用できないじゃん。 private method/instance variable も、

 まったく、何の役にもたたないゴミな概念

だと思う。なーにがうれしいんだか。僕は、だまって public って書くよ。考えるのめんどくさいし。

 余計な概念を増やし、自虐的な制限を可能にする

よりも、Simple な言語で多様なことが出来る方がいいです。でも、Template とか、Generic Data Type とか、スタック上のオブジェクトとか inline とかと戦うことになる C++ よりは、Java の方が、はるかにましなんだよな。

というわけで、結局、元のソースも部分的に修正するはめになってます。ま、人の書いたコードは気に入らないものさ。

No comments: