この付録では、RL LanguageとJava言語の相違点について説明します。
この項では、RLとJavaの違いを示します。
RLには、インタフェースまたはメソッドが含まれません。
RLグローバル変数はJavaの静的なクラス変数に類似していますが、各ルール・セッションのインスタンスは1つです。
RLには、staticキーワードがありません。
RLには、パッケージのかわりにルールセットがあります。ルールセットによって、定義とアクションがグループ化されます。
RLクラスおよびJavaクラスのインスタンスは、作業メモリーでファクトとしてアサートできます。
RLファクトはガベージ・コレクションの対象ではないため、明示的に取り消す必要があります。
RLは解析されます。コンパイルやクラス・ロードはありません。クラスと関数は、使用する前に定義する必要があります。
RLクラスに含まれるのはデータ・フィールドのみで、コンストラクタやメソッドは含まれません。データ・フィールドの動作は、Java Beanプロパティと同様です。
Java Beanプロパティは、RL内のフィールドとしてアクセスできます。
new演算子を使用すると、コンストラクタが定義されているかどうかに関係なく、名前付きプロパティに値を明示的に割り当てることができます。 fact演算子を使用すると、名前付きプロパティと値を照合し、varキーワードを使用して名前付きプロパティから値を取得できます。プロパティは、Javaオブジェクトの場合はJava Beanプロパティ、RLオブジェクトの場合はフィールドになります。
RL配列は、1次元に制限されています。
ifおよびwhileアクションは、中カッコ({})で囲んでブロック内に存在する必要があります。
RLには、switchアクション、continue文、break文、またはネストされたループを終了するためのラベル付きの文がありません。
RLのforループには、カンマ区切りの初期化式または更新式を複数含めることはできません。
RLは、ビット単位の&および|演算子をサポートしていません。
RLは、関数とJavaメソッドのオーバーロードをサポートしています(最適なものが使用されます)。
RL変数は、定義時に初期化する必要があります。
RLオブジェクトおよびJavaオブジェクトに対して==を使用すると、常にオブジェクトのequalsメソッドが起動します。RLでは、オブジェクト参照が等価であることはテストできません。オブジェクトに対して!=を使用すると、オブジェクト参照が等価でないことはテストされず、equalsメソッドの否定になります。
次の文について考えてみます。
if (object1 != object2){}
これは、次の文と同じです。
if (! (object1.equals(object2)){}
クラスまたは関数の前方参照はできません。
Javaでは、Java BeanのIntrospectorによって書込み専用プロパティがインクルードされます。Beanのようなプロパティはルール内で判断できないためRLに組み込まれません。このため、RLでJavaファクト・タイプのBeanプロパティに適切にアクセスするには、これらのプロパティにgetterとsetterの両方が必要です。setterがありgetterがないプロパティ(書込み専用プロパティ)は、RLの新規構文では使用できません。
たとえば、Bean FooにメソッドsetProp1(int i)のみがある場合、RLではFoo f = new Foo(prop1: 0)を使用できません。