ベストプラクティスは、作成されたスコープ内ですべてのDominoオブジェクトをリサイクルすることです。ただし、オブジェクトをリサイクルすると、その「下」にあるすべてのオブジェクトが自動的にリサイクルされます。したがって、この例のメソッドでは、 wDbをリサイクルできません。これは、wDocもリサイクルされるため、リサイクルされたドキュメントハンドルを返すことになります。
したがって、メモリリークが発生していないことを確認する場合は、オブジェクトを逆の順序でリサイクルすることをお勧めします(たとえば、最初にドキュメント、次にビュー、次にデータベース)。これには、必要なことをすべて実行するように、またはメソッドがハンドルを取得するメソッド内でDominoオブジェクトを使用して、メソッドを構造化する必要がある傾向があります。
たとえば、構成ドキュメントを取得するメソッドを定義した理由は、そこから構成設定の値を取得できるようにするためだと思います。したがって、ドキュメントを返すメソッドの代わりに、アイテムの値を返すメソッドを定義する方がよいでしょう。
private Object lookupItemValue(String configKey, itemName) {
Object result = null;
Database wDb = null;
View wView = null;
Document wDoc = null;
try {
Session sess = ExtLibUtil.getCurrentSession();
wDb = sess.getDatabase(sess.getServerName(), this.dbname1);
wView = wDb.getView(this.viewname1);
wDoc = wView.getDocumentByKey(configKey, true);
this.debug("Got a doc for key: [" + configKey + "]");
result = wDoc.getItemValue(itemName);
} catch (NotesException ne) {
if (this.DispLookupErrors)
ne.printStackTrace();
this.lastErrorMsg = ne.text;
this.debug(this.lastErrorMsg, "error");
} finally {
incinerate(wDoc, wView, wDb);
}
return result;
}
上記について、説明に値することがいくつかあります。
- 通常、Javaでは、目次スタイルではなく、最初に使用するときに変数を宣言します。ただし、Dominoオブジェクトの場合は、TOCに戻すのが最善です。これにより、例外がスローされたかどうかに関係なく、完了時にオブジェクトのリサイクルを試みることができます。したがって、finallyを使用します。
- 戻りオブジェクト(ドキュメント自体ではなくアイテム値である必要があります)もTOCで宣言されているため、例外が発生したかどうかに関係なく、メソッドの最後でそのオブジェクトを返すことができます(例外、おそらくそれはまだnullになります)。
- この例では、すべてのDominoオブジェクトを単一のメソッド呼び出しに渡してリサイクルできるようにするユーティリティメソッドを呼び出します。
そのユーティリティメソッドのコードは次のとおりです。
private void incinerate(Object... dominoObjects) {
for (Object dominoObject : dominoObjects) {
if (null != dominoObject) {
if (dominoObject instanceof Base) {
try {
((Base)dominoObject).recycle();
} catch (NotesException recycleSucks) {
// optionally log exception
}
}
}
}
}
同じBeanで定義するだけだと思いますが、最近はこれをUtilクラスのパブリック静的メソッドとして定義する傾向があり、ほとんどどこからでも同じパターンに従うことができます。
最後に、構成ドキュメントから多数のアイテム値を取得する場合は、返すアイテム値ごとに新しいデータベース、ビュー、およびドキュメントハンドルを確立するのにコストがかかることは明らかです。したがって、このメソッドをオーバーライドして、アイテム名のList <String>(またはString [])を受け入れ、結果の値のMap <String、Object>を返すことをお勧めします。このようにして、データベース、ビュー、およびドキュメントの単一のハンドルを確立し、必要なすべての値を取得してから、返されたアイテムの値を実際に使用する前にDominoオブジェクトをリサイクルできます。