Javaの3種類のクラス

Java等のクラスには以下の3種類がある:

  1. 文法に組み込まれたクラス
  2. 型としてのクラス
  3. サーバーとしてのクラス

Javaはこれらが区別されていないのが,不満だ.

文法に組み込まれたクラス

IntegerクラスとかThreadクラスとかSystemクラスとか,java.langパッケージに含まれるクラスのことだ.

これはクラスでなくて,関数の方がいいと思うのだ.

なぜなら,クラスはデータとそれに関する操作を表すものだから. Threadクラスとかは何のデータも表さなくて,どういう風に計算するかを命令するためだけにある.

Integerクラスも型変換が演算子なら,操作だけを表す.*1

こういう,操作しか表さないこれらは関数であるべきだ. あるいは,Objectクラスが持っているstaticメソッドであった方がわかりやすいように思う.

型としてのクラス

これが本来のクラスだと思う.データとそれに関する演算を集めることで,コードをわかりやすくするためのものがクラスだろう.

Integerクラスは,型変換をメソッドにするならこちらだ.ArrayListクラスもこれだ.

これらはserialize可能である場合も多い.Javaの場合,serializeできるようにするためには,Serializableインターフェイスを実装しなければならないが,この仕様は誤りで,アノテーションとすべきだ.Scalaとかはちゃんとそうなっている.

サーバーとしてのクラス

クラス間のメッセージのやりとりでプログラムを作るのがオブジェクト指向プログラミングである.ここではメッセージを飛ばすクラスをサーバーと呼ぶことにする.

しかし,サーバーからメッセージとして飛ばされるのもまたクラスである.メッセージとして飛ばされるクラスは前述の型としてのクラスだ.

設計の際は,サーバーと型を区別する.だから,言語仕様としてちゃんと区別して欲しい.要するにserializeするクラスとそうでないクラスを別の概念として欲しいということだ.

*1:キャストが演算子で型変換はメソッドというように統一されていないのがわかりにくい