OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天
2013-11-02 08:47
615 查看
在研究OpenJDK,Java编译器javac源码的过程中,发现以下代码。
顿时发现枚举类竟然也有如此“高端大气上档次”的用法。
沙场点兵(用法源码)
指点江山(代码说明)
1.枚举类SortFiles 实现了比较器Comparator接口。
2.真正实现了接口方法的是枚举类的元素FORWARD和REVERSE。
3.2个比较方法的实现区别仅在于“一个负号”“-”。
我以前看到的顺序逆序的比较代码,是以下形式的:
这种形式的,仔细看才能看出差别。
没有“一个负号”直接“取反”来的简便。
别有洞天(受益匪浅)
以前在Java中使用枚举,与大学时学习C/C++时一样,最常用最熟悉的就是以下形式:
自从多次看了JDK源码中枚举的用法,尤其是这次发现的“枚举实现接口”,真的“涨姿势”了。
现在越来越发现,研究开源代码,尤其是牛逼的JDK开源实现OpenJDK的源码,收获真是很大啊。
小试牛刀(使用示例)
有模有样(运行结果)
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)
顿时发现枚举类竟然也有如此“高端大气上档次”的用法。
沙场点兵(用法源码)
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)
相关文章推荐
- OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天
- OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天
- OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天
- OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天
- OpenJDK源码研究笔记(十四):三种经典的设计方法,接口,接口-抽象类-具体实现类,接口-具体实现类
- OpenJDK源码研究笔记(十四):三种经典的设计方法,接口,接口-抽象类-具体实现类,接口-具体实现类
- OpenJDK源码研究笔记(十四):三种经典的设计方法,接口,接口-抽象类-具体实现类,接口-具体实现类
- OpenJDK源码研究笔记(十四):三种经典的设计方法,接口,接口-抽象类-具体实现类,接口-具体实现类
- OpenJDK源码研究笔记(三)-RandomAccess等标记接口的作用
- OpenJDK源码研究笔记(三)-RandomAccess等标记接口的作用
- OpenJDK源码研究笔记(三)-RandomAccess等标记接口的作用
- OpenJDK源码研究笔记(三)-RandomAccess等标记接口的作用
- OpenJDK源码研究笔记(二)-Comparable和Comparator2个接口的作用和区别(一道经典的Java笔试面试题)
- OpenJDK源码研究笔记(二)-Comparable和Comparator2个接口的作用和区别(一道经典的Java笔试面试题)
- OpenJDK源码研究笔记(七)–Java字节码文件(.class)的结构
- OpenJDK源码研究笔记(八)-详细解析如何读取Java字节码文件(.class)
- OpenJDK源码研究笔记(五)-缓存Integer等类型的频繁使用的数据和对象,大幅度提升性能(一道经典的Java笔试题)
- Hibernate实战_笔记34(映射枚举、实现EnhanceUserType接口)
- OpenJDK源码研究笔记(十三):Javac编译过程中的上下文容器(Context)、单例(Singleton)和延迟创建(LazyCreation)3种模式
- OpenJDK源码研究笔记(四)-编写和组织可复用的工具类和方法