我正在做一个项目,我们将实际的类实现保存在接口的静态字段中。一个例子是:
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 字段。我们如何解决这个问题?