Java中的函数对象功能上类似于C语言中的函数指针,是一种策略模式。
public class StringLengthComparator {
public int compare(String str1,String str2){
return str1.length()-str2.length();
}
}
像上面代码这样,一个类仅仅是提供了一个方法,而这个方法是对其他对象(这些对象被作为参数显式地传递给方法)上的操作,这种类的实例等价于指向该方法的指针。这样的类被称为函数对象。
StringLengthComparator类是无状态的(它没有域),这个类的所有实例在功能上是等价的,因此把它作为Singeleton非常合适,这样可以避免不必要的创建对象的开销。
public class StringLengthComparator {
private StringLengthComparator(){}
public static final StringLengthComparator INSTANCE=new StringLengthComparator();
public int compare(String str1,String str2){
return str1.length()-str2.length();
}
}
我们在定义具体的策略时需要定义一个策略接口。
public interface Comparator<T> {
public int compare(T t1,T t2);
}
然后定义具体的策略类。
public class StringLengthComparator implements Comparator<String> {
//body here
}
具体的策略类往往采用匿名类声明:
Arrays.sort(stringArray,new Comparator<String>(){
public int compare(String str1,String str2){
return str1.length()-str2.length();
}
});
但是注意,匿名类在每次执行时都会创建一个新的实例,如果要重复使用,可以考虑将函数对象存储到一个私有的静态final域中,并重用它。