オンにすべきだと思いますFile
。
ファイルのファクトリーとして機能する FileService が (サーバーへの接続ごとに) 1 つしかない場合は、おそらくそのサービスを最新の状態に保つ必要があります。次に、何かを使用できます。
FactoryServiceImpl implements FactoryService {
public File findFile(criteria) {
return new FileImpl(this);
}
}
// This should be package scope!
FileImpl implements File {
private FactoryService service;
// package scope!
FileImpl(FactoryService service) {
this.service = service;
}
public delete() {
// invalidate this object - all calls should throw exception
// Inform the service that this File should be deleted from
// the server; or if the FileImpl does that itself, that the
// FileService should update the cache of available files
service.delete(this);
}
}
編集
現在、循環依存がありますが、これはあまり良くありません。JVM はおそらくそれを検出してクリーンアップできますが、WeakReference を使用することもできます。
シン ファクトリとファクト ファイルを使用するか、またはその逆にするかは、設計上の選択です。ただし、工場で削除されたファイルは削除されたことを認識している必要があるため、通信できる必要があります。
いくつかのコード (ファクト ファクトリを想定):
// This should be package scope!
FileImpl implements File {
private Weakreference<FactoryService> serviceRef;
// package scope!
FileImpl(FactoryService service) {
this.serviceRef = new WeakReference<FactoryService>(service);
}
public delete() {
// invalidate this object - all calls should throw exception
// Inform the service that this File should be deleted from
// the server; or if the FileImpl does that itself, that the
// FileService should update the cache of available files
FactoryService service = serviceRef.get();
if (service != null) {
service.delete(this);
}
}
}
この場合、ネットワーク接続が関係している可能性が高いため、ファクト ファクトリを想定しています。また、複数のオブジェクトとスレッド間で接続を共有すると、その接続を閉じる責任が不明確になる傾向があります。
これにより、FactoryService インターフェイスには、接続を終了し、すべてのファイルを無効にするメソッドclose()
またはメソッドが必要dispose()
になります (ファイルにアクセスできなくなるため)。
編集2
OOD に関する限り、私はおそらく Java File API を可能な限り模倣しようとします。したがって、オブジェクトはそれ自体を削除するように指示できます。実装が File にあるか、FileSystem のどこかにあるかは重要ではありません (インターフェイスとクラスのユーザーにとって)。