Java のクラスはオブジェクトじゃない?!

ここ数日話題になっている

ですが、この文章の中の記述「Item #9 Everything is an Object」や、同じくJim Weirich氏の最近のプレゼン資料『Dependency Injection: Vitally Important or Totally Irrelevant?』の中の「Java Classes vs Ruby Classes」等の記述から生じるちょっとした語弊について、id:sumimさんの説明が非常にわかりやすかったのでメモします。(ちなみに、はてなブックマークから初めてポイントを送信してみました)


参考になるところを引用しようとすると全文引用に近くなってしまうので、ざっくりとメモします。ぜひ引用先(http://d.hatena.ne.jp/sumim/20050817/p1)を読んでみてください。(実際文章の中盤の大事な部分の引用は抜けてしまいました)

ただ、文脈をたぐると、ここでの Jim Weirich さんの主張は「(Ruby において)“Array”は、Array というクラス(を実現した)オブジェクトを束縛した定数(に過ぎない)」(Array is a constant name that is bound to the Array class object.)であり、このことは、「新しいオブジェクトを作るのに(“new クラス名”という)特別な文法を必要としない」(Creating new objects does not require special syntax.)といった効果を生じさせる、ということのようにとることができます。つまり「Java のクラスがオブジェクトではない」ということを言いたいのではなく「Java のクラスに new メッセージを送ってもインスタンスは作れない」ということに言及していると、そんなふうに読めますから、まあそれならOKかな…という感じもしなくもありません。

ところで、「new クラス名」という書き方は SIMULA-67(のちに SIMULA に改名)にさかのぼることができるのですが、これを踏襲した「new クラス名」か、はたまた“クラスへの new メッセージ送信”かのどちらが“オブジェクト指向”に相応しいかは、その“オブジェクト指向”が想定するパラダイムが「クラス指向」か「メッセージ指向」のどちらに主軸を置くのか、という問題に大きく関わってくるものだと個人的には考えています。すべてがオブジェクトか否か、静的型チェック機構があるか否か、についても根っこは同じでしょう。

なるほど。目の前の霧がはれたような感じです。

Java はクラス指向に立脚しています。個人的には Java は、Eiffel が途中で投げ出してしまったクラス指向を踏襲しつつ、Smalltalk システムがメッセージ指向により構築した世界観をクラス指向で実現してみせた、比較的純粋な“オブジェクト指向”システムだと考えています。他方で Ruby は、セマンティックスにおいてメッセージ指向を大事にしていますが、それにこだわってはいません。しかし、Java に比べればはるかにメッセージ指向よりの言語だと言って差し支えないでしょう。

なるほど。
「Eiffel が途中で投げ出してしまったクラス指向」というのも、少し気になります。



(追記: id:babieさんからのフィードバックで少し補足します。

そもそもの始まりは、同Jim Weirich氏の最近のプレゼン資料『Dependency Injection: Vitally Important or Totally Irrelevant?』の中の「Java Classes vs Ruby Classes」からだそうです。こちらには確かにはっきり「Not Object」と書いてあります。

横着してしまったのは私も同じです。裏付け重要ですね。どちらのプレゼンも最近読んだからごっちゃになってました。)