Effective Java 学习笔记(21)

来源:互联网 发布:西门子vb脚本 编辑:程序博客网 时间:2024/06/05 18:25

使用函数对象表示策略。 实际上就是以Java的方式来实现函数指针。

 

用Java的方式实现,首先可以定义一个泛型接口,

 


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

 

然后用一个类来实现它。这个类最好的sington模式,因为它没有状态,没有成员变量。

 

有时也可采用匿名类的方式

 

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

 

但是这种方式每运行一次,就会新创建一个对象。

因此,对于频繁使用的场合,最好用个静态的final 域来保存。

 

class Host {
private static class StrLenCmp
implements Comparator<String>, Serializable {
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
}
// Returned comparator is serializable
public static final Comparator<String>
STRING_LENGTH_COMPARATOR = new StrLenCmp();
... // Bulk of class omitted
}

 

函数指针的主要用途就是实现策略(Strategy)模式,为了在Java中实现这种模式,要声明一个接口来表示该策略声明了该接口的类。当一个具体策略只被使用一次时,通常使用匿名类来声明和实例化这个具体策略类。当一个具体策略类是设计用来重复使用的时候,它的类通常就要被实现为私有的静态成员类,并通过公有的静态final域被导出,其类型为该策略接口。

原创粉丝点击