【发布时间】:2016-01-21 15:53:14
【问题描述】:
我有两个解决方案来让枚举形成一个比较器库:
public enum SongComparator {
BY_TITLE(Comparator.comparing(Song::getTitle)),
BY_ARTIST(Comparator.comparing(Song::getArtist)),
BY_DURATION(Comparator.comparing(Song::getDuration));
private Comparator<Song> comp;
private SongComparator(Comparator<Song> comp) {
this.comp = comp;
}
public Comparator<Song> get() {
return comp;
}
}
还有……
public enum SongComparator2 implements Comparator<Song> {
BY_TITLE {
public int compare(Song s1, Song s2) {
return s1.getTitle().compareTo(s2.getTitle());
};
},
BY_ARTIST {
public int compare(Song s1, Song s2) {
return s1.getArtist().compareTo(s2.getArtist());
};
},
BY_DURATION {
public int compare(Song s1, Song s2) {
return Integer.compare(s1.getDuration(), s2.getDuration());
};
};
}
如果我想在需要 Comparator 的地方替换一个枚举值,在第一个解决方案中我必须说 SongComparator.BY_TITLE.get();而在第二个解决方案中,我只能说 SongComparator2.BY_TITLE。
从这个意义上说,第二种方法更好,但是,我不喜欢为每个枚举值编写 public int compare... 等,而是希望像第一种方法一样使用 Comparator.comparing。有没有办法做到这一点?
我几乎想说:BY_TITLE { return Comparator.comparing(Song::getTitle); };
【问题讨论】:
-
stackoverflow.com/q/23361418/2711488 请注意,该问题中的示例向您展示了如何避免在委托变体中调用
get()。 -
你真的需要枚举吗?为什么不将这 3 个比较器设为类的常量,而不是枚举实例?
标签: lambda interface enums java-8 comparator