代码之家  ›  专栏  ›  技术社区  ›  Bozho

一种避免对API显式依赖的正确方法,但如果存在API,则仍然使用它

  •  2
  • Bozho  · 技术社区  · 15 年前

    当我在《春之源》中挖掘一个问题时,我发现了以下问题:

    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的情况下显式地依赖它?
    3 回复  |  直到 15 年前
        1
  •  3
  •   David Waters    15 年前

    我觉得这个问题的代码很清楚。 我能想到的避免编译时依赖性的唯一方法是使用反射。尝试按名称加载类,如果存在,则搜索您所追求的方法。

    我觉得反省更糟。

        2
  •  2
  •   Kevin    15 年前

    有更好的预防方法吗 显式依赖于API,而 仍然在使用它。

    除了为依赖项创建包装器API之外,我不这么认为。当您只使用API的一小部分时,创建一个包装API就足够好了。

        3
  •  0
  •   Mnementh    15 年前

    如果您只有一个运行时依赖项(您的程序检查库的存在并采用不同的代码路径),那么您只需在不使用库的情况下编码和传递即可。编译时依赖性保持不变,但Java在运行时根据需要链接对象。