用函数对象表示策略

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域中,并重用它。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值