我有两种解决方案,一种是使用一个构成比较器库的枚举:
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。获取();而在第二个解决方案中,我只能说SongComparator2.BY_TITLE。
从这个意义上讲,第二种方法更好,但是,我不喜欢为每个枚举值编写公共int compare…etc,而是希望使用Comparator。与第一种方法一样进行比较。有办法做到这一点吗?
我几乎想说这样的话:BY_TITLE{return Comparator.comparing(Song::getTitle);};