RubyObjectクラスのコンストラクタ
RubyObjectクラスのコンストラクタ
RubyObjectクラスのコンストラクタは次のようになっています。
java>>
private RubyObject(){};
public RubyObject(Ruby runtime, RubyClass metaClass) {
this.metaClass = metaClass;
if (runtime.isObjectSpaceEnabled()) addToObjectSpace(runtime);
if (runtime.getSafeLevel() >= 3) taint(runtime);
}
protected RubyObject(Ruby runtime, RubyClass metaClass, boolean useObjectSpace) {
this.metaClass = metaClass;
if (useObjectSpace) addToObjectSpace(runtime);
if (runtime.getSafeLevel() >= 3) taint(runtime);
}
<<java
RubyObjectクラスのコンスラクタは、Rubyの実行環境であるruntime、作成されるRubyObjectインスタンスのメタクラス、そしてObjectSpaceクラスを有効にするかどうかのフラグを引数としています。
ObjectSpaceクラスは、Rubyの全てのインスタンスへの参照を持ちます。Javaでこうした機構を持つことは、非常にコストの高い選択になってしまうため、JRubyのデフォルトではオフになっています。
metaClass変数には、オブジェクトのメタクラスが入ります。メタクラスはRubyClassクラスのインスタンスです。そして、RubyClassクラスは、RubyModuleクラスを親クラスに持ちます。もちろん、そのRubyModuleクラスの親クラスは、RubyObjectクラスです。
また、デフォルトコンストラクタがプライベートになっています。これは、NEVERとUNDEFという特殊な定数のために使われています。NEVERは、配列の最後に配置される「番人」として利用されるとJavaDocに書かれていますが、どうやら必ずしもそうというわけではないようです。