0

我已经编写了这个项目,并且已经在我的其他库中使用它。

然而,我发现有些不对劲。即,在这个库的每个用户中,我创建一个实用程序类,其唯一作用是提供一个或多个MessageBundles。这很糟糕。

我希望在图书馆中内置一种机制,以便图书馆用户能够注册/召回捆绑包。

我的第一个想法是拥有一个带有.register()and.get()方法的单例工厂(适当检查重复键等)并从static初始化块中调用它们......

...但是有一个问题:不能保证首先调用哪个静态初始化块。

知道我想保持这个库的依赖“完整”(也就是说,根本没有外部依赖),你会推荐什么解决方案?

(注意:这是 Java 6+)

4

1 回答 1

1

您可以使用对服务提供者的标准支持:ServiceLoader。您只需要求库的每个用户提供某个接口的实现,例如

public interface MessageBundleProvider {
    List<MessageBundle> getBundles();
}

实现此接口的类的名称必须在名为 的用户库的 jar 文件中指定META-INF/services/com.example.MessageBundleProvider

在运行时,您的库将使用以下代码自动发现所有消息包提供程序:

private static final ServiceLoader<MessageBundleProvider> LOADER
    = ServiceLoader.load(MessageBundleProvider.class);

private static final List<MessageBundle> BUNDLES;

static { 
    BUNDLES = new ArrayList<MessageBundle>();
    for (MessageBundleProvider provider : loader) {
         for (MessageBundle bundle : provider.getBundles()) {
             BUNDLES.add(bundle);
         }
    }
}

免责声明:我知道 ServiceLoader 存在,但我以前从未使用过它。不过,这是发现所有标准 Java 服务提供者的方式(如 JDBC 驱动程序、字符集提供者等)。

于 2013-06-01T18:06:36.987 回答