如何在针对Java 1.5优雅降级的同时引用Java 1.6 API?

Sim*_*son 10 java graceful-degradation

我想使用Java 1.6中的java.text.Normalizer类来进行Unicode规范化,但我的代码必须能够在Java 1.5上运行.

我不介意在1.5上运行的代码是否不进行规范化,但我不希望它在运行时给出NoClassDefFoundErrors或ClassNotFoundExceptions.

实现这一目标的最佳方法是什么?

ska*_*man 13

通常的做法是通过反射,即不直接引用相关类,而是以编程方式调用它.如果相关代码不存在,您可以优雅地捕获异常,并忽略它或尝试其他方法.反射抛出ClassNotFoundException,这是一个很好的正常例外,而不是NoClassDefFoundError,这有点可怕.

在这种情况下java.text.Normalizer,这应该很简单,因为它只是几个静态方法,并且很容易通过反射调用.

  • @simonn:请参阅http://stackoverflow.com/questions/1279910以获​​取可能符合您要求的代码. (2认同)

And*_*ffy 9

public interface NfcNormalizer
{
  public String normalize(String str);
}

public class IdentityNfcNormalizer implements NfcNormalizer
{
  public String normalize(String str)
  {
    return str;
  }
}

public class JDK16NfcNormalizer implements NfcNormalizer
{
  public String normalize(String str)
  {
    return Normalizer.normalize(str, Normalizer.Form.NFC);
  }
}
Run Code Online (Sandbox Code Playgroud)

在您的客户端代码中:

NfcNormalizer normalizer;
try
{
  normalizer = Class.forName("JDK16NfcNormalizer").newInstance();
}
catch(Exception e)
{
  normalizer = new IdentityNfcNormalizer();
}
Run Code Online (Sandbox Code Playgroud)