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


    在研究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() + "	");
            }
    
        }
    
        // 构造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)

  • 相关阅读:
    在子线程中更新ProgressBar为null
    有关ContentProvider及相关一系列的简单用法(持续添加)
    Android内容提供者使用及创建
    Android中关于时间的操作
    Cell的一些坑: UITableViewCell宽度,在iphone5的时候是320,在iphone6的时候为啥也是320?
    处理数据源(根据条目字数多少 ,动态显示一行里有多少个条目,类似天猫搜索历史)
    iOS开发之如何跳到系统设置里的各种设置界面
    Block作为property属性实现页面之间传值(代替Delegate代理与协议结合的方法)
    xcode7的那些坑-“Your binary is not optimized for iPhone 5” (ITMS-90096) when submitting
    PresentViewController切换界面(一些系统自带的页面切换动画)
  • 原文地址:https://www.cnblogs.com/qitian1/p/6463484.html
Copyright © 2020-2023  润新知