OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天
在研究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
相关阅读
OpenJDK源码研究过程中整理的学习笔记。 OpenJDK是GPL许可(GPL-licensed)的Java平台的开源实现。
原文参见:http://FansUnion.cn/articles/3057(小雷网-FansUnion.cn)
OpenJDK源码研究笔记(十):枚举的高级用法,枚举实现接口,竟是别有洞天的更多相关文章
- OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa
元数据最本质.最抽象的定义为:data about data (关于数据的数据).它是一种广泛存在的现象,在许多领域有其具体的定义和应用. JDBC中的元数据,有数据库元数据(DatabaseMeta ...
- OpenJDK源码研究笔记(十四):三种经典的设计方法,接口,接口-抽象类-具体实现类,接口-具体实现类
在研究OpenJDK源码过程中,我发现常用的设计方法就是2种:接口,接口-抽象类-具体实现类 . 在一些其它开源框架和业务开发中,经常存在着第3种设计,接口-具体实现类. 1.只有接口,没有实现类. ...
- OpenJDK源码研究笔记(十五):吐槽JDK中的10个富有争议的设计
前14篇文章,分享了JDK中值得学习和借鉴的编码和设计方法. 每个硬币都是有两面的.Every coin has two sides. 当然,JDK中也有很多值得改进或者说富有争议的设计. 本篇,就来 ...
- OpenJDK源码研究笔记(十六):在Java中使用JavaScript脚本语言
友情提示 本文主要参考了51CTO上的一篇文章,代码经过自己的模仿和整理,还算凑合. 本文中的代码注释比较多,不再过多解释. 更多用法,还是得看JDK的API或者看原文http://developer ...
- [置顶] OpenJDK源码研究笔记(九)-可恨却又可亲的的异常(NullPointerException)
可恨的异常 程序开发过程中,最讨厌异常了. 异常代表着程序出了问题,一旦出现,控制台会出现一屏又一屏的堆栈错误信息. 看着就让人心烦. 对于一个新人来讲,遇到异常经常会压力大,手忙脚乱,心生畏惧. 可 ...
- OpenJDK源码研究笔记(五)-缓存Integer等类型的频繁使用的数据和对象,大幅度提升性能(一道经典的Java笔试题)
摘要 本文先给出一个看似很简单实则有深意的Java笔试面试题,引出JDK内部的缓存. JDK内部的缓存,主要是为了提高Java程序的性能. 你能答对这道"看似简单,实则有深意"的J ...
- OpenJDK源码研究笔记(四)-编写和组织可复用的工具类和方法
本篇主要讲解java.util.Arrays这个针对数组的工具类. 1.可复用的工具类和方法. 这个工具类里,包含很多针对数组的工具方法,如 排序.交换.二分查找.比较.填充.复制.hashcode ...
- OpenJDK源码研究笔记(二)-Comparable和Comparator2个接口的作用和区别(一道经典的Java笔试面试题)
Comparable和Comparator是JDK中定义的2个比较接口,很相似,但又有所不同. 这2个接口的作用和区别也是Java中的常见经典面试题. 下面我们就来详细介绍下这2个接口的定义.作用.区 ...
- OpenJDK源码研究笔记(一)-参数检查&抛出带关键错误提示信息的异常
OpenJDK源码研究笔记系列文章,是我在阅读OpenJDK7源码的过程中的一些体会.收获.看法. 把研究过程中的成长和收获一点点地整理出来,是对自己研究学习的一个小结,也有可能给学习Java的一些同 ...
随机推荐
- NSURLConnection和NSRunLoop
主线程中创建一个NSURLConnection并异步运行 [self performSelectorOnMainThread:@selector(start) withObject:nil waitU ...
- GetKeyState(), GetAsyncKeystate(), GetKeyboardSlate()
GetKeyState.GetAsyncKeyState.GetKeyboardState函数的差别: 1.BOOL GetKeyboardState( PBYTE lpKeyState );获得全部 ...
- 三步实现沉浸式状态栏(即状态栏与APP同色)
本篇实现的是沉浸式状态栏.先明白下概念,什么是状态栏?直接上图: 什么是沉浸式状态栏?演示样例图例如以下: ...
- POJ1338 & POJ2545 & POJ2591 & POJ2247 找给定规律的数
POJ1338 2545 2591 2247都是一个类型的题目,所以放到一起来总结 POJ1338:Ugly Numbers Time Limit: 1000MS Memory Limit: 10 ...
- 11_HTML5_Local_Storage本地存储
本地存储localStorage是大型cookie,cookie只有4k,
- Data Member Order
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/data-member-order In some appl ...
- iOS数据持久化 -- Core Data
Core Data是一个功能强大的层,位于SQLite数据库之上,它避免了SQL的复杂性,能让我们以更自然的方式与数据库进行交互.Core Data将数据库行转换为OC对象(托管对象)来实现,这样无需 ...
- springboot 注入xml自定义类
新建入口类可扫描类: @Configuration @ImportResource(locations = {"classpath:spring-bean.xml"}) publi ...
- Linux常用命令及其英文全称
alias:给命令起别名 awk = "Aho Weiberger and Kernighan" ,三个作者的姓的第一个字母 bash:GNU Bourne-Again She ...
- iOS——集成支付宝 系统繁忙,请稍后再试ALI10
问题描述:调用支付宝时,显示系统繁忙,请稍后再试(ALI10).代码没有报错,其他也是按照文档来的,为何老是提示显示系统繁忙? 解决方案:还需要在targets的中info里面,添加 url typ ...