私はいくつかのクラスをいくつかの重いライブラリ(パーサー、タグ、その他のリソースなど)に渡って動作させます。これらのライブラリはすべて、共通のものがあります。直列化されたモデル(大きなファイル)を入力とし、テキストの解析などの具体的な処理を行うためのクラスを返すload/initメソッドがあります。重いリソースを読み込む共有クラスを実装するための洗練された方法(Javaの場合)
この状況を説明するためには、私はそれをラップするために以下のクラスを作成しているため、解析を行うためにConcreteParserのlibが、持って言うことができます:
public class ParserWrapper {
private static final ConcreteParser parser = null;
private static void init(String modelFileName) {
if (parser == null)
parser = ConcreteParser.load(modelFileName);
}
public static Result parse(input) {
if (parser == null) throw new RuntimeException(...);
return parser.parse(input);
}
}
あなたは、これを見ることができるように最初にparseの前にinitを呼び出す必要があります。これは間違いなくnoです。私もシングルトンのパターンに基づいた解決策を試しましたが、私はまだ私がしたいことをする良い方法があると思います。
すべてのモデルは読み込みに比較的長い時間がかかり、多くのメモリを消費するため、ConcreteParserは静的です。したがって、私はそれらを使用するすべてのクラスにそれらを共有する必要があります。
私の質問は、私が欲しいことをする別の(よりエレガントな)方法はありますか?このコードを改善するにはどうすればよいですか?私はリソースをロードする単一のポイントを持つために、 "createParser"や "createTagger"のようないくつかのメソッドを持つResourceManagerクラスを作成することを考えました。このクラスは、各リソースがすでにインスタンス化されているかどうかをチェックします。これらのことはどうでもいいですか?
よろしくお願いいたします。
ConcreteParserシングルトンがスレッドセーフであることが絶対に確実です! –