接口
一般我们使用接口的时候都是直接实现接口,然后覆盖接口中的方法。
然而我要介绍的这种是在Thking in java 中看到的。定义一个接口句柄,把接口句柄作为方法的参数,
然后要使用这个方法的时候,必须传递一个实现了这个接口的类,或者内部类。这里的特别之处在于
把接口作为方法的参数。
例如
Compare接口如下:
package c08;
interface Compare {
boolean lessThan(Object lhs,Object rhs);
boolean lessThanOrEqual(Object lhs,Object rhs);
}
SortVector类的构建器使用了一个接口句柄
package c08;
import java.util.*;
public class SortVector extends Vector {
private Compare compare;
public SortVector(Compare comp){
compare=comp;
}
public void sort(){
quickSort(0,size()-1);
}
private void quickSort(int left,int right){
if(right>left){
Object o1=elementAt(right);
int i=left-1;
int j=right;
while(true){
while(compare.lessThan(
elementAt(++i),o1));
while(j>0)
if(compare.lessThanOrEqual(elementAt(--j), o1))
break;
if(i>=j)break;
swap(i,j);
}
swap(i,right);
quickSort(left,i-1);
quickSort(i+1,right);
}
}
private void swap(int loc1,int loc2){
Object tmp=elementAt(loc1);
setElementAt(elementAt(loc2),loc1);
setElementAt(tmp,loc2);
}
}
这里使用了StringCompare内部类实现Compare接口
package c08;
import java.util.*;
public class StringSortTest {
static class StringCompare implements Compare{
public boolean lessThan(Object lhs,Object rhs)
{
return ((String)lhs).toLowerCase().compareTo(((String)rhs).toLowerCase())<0;
}
public boolean lessThanOrEqual(Object lhs,Object rhs){
return ((String)lhs).toLowerCase().compareTo(((String)rhs).toLowerCase())<=0;
}
}
public static void main(String[] args){
SortVector sv=new SortVector(new StringCompare());
sv.addElement("d");
sv.addElement("A");
sv.addElement("C");
sv.addElement("c");
sv.addElement("b");
sv.addElement("B");
sv.addElement("D");
sv.addElement("a");
sv.sort();
Enumeration e=sv.elements();
while(e.hasMoreElements())
System.out.println(e.nextElement());
}
}
也可以用匿名内部类来实现Compare接口
private SortVector v = new SortVector(
new Compare() {
public boolean lessThan(Object l, Object r) {
return ((String)l).toLowerCase().compareTo(((String)r).toLowerCase()) < 0;
}
public boolean lessThanOrEqual(Object l, Object r) {
return ((String)l).toLowerCase().compareTo(((String)r).toLowerCase()) <= 0;
}
}
);
总结
Java中通过接口来实现变的东西,从而将不变的与变得分隔开,这是Java很重要的设计思想。上面这种接口的使用方法
希望能给大家一个启发,谢谢阅读。