在研究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)

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

  1. OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa

    元数据最本质.最抽象的定义为:data about data (关于数据的数据).它是一种广泛存在的现象,在许多领域有其具体的定义和应用. JDBC中的元数据,有数据库元数据(DatabaseMeta ...

  2. OpenJDK源码研究笔记(十四):三种经典的设计方法,接口,接口-抽象类-具体实现类,接口-具体实现类

    在研究OpenJDK源码过程中,我发现常用的设计方法就是2种:接口,接口-抽象类-具体实现类 . 在一些其它开源框架和业务开发中,经常存在着第3种设计,接口-具体实现类. 1.只有接口,没有实现类. ...

  3. OpenJDK源码研究笔记(十五):吐槽JDK中的10个富有争议的设计

    前14篇文章,分享了JDK中值得学习和借鉴的编码和设计方法. 每个硬币都是有两面的.Every coin has two sides. 当然,JDK中也有很多值得改进或者说富有争议的设计. 本篇,就来 ...

  4. OpenJDK源码研究笔记(十六):在Java中使用JavaScript脚本语言

    友情提示 本文主要参考了51CTO上的一篇文章,代码经过自己的模仿和整理,还算凑合. 本文中的代码注释比较多,不再过多解释. 更多用法,还是得看JDK的API或者看原文http://developer ...

  5. [置顶] OpenJDK源码研究笔记(九)-可恨却又可亲的的异常(NullPointerException)

    可恨的异常 程序开发过程中,最讨厌异常了. 异常代表着程序出了问题,一旦出现,控制台会出现一屏又一屏的堆栈错误信息. 看着就让人心烦. 对于一个新人来讲,遇到异常经常会压力大,手忙脚乱,心生畏惧. 可 ...

  6. OpenJDK源码研究笔记(五)-缓存Integer等类型的频繁使用的数据和对象,大幅度提升性能(一道经典的Java笔试题)

    摘要 本文先给出一个看似很简单实则有深意的Java笔试面试题,引出JDK内部的缓存. JDK内部的缓存,主要是为了提高Java程序的性能. 你能答对这道"看似简单,实则有深意"的J ...

  7. OpenJDK源码研究笔记(四)-编写和组织可复用的工具类和方法

    本篇主要讲解java.util.Arrays这个针对数组的工具类. 1.可复用的工具类和方法.  这个工具类里,包含很多针对数组的工具方法,如 排序.交换.二分查找.比较.填充.复制.hashcode ...

  8. OpenJDK源码研究笔记(二)-Comparable和Comparator2个接口的作用和区别(一道经典的Java笔试面试题)

    Comparable和Comparator是JDK中定义的2个比较接口,很相似,但又有所不同. 这2个接口的作用和区别也是Java中的常见经典面试题. 下面我们就来详细介绍下这2个接口的定义.作用.区 ...

  9. OpenJDK源码研究笔记(一)-参数检查&抛出带关键错误提示信息的异常

    OpenJDK源码研究笔记系列文章,是我在阅读OpenJDK7源码的过程中的一些体会.收获.看法. 把研究过程中的成长和收获一点点地整理出来,是对自己研究学习的一个小结,也有可能给学习Java的一些同 ...

随机推荐

  1. SolrCloud怎样创建跟新索引信息

    发送leader,由leader定位地址.然后写到shard上,同一时候copy到replicaton . 如图

  2. Android 获取麦克风的音量(分贝)

    基础知识 度量声音强度.大家最熟悉的单位就是分贝(decibel,缩写为dB).这是一个无纲量的相对单位.计算公式例如以下: 分子是測量值的声压,分母是參考值的声压(20微帕.人类所能听到的最小声压) ...

  3. thinkphp5项目--个人博客(二)

    thinkphp5项目--个人博客(二) 项目地址 fry404006308/personalBlog: personalBloghttps://github.com/fry404006308/per ...

  4. zzulioj--1746--三角形面积(几何水题)

    1746: 三角形面积 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 100  Solved: 31 SubmitStatusWeb Board De ...

  5. 3.c语言结构体成员内存对齐详解

    一.关键一点 最关键的一点:结构体在内存中是一个矩形,而不是一个不规则形状 二.编程实战 #include <stdlib.h> #include <stdio.h> stru ...

  6. 我的Spring MVC第一个应用

    Product package com.mstf.bean; import java.io.Serializable; /** * Product类,封装了一些信息,包含三个属性 * @author ...

  7. PostgreSQL Replication之第九章 与pgpool一起工作(2)

    9.2 理解pgpool的功能 pgpool提供了如下功能: •连接池 •语句级别的复制 •负载均衡 •限制连接 •内存缓存 •并行查询 [当决定使用那些功能的时候,记住并非所有的功能可以在同一时间使 ...

  8. 51Nod 蜥蜴和地下室(搜索)

    哈利喜欢玩角色扮演的电脑游戏<蜥蜴和地下室>.此时,他正在扮演一个魔术师.在最后一关,他必须和一排的弓箭手战斗.他唯一能消灭他们的办法是一个火球咒语.如果哈利用他的火球咒语攻击第i个弓箭手 ...

  9. GoldenGate 1403错误解决方法

    OGG  oracle goldengate 1403错误解决方法 1. 错误描述WARNING OGG-01154 Oracle GoldenGate Delivery for Oracle, re ...

  10. caffe(14) python可视化

    首先将caffe的根目录作为当前目录,然后加载caffe程序自带的小猫图片,并显示. 图片大小为360x480,三通道 In [1]: import numpy as np import matplo ...