巧用 Spring @Order 进行排序

直接上代码

public class OrderAnnotationTest {
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        C c = new C();
        List<Object> orderList = new ArrayList<>(3);
        orderList.add(a);
        orderList.add(b);
        orderList.add(c);
        orderList.sort(AnnotationAwareOrderComparator.INSTANCE);
        System.out.println(orderList);
    }

    @Order(0)
    static class A {
        @Override
        public String toString() {
            return "A";
        }
    }

    @Order(-1)
    static class B {
        @Override
        public String toString() {
            return "B";
        }
    }

    @Order(2)
    static class C {
        @Override
        public String toString() {
            return "C";
        }
    }
}

结果如下:

[B, A, C]

原理解析:

AnnotationAwareOrderComparator继承自OrderComparator,实际比较的方法如下

private int doCompare(@Nullable Object o1, @Nullable Object o2, @Nullable OrderSourceProvider sourceProvider) {
    boolean p1 = (o1 instanceof PriorityOrdered);
    boolean p2 = (o2 instanceof PriorityOrdered);
    if (p1 && !p2) {
        return -1;
    }
    else if (p2 && !p1) {
        return 1;
    }

    int i1 = getOrder(o1, sourceProvider);
    int i2 = getOrder(o2, sourceProvider);
    return Integer.compare(i1, i2);
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、简历准备 1、个人技能 (1)自定义控件、UI设计、常用动画特效 自定义控件 ①为什么要自定义控件? Andr...
    lucas777阅读 5,275评论 2 54
  • 路由传参常用方式有以下几种 通过url传参// 产品列表页面 详情 // 或者wx.navigateTo({ ...
    北冥有鱼_425c阅读 2,179评论 0 5
  • 又是第一波,也还是没几个宿舍,结果因为我提的问题,害的粥洒在袋子里满处都是,我把袋子简单用纸擦了,然后汇报了一下状...
    颜末小趣阅读 513评论 0 1
  • 7月上旬,火遍全国的PPT达人“秋叶大叔”来易企秀,跟易企秀创始人黄金聊了两个小时,达成了多个合作意向,我有幸在侧...
    小易学院阅读 1,045评论 0 0