文档章节

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

FansUnion
 FansUnion
发布于 2015/05/03 01:25
字数 651
阅读 11
收藏 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
粉丝 60
博文 858
码字总数 825464
作品 0
丰台
高级程序员
私信 提问
openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss
2018/06/18
403
0
Skara 开源,JDK 源码管理与审查选项研究工具

OpenJDK 官方宣布开源 Project Skara 工具。Project Skara 是官方 OpenJDK 上游 Mercurial 存储库基于 GitHub 原型的镜像,其旨在研究用于 JDK 源代码的源码管理和代码审查的备选项,包括基于...

afterer
06/26
2.1K
0
CentOS为OpenJDK设置系统变量

转载著名出处:http://www.crazyphper.com/?p=2328 今天在安装phpstorm时,提示无法找到JAVA_HOME,才想起还没有安装JDK呢!那就来试试linux上的openJDK吧! Centos自带OpenJDK的Runtime(JRE...

konakona
2012/09/22
10.7K
2
JDK 源码管理与审查选项研究工具 - Skara

Skara 是一个研究用于 JDK 源码管理和代码审查的备选项的工具。 Project Skara 是官方 OpenJDK 上游 Mercurial 存储库基于 GitHub 原型的镜像,其旨在研究用于 JDK 源代码的源码管理和代码审...

匿名
06/25
468
0
openjdk和oraclejdk有什么区别吗?

1.授权协议的不同:OpenJDK采用GPL V2协议放出,而SUN JDK则采用JRL放出。两者协议虽然都是开放源代码的,但是在使用上的不同在于GPL V2允许在商业上使用,而JRL只允许个人研究使用。 2.Open...

吴伟祥
2018/11/19
53
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
11
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部