OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天

时间:2023-02-09 07:16:59

在研究OpenJDK,Java编译器javac源码的过程中,发现以下代码。

顿时发现枚举类竟然也有如此“高端大气上档次”的用法。

沙场点兵(用法源码)

com.sun.tools.javac.file.JavacFileManager.SortFiles
protected enum SortFiles implements Comparator<File> {
FORWARD {
public int compare(File f1, File f2) {
return f1.getName().compareTo(f2.getName());
}
},
REVERSE {
public int compare(File f1, File f2) {
return -f1.getName().compareTo(f2.getName());
}
};
};

指点*(代码说明)

1.枚举类SortFiles 实现了比较器Comparator接口。

2.真正实现了接口方法的是枚举类的元素FORWARD和REVERSE。

3.2个比较方法的实现区别仅在于“一个负号”“-”。

我以前看到的顺序逆序的比较代码,是以下形式的:

 return f1.getName().compareTo(f2.getName());
return f2.getName().compareTo(f1.getName());

这种形式的,仔细看才能看出差别。

没有“一个负号”直接“取反”来的简便。

别有洞天(受益匪浅)

以前在Java中使用枚举,与大学时学习C/C++时一样,最常用最熟悉的就是以下形式:

enum ItWebsite{ CSDN,ITEye,FansUnion};

自从多次看了JDK源码中枚举的用法,尤其是这次发现的“枚举实现接口”,真的“涨姿势”了。

现在越来越发现,研究开源代码,尤其是牛逼的JDK开源实现OpenJDK的源码,收获真是很大啊。

小试牛刀(使用示例)

public class Website {
//网站的名字
private String name; public Website(String name) {
this.name = name;
} public String getName() {
return name;
}
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List; /**
* OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天
*
* @author LeiWen@FansUnion.cn
*
*/
public class EnumImplementsInterfaceExample { enum WebsiteSort implements Comparator<Website> {
// 网站的名字,大小比较
FORWAWD {
public int compare(Website w1, Website w2) {
return w1.getName().compareTo(w2.getName());
} },
// 网站的名字,大小比较,取反
REVERSE {
public int compare(Website w1, Website w2) {
return -w1.getName().compareTo(w2.getName());
} }
} public static void main(String[] args) {
List<Website> threeITWebsites = buildThreeITWebsites();
// 特别说明:java.util.Collections.sort 根据集合元素的自然顺序,按照升序排列。 // 顺序排序
Collections.sort(threeITWebsites, WebsiteSort.FORWAWD);
display(threeITWebsites); // 换行
System.out.println(); // 逆序排序
Collections.sort(threeITWebsites, WebsiteSort.REVERSE);
display(threeITWebsites);
} private static void display(List<Website> threeITWebsites) {
for (Website website : threeITWebsites) {
System.out.print(website.getName() + "\t");
} } // 构造3个IT技术网站
private static List<Website> buildThreeITWebsites() {
List<Website> websiteList = new ArrayList<Website>();
websiteList.add(new Website("CSDN.net"));
websiteList.add(new Website("ITEye.com"));
websiteList.add(new Website("FansUnion.cn"));
return websiteList;
}
}

有模有样(运行结果)

CSDN.net    FansUnion.cn    ITEye.com    
ITEye.com    FansUnion.cn    CSDN.net

相关阅读

我的CSDN博客专栏  OpenJDK源码研究笔记

OpenJDK源码研究过程中整理的学习笔记。 OpenJDK是GPL许可(GPL-licensed)的Java平台的开源实现。

原文参见http://FansUnion.cn/articles/3057(小雷网-FansUnion.cn)