文档章节

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

FansUnion
 FansUnion
发布于 2015/10/22 10:29
字数 674
阅读 14
收藏 0
点赞 0
评论 0

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

© 著作权归作者所有

共有 人打赏支持
FansUnion
粉丝 57
博文 858
码字总数 825464
作品 0
丰台
高级程序员

暂无文章

流利阅读笔记29-20180718待学习

高等教育未来成谜,前景到底在哪里? Ray 2018-07-18 1.今日导读 在这个信息爆炸的年代,获取知识是一件越来越容易的事情。人们曾经认为,如此的时代进步会给高等教育带来众多便利。但事实的...

aibinxiao
2分钟前
0
0
第15章FTP服务搭建与配置

15.1FTP介绍 FTP多用于Windows传文件到linux rz sz在文件超过4G,就无法使用了——>安装包yum install -y install lrzsz rz把 window 上的文件传输到 linux 上 sz 把 linux 上的文件传输到 ...

Linux学习笔记
10分钟前
0
0
OSChina 周三乱弹 —— 你被我从 osc 老婆们名单中踢出了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小鱼丁:分享五月天的单曲《后来的我们 (电影《后来的我们》片名曲)》: 《后来的我们 (电影《后来的我们》片名曲)》- 五月天 手机党少年们想...

小小编辑
14分钟前
6
1
Spring Boot Admin 2.0开箱体验

概述 在我之前的 《Spring Boot应用监控实战》 一文中,讲述了如何利用 Spring Boot Admin 1.5.X 版本来可视化地监控 Spring Boot 应用。说时迟,那时快,现在 Spring Boot Admin 都更新到 ...

CodeSheep
33分钟前
0
0
Python + Selenium + Chrome 使用代理 auth 的用户名密码授权

米扑代理,全球领导的代理品牌,专注代理行业近十年,提供开放、私密、独享代理,并可免费试用 米扑代理官网:https://proxy.mimvp.com 本文示例,是结合米扑代理的私密、独享、开放代理,专...

sunboy2050
今天
0
0
实现异步有哪些方法

有哪些方法可以实现异步呢? 方式一:java 线程池 示例: @Test public final void test_ThreadPool() throws InterruptedException { ScheduledThreadPoolExecutor scheduledThre......

黄威
今天
1
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

六库科技
今天
0
0
牛客网刷题

1. 二维数组中的查找(难度:易) 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入...

大不了敲一辈子代码
今天
0
0
linux系统的任务计划、服务管理

linux任务计划cron 在linux下,有时候要在我们不在的时候执行一项命令,或启动一个脚本,可以使用任务计划cron功能。 任务计划要用crontab命令完成 选项: -u 指定某个用户,不加-u表示当前用...

黄昏残影
昨天
0
0
设计模式:单例模式

单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。 实现以上模式基于以下必须遵守的两点: 1.构造方法私有化 2.提供一个...

人觉非常君
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部