美文网首页
[Effective Java] Item 21: Use fu

[Effective Java] Item 21: Use fu

作者: YoungJadeStone | 来源:发表于2019-04-15 12:35 被阅读0次

Item 21主要讲述了在java里,用function object来表示strategy。

有些语言支持function pointers(指向函数的指针),但是java不支持。在java里,可以用object reference去达到类似的效果。

什么是function pointers

函数的指针在C++中的例子:

int foo()
{
    return 5;
}
 
int goo()
{
    return 6;
}
 
int main()
{
    int (*funcPtr)() = foo; // funcPtr 现在指向了函数foo
    funcPtr = goo; // funcPtr 现在又指向了函数goo。但是千万不要写成funcPtr = goo();这是把goo的返回值赋值给了funcPtr
    return 0;
}

java里的替代

在java里,invoking a method on an object typically performs some operation on that object(对一个object调用一个method会在这个object上面进行一些操作)。但是我们也可以通过给method传入object,对其他object进行操作。

我们看看下面这个class:

class StringLengthComparator {
  public int compare(String s1, String s2) {
    return s1.length() - s2.length();
  }
}

这个class是stateless的:它没有fields。所以这个class的所有实例都是功能上相等的。一个StringLengthComparator的实例就是一个concrete strategy。

除了concrete strategy,我们还需要strategy interface。否则使用者不能再传入其他的comparison strategy。

// strategy interface
public interface Comparator<T> {
  public int compare(T t1, T t2);
}

concrete strategy常常用anonymous classes定义,比如说:

Arrays.sort(stringArray, new Comparator<String>() {
  public int compare(String s1, String s2) {
    return s1.length() - s2.length();
  }
);

如果concrete strategy会被反复用到,我们可以用private static member class定义这个concrete strategy,再把这个class当做另一个class的public static final field,定义成它的strategy interface的类型。

// exporting a concrete strategy
class Host {
  private static class StrLenCmp implements Comparator<String>, Serializable {
    public int compare() {
      return s1.length() - s2.length();
    }
  }

  // returned comparator is serializable
  public static final Comparator<String> STRING_LENGTH_COMPARATOR = new StrLenCmp();
  ... // bulk of class omitted
}

Reference

相关文章

网友评论

      本文标题:[Effective Java] Item 21: Use fu

      本文链接:https://www.haomeiwen.com/subject/pequwqtx.html