Java中的匿名类简述
原理以及使用目的不再赘述,这里只举个例子
当我们实现一个接口的时候,往往声明一个类,例如
/**A comparsion function that imposes a total ordering on some objects
*...*/
public interface Comparator<T> {
/** Compares its two argument for order
*...*/
public int compare(T o1, T o2);
}
实现这个接口,我们这样声明:
/**Orders String by length(shorter first)*/
public class StringLengthComparator implements Comparator<String> {
@Override
public int compare(String s1, String s2) {
if (s1.length() == s2.length()) {
return s1.compareTo(s2);
}
return s1.length() - s2.length();
}
}
在客户端,假设这样使用
Comparator<String> cmp = new StringLengthComparator();
SortedSet<String> strings = new TreeSet<>(cmp);
strings.addAll(List.of("aaa", "bb", "c"));
为了更简洁的表达,或者这样
SortedSet<String> strings = new TreeSet<>(new StringLengthComparator());
strings.addAll(List.of("aaa", "bb", "c"));
这样就efficient enough?,certainly not!
大杀器匿名类!
直接在客户端使用如下代码
SortedSet<String> strings = new TreeSet<>(new Comparator<String>(){
@Override public int compare(String s1, String s2) {
if (s1.length() == s2.length()) {
return s1.compareTo(s2)
}
return s1.length() - s2.length();
}
});
strings.addAll(List.of("aaa", "bb", "c"));
总结:再调用匿名类的时候,直接 new 接口名 + 方法重写,省去了再次声明类来实现接口的步骤。