读书人

OpenJDK源码研究札记(十):枚举的高级用

发布时间: 2013-11-02 19:41:10 作者: rapoo

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

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

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

沙场点兵(用法源码)

com.sun.tools.javac.file.JavacFileManager.SortFilesprotected 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)

2楼FansUnion4小时前
“呵呵  看你的文章不错 n枚举的高级用法,枚举实现接口n让我大吃一惊啊!”n刚刚一个网友看了这篇文章,加了我QQ好友。no(∩_∩)o n看来OpenJDK源码研究系列,需要坚持下去,先写个100篇。
1楼FansUnion4小时前
在取标题的过程中,我就突然想到了“别有洞天”这个成语。n应该能够很好地形容我的感受。n在写代码示例的过程中,“小试牛刀”又猛然映入的脑海。n出现了“2个成语”之后,我在想,为什么不能用成语来作为n子标题呢?n因此,我就想这次里改变一次写作风格,用成语来作为子标题。n考虑到,一些读者可能理解的不准确,因此把我“正常的子标题”放在了后面的括号中。n在思考和写作中,不断酝酿新的写作风格。n(*^__^*) n小雷,干得漂亮。n2013年11月2日n北京 昌平

读书人网 >编程

热点推荐