用于排序不同类型的通用逻辑

时间:2016-03-08 05:58:16

标签: java sorting generics collections

我有一些DTO对象的类层次结构。可以说基本抽象类是AbstractObject,这是空类。 Product类扩展了AbstractObject并具有一些属性,setter,getter。 我有一些逻辑负责对Product对象进行排序:

public enum ProductComparator implements Comparator<Product>  {
    ROK_SORT_ASC {
        @Override
        public int compare(Product u1, Product u2) {
            return ObjectUtils.compare(u1.getRok(), u2.getRok());
        }
    },
    ROK_SORT_DESC {
        @Override
        public int compare(Product u1, Product u2) {
            return -ObjectUtils.compare(u1.getRok(), u2.getRok());
        }
    },
    NAME_DESC {
        @Override
        public int compare(Product u1, Product u2) {
            return -(ObjectUtils.compare(u1.getFlDyn(), (u2.getFlDyn())));
        }
    };

    public static Comparator<Product> doCompare(final Comparator<Product> other) {
        return new Comparator<Product>() {
            @Override
            public int compare(Product u1, Product u2) {
                return other.compare(u1, u2);
            }
        };
    }

    public static Comparator<Product> getComparator(final List<ProductComparator> sortOptions) {
        if(sortOptions == null ){
            throw new IllegalArgumentException("Null list passed to comparator");
        }

        return new Comparator<Product>() {
            @Override
            public int compare(Product u1, Product u2) {
            for (ProductComparator option : sortOptions) {
                int result = option.compare(u1, u2);
                if (result != 0) {
                    return result;
                }
            }
            return 0;
        }
    };
}
}

这是与比较器的简单复合。

现在,我想使一些方法通用,因此它将能够创建如下列表:

    List<AbstractObject> objectsList = new ArrayList<AbstractObject>();
    objectsList.add(new Product("...", "...."));
    objectsList.add(new Product("...", "...."));

并调用sort方法:

    List<ProductComparator> comparators = new ArrayList<ProductComparator>();
    comparators.add(ProductComparator.ROK_SORT_ASC);

    Collections.sort(objectsList, ProductComparator.doCompare(ProductComparator.getComparator(comparators)));

现在,由于缺乏通用方法,这是不可能的,遗憾的是我在这种情况下无法做到这一点。会有很多对象扩展AbstractObjects,我想自动化一些进程。 我正在运行Java 1.6。禁止铸造物体。

0 个答案:

没有答案