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的一些同 ...
随机推荐
- Linux硬链接和软链接的差别
1.硬链接文件和原文件指向相同的数据,两者就像克隆一样,inode号也相同,当删除原 文件时. 硬链接文件仍然存在有效. 但硬链接文件不同于文件的复制.应该说硬链接文件的产生仅仅是原文件所 在文件夹文 ...
- 从client(content="<p></p>")中检測到有潜在危急的 Request.Form 值。
最近的站点要做一个新闻模块,站点后台须要对新闻进行管理,拿到富文本编辑器的内容,在获取的时候会报一个错误:从client(content="<p>.....</p>& ...
- HDU 5303 Delicious Apples (2015多校第二场 贪心 + 枚举)
Delicious Apples Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Other ...
- 在jqueryEasyUI界面将时间以日期加时分秒的格式显示
问题描写叙述: oracle 10G中用户表有一个字段是日期型.数据格式为yyyy-MM-dd HH:mm:ss,前端显示时仅仅能显示成yyyy-MM-dd 后面的 HH:mm:ss不显示. 经过一番 ...
- vim 插件之supertab
supertab.vim 这个插件是用来把tab键作为只能补全的映射,当然,具体更能肯定不仅仅只是如此,等待以后发现吧 地址 http://github.com/ervandew/supertab h ...
- Python 序列化处理
序列化 文件为dump 字符串为dumps dumps()方法返回一个str,内容就是标准的JSON loads()方法将其还原 在程序运行的过程中,所有的变量都是在内存 d = dict(name= ...
- 【转】Android ClearEditText:输入用户名、密码错误时整体删除及输入为空时候晃动提示
1 package com.lixu.clearedittext; 2 3 4 import android.app.Activity; 5 import android.os.Bundle; 6 i ...
- HibernateProperties 配置属性
Hibernate properties Hibernate配置属性 属性名 用途hibernate.dialect ;一个Hibernate Dialect类名允许Hibernate针对特定的关系数 ...
- OpenGL编程(三)让矩形动起来
上次实现了在窗口中添加一个了一个矩形.这次的任务是在上次代码的基础上,让那个矩形动起来. 1.思路 要看到动态的效果,首先添加一个定时器,规定的时间刷新一次窗口:不断修改矩形的位置,使其在时间轴上达到 ...
- win环境操作mysql
第一步:登录数据库 第二步:查看数据库 第三步:进入数据库 第四步:创建表 第五步:删除数据库 第六步:进入数据库查看表状态