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

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

时间:2023-04-05 15:05:32浏览次数:42  
标签:Website return OpenJDK 枚举 源码 getName public


在研究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 [email protected]
 *
 */
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平台的开源实现。

标签:Website,return,OpenJDK,枚举,源码,getName,public
From: https://blog.51cto.com/fansunion/6171055

相关文章

  • 直播网站程序源码,element el-menu,前端做菜单搜索
    直播网站程序源码,elementel-menu,前端做菜单搜索方案一:递归+indexof实现步骤:JS实现树形结构数据的模糊搜索查询, 即使父节点没有,但子节点含有,父节点仍要返回。 /** *递归tree关键词搜索 * *@param{key}需要递归的key名 *@param{value}需要搜索查询的关键字 *......
  • 直播网站源码,修改el-input边框颜色
    直播网站源码,修改el-input边框颜色.el-input{ --el-input-hover-border-color:#f56c6c; --el-input-focus-border-color:#f56c6c;}​以上就是直播网站源码,修改el-input边框颜色,更多内容欢迎关注之后的文章 ......
  • kubegres 源码解析(二) kubebuilder简介
    摘要Kubegres完全使用KubebuilderV3版本开发,在对Kubegres进行代码解析前,首先了解一下Kubebuilder,本文尝试理清几个问题:如何使用Kubebuilder生成Controller/Operator项目?项目结构是什么,每个文件的作用是什么?具体到最重要的几个文件,代码如何组织,功......
  • Zookeeper Session源码
    我们说客户端与服务端建立连接交互的时候会创建一个Session与之对应,那假设客户端请求来了,服务端是如何处理的?Session又是如何创建出来的?我们先来看第一个问题:服务端如何处理客户端发来的请求?一、如何处理请求所谓的请求全称是网络请求,涉及到网络就少不了Socket通信,ZooKeep......
  • 蓝桥杯三天备考----枚举:卡片
    题目描述本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。小蓝有很多数字卡片,每张卡片上都是数字 0到 9。小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。小蓝想知道自己能从 1 拼到多少。例......
  • 多任务版TCP服务端程序开发案例+源码
    Python进阶篇-系列文章全篇......
  • Android 构建工具--AAPT2源码解析(一)
    一、什么是AAPT2在Android开发过程中,我们通过Gradle命令,启动一个构建任务,最终会生成构建产物“APK”文件。常规APK的构建流程如下:(引用自Google官方文档)编译所有的资源文件,生成资源表和R文件;编译Java文件并把class文件打包为dex文件;打包资源和dex文件,生成未签名的APK文件;签名APK生成......
  • flask:cbv源码分析、模板语法、请求与响应、session及源码分析、闪现(flash)、请求扩展
    目录一、cbv源码分析1.1基于类的视图写法1.2源码分析1.3分析源码,查找不传别名的时候为什么函数名会变成别名1.4flask的路由注册使用装饰器,如果写了一个登录认证装饰器,那么应该放在路由装饰器上还是下?1.5dispatch_request讲解1.6知识点总结二、模板语法2.1py2.2html三、请......
  • 创建返回错误信息提示枚举值
    @Data@BuilderpublicclassErrorResult{privateStringerrCode;privateStringerrMessage;publicstaticErrorResulterror(){returnErrorResult.builder().errCode("999999").errMessage("系统异常稍后再试").build();}......
  • Spring——springboot启动源码分析
    摘要主要介绍的有关于Spring的Spring的事务注解原理和实战(SpringFramework)一、什么是事务的传播?简单的理解就是多个事务方法相互调用时,事务如何在这些方法间传播。:举个栗子,方法A是一个事务的方法,方法A执行过程中调用了方法B,那么方法B有无事务以及方法B对事务的要求不同都会对......