マップ内の一致から開始して特定の Java クラスをインスタンス化する必要がある場合は、リフレクションによって構築されるクラス名ではなく、これらのクラスのビルダーを値として配置します。これにより、柔軟性が向上し、パフォーマンスが向上する可能性があります。
そのようなビルダーの例:
public interface BuilderClass<O, P>{
O build(P parameter);
}
public class BuilderSpecificClass<SpecificClass, Object>{
@Override
public SpecificClass build(Object parameter){
return new SpecificClass(parameter);
}
}
次に、マップは次のようになります。
Map<String, BuilderClass<SpecificClass, Object>> map=new HashMap<String, BuilderClass<SpecificClass, Object>>();
map.put("<class_iri>", new BuilderSpecificClass<SpecificClass, Object>());
とはいえ、特定のクラスがどのように機能するかは明確ではないため、より良い方法があるかもしれません。それらをどのように構築したかの例を追加できますか?
トムの追加の詳細の後に編集:
わかりました。あなたのクラスが何をしているのか理解できれば、私が説明したアプローチの半分はすでに実装されています。あなたのクラスは基本的に、表明または推論された OWL アサーション公理のセットをラップしています。つまり、フィールドの値は、オントロジーまたは推論のいずれかから取得され、個人を個人または値と関連付けます。また、オントロジーと推論からクラス インスタンスを設定するメソッドもあります。これらは、私が方法として上で提案したものに対応してbuild()
おり、パラメータはオントロジーと推論者になります。OWLOntologyManager のインスタンスはすでにオントロジーを介してアクセスできるため、オントロジー マネージャーを渡すことをスキップできます。ontology.getOWLOntologyManager()
ここで行うことは、説明したのとほとんど同じようにビルダーを作成し、それらにメソッドを呼び出してオブジェクトを設定させることです。
パフォーマンスに関しては、重大なホット スポットがあるかどうかを判断するのは困難です。おそらく、このコードには特に難しいことは何もないはずです。オントロジーは、通常、このような問題が発生する場所です。このクラスで私が提案できることは次のとおりです。
private final String personURI = ThesisOntologyTools.PERSON_URI + "Person";
このようなメンバー変数がいくつかあります。これらは定数だと思うので、インスタンスごとにコピーを作成するのではなく、それらを static final にすることでメモリを節約できます。
OWLDataProperty isLocationConfirmed = dataFactory.getOWLDataProperty(IRI.create(isLocationConfirmedURI));
これと同様の方法で多数のオブジェクトを作成しています。IRI.create()
は不変オブジェクトと を返すことに注意してください。そのdataFactory.getOWLDataProperty()
ため、そのようなオブジェクトを再利用できるたびにデータ ファクトリにアクセスするのではありません。データ ファクトリによって生成されるすべてのオブジェクトは、特定のオントロジーにリンクされておらず、不変であるため、クラス間で自由に再利用して、作成される新しいオブジェクトの数を減らすことができます。データ ファクトリはそれらの一部をキャッシュする場合がありますが、他の一部は呼び出しごとに最初から再作成される可能性があるため、呼び出しの数を減らすと、速度とメモリ要件が改善されます。
これ以外は、アプローチは問題ないようです。必要なメモリまたは速度が高すぎる (または低すぎる) 場合は、プロファイラーを使用して問題を特定することをお勧めします。ホットスポットが OWL API にある場合は、OWLAPI イシュー トラッカーで問題を提起してください:-) 実際のユーザーから十分なパフォーマンス レポートが得られません。