【Practical API Design学习笔记】谨慎使用第三方API

    我们在设计API时,很可能需要使用三方API,并将其暴露出去。但是这样做会有危险。当第三方API变化时,我们设计的API也会变化,因为是直接将第三方API暴露出去的。

    例如:假设String类定义如下:

public final class String {
  private final char[] chars;
  public String(char[] chars) {
    this.chars = chars.clone();
  }
  public int length() {
    return chars.length;
  }
  public char charAt(int i) {
    return chars[i];
  }
}
    我们使用它:

Query query = new Query();
String reply = query.computeReply();
assertEquals("Length is correct", 5, reply.length());
    假设String类的length方法变成了getSize()方法,那么我们设计的API接口就变了。

    对于以上问题,有三种解决方案:

    1、接受它,允许我们的API随着使用并暴露出去的第三方API变化而变化;

    2、拒绝它,要求你需要有权利阻止第三方API发生变化;

    3、包装它,我们的API在使用第三方API时,将其包装一层。

    例如:

public final class Query {
  public static final class Sequence {
    private String data;
    Sequence(String data) {
      this.data = data;
    }
    public int length() {
      return data.length();
    }
    public char charAt(int i) {
      return data.charAt(i);
    }
  }
  public Sequence computeReply() {
    char[] hello = { 'H', 'e', 'l', 'l', 'o' };
    return new Sequence(new String(hello));
  }
}
当第三方API的length()方法变成getSize()方法时:

public final class Query {
  public static final class Sequence {
    private String data;
    Sequence(String data) {
      this.data = data;
    }
    public int length() {
      return data.getSize();
    }
    public char charAt(int i) {
      return data.charAt(i);
    }
  }
  public Sequence computeReply() {
    char[] hello = { 'H', 'e', 'l', 'l', 'o' };
    return new Sequence(new String(hello));
  }
}

    

你可能感兴趣的:(api)