java - 避免显式依赖 API 的正确方法,同时仍然使用它(如果存在)

标签 java

当我在 spring 的源代码中挖掘问题时,我发现了以下内容:

public abstract class RequestContextHolder {
    private static final boolean jsfPresent = 
        ClassUtils.isPresent("javax.faces.context.FacesContext", 
        RequestContextHolder.class.getClassLoader());

然后在一个方法中:

if (jsfPresent) {
    attributes = FacesRequestAttributesFactory.getFacesRequestAttributes();
}

工厂定义为:

/**
 * Inner class to avoid hard-coded JSF dependency.
 */
private static class FacesRequestAttributesFactory

这显然是有效的,因为内部类在需要时才被“触及”,并且此时可以确定 JSF 存在于类路径上。

现在,我想知道这是否是适用于其他情况的好方法。例如,此方法意味着编译时依赖。

那么,有两个问题:

  • 除了编译时依赖性之外,这种方法还有什么缺点
  • 是否有更好的方法来防止对 API 的显式依赖,同时仍然使用它。

最佳答案

问题中的代码对我来说看起来很干净。 我能想到的避免编译时间依赖性的唯一方法是使用反射。尝试按名称加载类,如果存在,请搜索您要查找的方法。

反射(reflection)对我来说听起来更糟糕。

关于java - 避免显式依赖 API 的正确方法,同时仍然使用它(如果存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2087097/

相关文章:

java.util.InputMismatchException 使用scanner.nextFloat JAVA

java - 在Java中将文件名/目录传递到命令行

java - Imagebutton.setImageURI(uri) 不起作用

java - 使用Lombok库,但如何自定义/重写setter方法

Java 创建内存不足的实例

java - 如何在JAR/JAVA包中嵌入python脚本?

java - static() 方法(没有任何声明)

java - catch block 在 C++ native 库中不起作用

java - 如何区分空值字段和 jackson 库中不存在的字段

java - 从 map pacman java中删除点