gpt4 book ai didi

java - 仅在可用 java 时才使用库

转载 作者:搜寻专家 更新时间:2023-11-01 02:43:30 26 4
gpt4 key购买 nike

在 C++ 或 C 中,您可以这样做:

#ifdef WINAPI
public void showWindow(int cmdShow);
#endif

但是在 java 中,我如何定义方法,只有在用户启用库时才会编译?我正在制作一个跨平台应用程序,它使用 JVM 尚未抽象的某些 native 功能。

此外,我经常创建允许从某个库中的对象创建我的类的构造函数。在这种情况下,一旦构造函数存在,它就会强制用户拥有该库。相反,我希望它仅在用户拥有该库时才启用。

最佳答案

Java 没有宏和模板的概念。相反,它有反射和泛型。在您的情况下,您将使用反射。这个想法是对接口(interface)进行编码,然后在运行时找出要使用的实现。如果找不到合适的/自定义实现,则需要回退到某些默认值(如果默认情况下您不希望发生任何事情,则可能是无操作实现)。

支持这种架构的最佳方式是为您的接口(interface)层次结构提供一个入口点,即工厂。然后入口点将向所有客户提供他们需要的实现。入口点可以使用反射来确定您想要哪种实现,例如,

public final class LibraryManager {
public static LibraryInterface find(String url) { ... }
}

LibraryManager以上通过反射计算出 LibraryInterface 的实现你想在运行时获取。 url可以只是 LibraryInterface 所需实现的完全限定类名,例如 com.my.pack.MyLibraryInterfaceImpl .

要在实践中理解这一点,请查看 JDBC 的 DriverManager : 你得到了 Connection 的实现通过提供 DriverManager.getConnection带有 jdbc URL 的方法。在幕后,DriverManager使用反射找到正确的驱动程序并返回所需的实现。如果给定 URL 的驱动程序库不可用,您将得到一个异常。

在您的情况下,您需要对该模式进行的唯一修改是在未指定库的情况下提供一些默认实现。如果实现依赖于第 3 方库,您将需要编写适当的适配器来使用这些库等。

请注意,在许多情况下,您实际上会将一个工厂返回给您的库实现,这样您就可以创建许多库对象的实例。除了返回一些 LibraryFactoryInterface 之外,这与上面的工作方式完全相同。相反。

最后,如果您使用某种 IoC 或 DI 框架,例如 Spring,您可以在配置时定义要注入(inject)到应用程序中的实现工厂。一个典型的例子和一个替代 DriverManager DataSource .在 Spring 应用程序中定义 DataSource 是很常见的s 在配置文件中。 Spring 将负责连接 DataSource进入需要连接到数据库的对象。

关于java - 仅在可用 java 时才使用库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28159663/

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