[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
------------------------------------------------------------