-1

私は、実際のクラスの実装をインターフェイスの静的フィールドに保持するプロジェクトに取り組んでいます。これの一例は次のとおりです。

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どうすればこれを回避できますか?

4

2 に答える 2