Java 比较器语法有效,但为什么呢?

Java Comparator syntax works, but why?

我正在使用 Java Comparator 对包含 SomeClass 项的 ArrayList 进行排序。它工作得很好,没有问题。我很好奇的是语法。鉴于:

 public static class PrioritizedPendingListComparator implements Comparator<SomeClass> {

        @Override
        public int compare(SomeClass o1, SomeClass o2) {
        ...
        }

然后,一段时间后,

private ArrayList<SomeClass> pendingList = new ArrayList<>(); 

... // fill it up with entries

Collections.sort(pendingList, new SomeClass.PrioritizedPendingListComparator());

我使用 new SomeClass.PrioritizedPendingListComparator() 作为 Collections.sort() 的第二个参数。我的比较器 PrioritizedPendingListComparatorstatic 所以我不希望必须使用 new.

  1. 为什么我不能只使用 SomeClass.PrioritizedPendingListComparator 例如为什么我需要 new
  2. 我如何通过阅读 documentation 知道这一点?

SomeClass.PrioritizedPendingListComparator 是一个 class。您需要它的一个实例,所以您必须使用 new

当您定义 public static class 时,static 意味着它不会隐含地引用外部 class,但您仍然必须以正常方式创建它。

避免 new 的一种方法是使用 enum.

public enum PrioritizedPendingListComparator implements Comparator<SomeClass> {
    INSTANCE;

    @Override
    public int compare(SomeClass o1, SomeClass o2) {
    ...
    }

以后

 Collections.sort(pendingList, SomeClass.PrioritizedPendingListComparator.INSTANCE);