[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[jfriends] Serializableインタフェース
前橋です。
別に質問というわけでもないのですが、先日、Javaで遊んでて、思っ
たことを少々。(と言いつつ長文です f(^^;)
Javaは仕事では使っていないので、実践経験ほとんど無しのシロー
トですが...
Java2で、(JDK1.1で実装された)直列化機能を使ってみようと思い、
「続・Java言語入門」を読み返してみました。
オブジェクトを直列化可能にするには、Serializableインタフェー
スをimplementsするわけですが、Serializableインタフェース自身
はメソッドをひとつも持たない空のインタフェースで、直列化可能
のマークを付けるためだけに使用する、と。ふむふむ。
Clonableインタフェースも似たような仕掛けでした。こいつは、
Clonableインタフェースはやっぱりマーク付けだけで、clone メソッ
ド自体は、自分で定義したければ、Objectに定義されているものを
オーバライドするんですね。
んで、Serializableを実装するクラスでは、writeObject,
readObject というメソッドを定義 *しても良い* ことになっています。
では、こいつらも、cloneと同様、Objectに定義されているのかと
思って、Java2のソースを確認したのですが、これが見付からない。
では、シリアライザ/デシリアライザは一体どうやって
writeObject/readObjectを呼び出すのだろう、と思い、ソースを追っ
かけたのですが...
いや、Serializableインタフェースにも、Objectクラスにも含まれ
ていないという時点で、残る手段はひとつしかないということはわ
かっていたわけですが...
リフレクション? やっぱり?
リフレクションという機能自体が悪いとは言いませんが、実行中に
文字列を組み立てて自由にメソッドが呼べるっつーのは、昔の
BASICにあった(COBOLにも昔はあったんでしたっけ)、GOTO文の行番
号を式で与える奴みたいで、この使い方はちと凶悪じゃないですか、
と私なんかは思うわけですけれども、皆さんどう思われますでしょうか。
話変わって、
元はといえば、ClonableにせよSerializableにせよ、こういう変な
構造に *せざるを得ない* のは、
インタフェースがデフォルトの実装を持てない
ことに起因しているわけですよね。
cloneにしたところで、Clonableをimplementsしていないオブジェ
クトのcloneをコールしても、コンパイルは通ってしまいますよね
(実行時に例外が発生する)。これは、本来なら、コンパイル時にチェッ
クできることです。
Listenerのインタフェースのメソッドを全部実装するのが面倒だか
らって、イベントアダプタなんて、ほとんど冗談みたいなクラスが
必要になったりもしてますし。
なんか、色々不便だなあ、と思うんですけれども...
Rubyのmoduleは、実装込みでmixinできて、いい感じです。
Pythonは、多重継承もできるんでしたっけ?
そもそも、Javaで多重継承を廃した理由ってのは、何なんでしたっけ?
多重継承の複雑さの原因になるものは、いくつかあると思いますけど、
名前の衝突... は、Interfaceでも一緒だし、
反復継承... は、問題ですね。インタフェースなら、反復継承して
も(許しているかどうかは知りませんが)、どうせ実装は書けないの
で、実質ひとつのメソッドシグニチャだと思って良い、ということ
でしょうか。
Rubyのmoduleは、サブクラスが作れないから、反復継承に陥ること
はないわけですね。
------------------------------------------------------------
前橋 和弥 maebashi@xxxxxxxxxx
中部ソフトエンジニアリング(株)
〒450 名古屋市中村区名駅4-10-25(名駅IMAIビル 5F)
Tel:(052)583-4511(代) 内線 252 Fax:(052)583-4566
------------------------------------------------------------