私は、実際のクラスの実装をインターフェイスの静的フィールドに保持するプロジェクトに取り組んでいます。これの一例は次のとおりです。
public interface Storage {
public static Storage instance = new DiskStorage();
public File get(String name) throws Exception;
public void create(File f) throws Exception;
public void delete(File f) throws Exception;
}
これは、IoC フレームワークを使用する際の複雑さを回避し、コードに のような呼び出しを散らかさないようにするためcontext.getImpl(Storage.class)です。さらに、インターフェイスの静的フィールドに実装参照を保持することで、大きなファクトリ クラスを導入することを回避するためにもこれを行います。これで達成できることは、何かを保存する必要があるアプリケーションのすべての部分がStorage.instance.create(File f).
ただし、これが広く受け入れられている「原則」に反するかどうかについては議論してきました。初めに; インターフェイスで実装の依存関係を作成するのに問題がありますか? 厳密に言えば、インターフェイスは実装への直接の「参照」を持つようになりました。第二に、インターフェイスの static フィールドが final フィールドであるため、テストが単に aMemoryDiskStorageまたは aを「注入」できないことを認識しています。MockDiskStorageどうすればこれを回避できますか?