でも、java.io.FileInput/OutputStream あたりを読むと FileDescriptor は
不可欠なようです。
> 実際、今仕事で使っているプラットフォーム(組み込み用OS)では、ソケッ
> トはありますが、ファイルディスクリプタとは縁がありません。読み書き
> にはソケット専用のAPIを使っています。
その場合でも、一つ一つのソケットに対応した何らかの番号があるはずで、
その番号をそのOSにおける FileDescriptor として実装されるのではないで
しょうか。
> ちなみに、SocketクラスのSocketImplは、抽象クラスで、プラットフォー
> ムごとに異なるソケット関連の実装を隠蔽しています。
> ※ Bridgeパターン。
Bridgeパターンの目的は実装の隠蔽(外から使えなくする)というよりも (隠蔽
(外から使えなくする)だけなら private/protected にすればよい)、実装の多
様性とは独立したインターフェイスの拡張を可能にすることにあります。
Socket - SocketImpl の場合ですと、
例えば、実装としてPlainSocketの他にHttpTunnelSocketなどをサブクラスと
して用意するとしたとき、一方でインターフェイスを拡張したSSLSocketなど
を用意したい場合に、両方をSocketのサブクラスとして作ろうとすると、
PlainSocket, HttpTunnelSocket, PlainSSLSocket, HttpTunnelSSLSocketと、
直交する拡張の組み合わせだけの数のサブクラス化が必要になってしまいます。
これを避け、PlainSocketとHttpTunnelSocketをSocketImplのサブクラスに、
SSLSocketをSocketのサブクラスにする、というのがBridgeパターンです。
高木 浩光@電子技術総合研究所
http://www.etl.go.jp/~takagi/ (工事中)