gpt4 book ai didi

java - 获取库提供的 "centralize"实例的好方法?

转载 作者:行者123 更新时间:2023-12-01 14:30:45 24 4
gpt4 key购买 nike

我写了this project并且已经在我的其他库中使用它。

但是,我发现有些不对劲。也就是说,在该库的每个用户中,我创建一个实用程序类,其唯一作用是提供一个或多个 MessageBundle。这很糟糕。

我希望在库中内置一种机制,以便库用户能够注册/调用 bundle 。

我的第一个想法是拥有一个带有 .register().get() 方法的单例工厂(对重复键等进行适当检查)并调用这些来自static初始化 block ...

...但是有一个问题:无法保证首先调用哪个静态初始化 block 。

知道我想保持这个库的依赖关系“完整”(这意味着根本没有外部依赖关系),您会推荐什么解决方案?

(注意:这是 Java 6+)

最佳答案

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

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

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

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

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 驱动程序、字符集提供程序等)。

关于java - 获取库提供的 "centralize"实例的好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16875111/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com