先日のオブジェクト指向分科会で一席打たせて頂いた際に、「オブジェクトとは何ぞや?」という問いの一つの答えとして「メッセージを受け取れるもの」という話をしました。
メッセージとは、C++の流れを汲むC#やJavaといった言語ではメソッドやプロパティという形をとっており、要するに「メソッドやプロパティを持つものがオブジェクトである」と言うことができます。
インスタンスは当然それらを持ちますが、インスタンスに関連づかない、静的メソッドや静的プロパティというものもあります。これらはどう考えればいいのでしょうか?
メソッドやプロパティを持つものがオブジェクトであれば、クラスもまたオブジェクトの一つであると言えるでしょう。
スピーチが終わった後の井戸端談義でfkojimaさんにフォローしていただきましたが、たとえばnewというやつは、クラスに対する「その型の新しいインスタンスを作ってくれ」というメッセージです。
#new はクラスに対して発行するという点で静的、インスタンスメンバにアクセスできるという点で動的という、特異な性質をもってはいますけどね。
というところでこの日記。
かつのりさんのGCについて勘違いしている人が結構多い。
お題はJavaですが、static変数もクラスローダが到達不可能になればGCの対象になるという話がされています。
これ、考えようによってはですよ。
クラス自体も何らかのインスタンスであり、その「クラスのクラス」にあたるものがクラスローダである、という考えはできないでしょうか?
クラス自体も静的なものではなく、必要に応じてメモリ上にロードされたりアンロードされたりする。クラス自体も何らかのクラスのインスタンスであり、であるが故にGCの回収対象となる。
実際、クラスのクラスに当たる「メタクラス」という概念はあります。それはJavaのクラスローダや.NETのSystem.Typeとは必ずしも同じものではないんですが、それに近しいものです。
#プロトタイプベースオブジェクト指向ですと、クラス=インスタンスですね。