克服しようとしている基本的な問題は、元のjava.io
API がまったく柔軟性がないことです (それらはすべて具象クラスを参照します)。たとえば にさまざまな機能を追加できる唯一の方法はjava.io.File
、基本クラスを拡張することです。
設計後にクラスを拡張することは、悪い設計になる可能性があります (Properties
クラスを見てください)。これが、おそらくそれを行うライブラリを見つけられない理由です。
java.io.File
自分でクラスを拡張し、すべてのメソッドをFileObject
Commons VFS APIなどにプロキシすることを妨げるものは何もありません。
編集:ただし、そのアプローチではおそらく失敗する可能性があります。たとえば、File
parent を取るコンストラクターを使用する場合などFile
です。
編集2:まあ、私はそのようなものから始めます:
public class VirtualFile extends java.io.File {
public static VirtualFile fromFile(File file) {
if (file instanceof VirtualFile) {
return (VirtualFile) file;
} else {
FileSystemManager fsm = new DefaultFileSystemManager();
return fsm.toFileObject(file);
}
}
private final org.apache.commons.vfs.FileObject mProxyFileObject;
public VirtualFile(FileObject proxy) {
super("/tmp/xxxx"); // That part needs some work to be cross-platform.
// However, such a construction will completely
// destroy the expectations that other classes
// have about what a File is.
mProxyFileObject = proxy;
}
public VirtualFile(VirtualFile parent, String child) {
this(parent.mProxyFileObject.resolveFile(child));
}
public VirtualFile(File parent, String child) {
this(fromFile(parent), child);
}
@Override
public boolean canExecute() {
throw new UnsupportedOperationException();
}
@Override
public boolean canRead() {
try {
return mProxyFileObject.isReadable();
} catch (FileSystemException fse) {
// FileSystemException is not a Runtime Exception :(
throw new RuntimeException(fse);
}
}
// Override ALL public methods to throw Exceptions;
// implement or mock only the methods that you need.
}
コンストラクターがそのセットアップで機能しない理由についてFile(File, String)
: そのコンストラクターは、 の実装がFile
クラスのコントラクトを破ることを期待していません。これは、 を呼び出すときに行いますsuper("/tmp/xxxx")
。(そして、作業したい仮想ファイルには単純なFile
等価物がないため、クラスの契約を破ることは避けられません)
これで、かなりの作業が必要になり、ライブラリが期待どおりに機能しない可能性が高くなります。