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()
的第二个参数。我的比较器 PrioritizedPendingListComparator
是 static
所以我不希望必须使用 new
.
- 为什么我不能只使用
SomeClass.PrioritizedPendingListComparator
例如为什么我需要 new
?
- 我如何通过阅读 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);
我正在使用 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()
的第二个参数。我的比较器 PrioritizedPendingListComparator
是 static
所以我不希望必须使用 new
.
- 为什么我不能只使用
SomeClass.PrioritizedPendingListComparator
例如为什么我需要new
? - 我如何通过阅读 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);