0

问题

在做出以下决定时应使用哪些标准:

  • 使用注释指定依赖项,以及
  • 使用更具体的接口指定依赖项

例子

假设我有:

interface FooLoader {
    Foo loadById(long id);
}

class DBFooLoader implements FooLoader {
    ... jdbc etc. etc. ...
}

class CachingFooLoader implements FooLoader {
    ...
    @Inject
    public CachingFooLoader(FooLoader delegate) {
        this.delegate = delegate;
    }
    ...
}

假设我想绑定FooLoaderCachingFooLoader,我有[至少]两种方式来连接它:

使用注解绑定

改变:

public CachingFooLoader(FooLoader delegate)

到:

public CachingFooLoader(@NonCaching FooLoader delegate)

进而:

bind(FooLoader.class).annotatedWith(NonCaching.class).to(DBFooLoader.class);

创建更具体的界面

改变:

public CachingFooLoader(FooLoader delegate)

到:

public CachingFooLoader(NonCachingFooLoader delegate)

在哪里NonCachingFooLoader简单地 extends FooLoader,然后有DBFooLoaderimplement NonCachingFooLoader,并相应地连接起来。

我的想法

出于多种原因,我被吸引到使用注释绑定:

  • 键比接口更容易重用,这减少了接口可能遭受的组合爆炸。
  • 它侵入性较小:配置保留在 Guice 模块中,而不是“中毒”类。

但是,创建更具体的界面也有其优点:

  • 接口有更多的意义。通常只有 Guice 会读取注释,而接口的用途更多。

那么,应该使用什么标准来确定采用哪种方法呢?

(Spring 用户,据我所知,这就是你们所说的限定符。)

4

1 回答 1

0

在有意义时才使用特定接口,即它们必须提供不同的 API,因此其他类将以特定方式使用它们。

如果它们以不同的方式提供相同的“服务”,那么只使用一个通用接口并通过注释区分实现。

于 2011-10-11T07:32:35.727 回答