-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).

但是,我们一直在讨论这是否违背了广泛接受的“原则”。首先; 我们是否因为在接口中创建实现依赖而遇到麻烦?严格来说,接口现在对实现有一个直接的“引用”。其次,我们意识到我们的测试不能仅仅“注入”aMemoryDiskStorage或 a MockDiskStorage,因为接口中的静态字段是 final 字段。我们如何解决这个问题?

4

2 回答 2

1

在我看来,您已经回答了自己的问题:是的,这是一个坏主意,因为通过解决 IoC 的复杂性,您已经破坏了 IoC,并且无法在测试中模拟存储实现。这些电话是有原因的。context.getImpl(Storage.class)

于 2015-10-15T12:46:53.030 回答
1

它使您无法将接口与实现分开。

例如,在一个更复杂的ModuleA依赖于的应用程序中ModuleB,您可能希望将服务的接口分离ModuleBModuleBInterfaceModuleA依赖于ModuleBInterface. 您的方法使这成为不可能,因为接口取决于实现,而实现也取决于其接口。

于 2015-10-15T13:05:01.590 回答