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