Taqqoslovchilar kutubxonasini tashkil etuvchi enumga ega bo'lish fikriga ikkita yechimim bor:
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;
}
}
va...
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());
};
};
}
Agar solishtiruvchi kutilayotgan enum qiymatini almashtirmoqchi bo'lsam, birinchi yechimda SongComparator.BY_TITLE.get(); Holbuki, ikkinchi yechimda men shunchaki SongComparator2.BY_TITLE deb ayta olaman.
Ikkinchisi shu ma'noda yaxshiroq, lekin men har bir enum qiymati uchun public int compare... etc yozishni yoqtirmayman va buning o'rniga birinchi yondashuvdagi kabi Comparator.comparing dan foydalanishni xohlardim. Bunga erishishning yo'li bormi?
Men deyarli bir narsa aytmoqchi bo'ldim: BY_TITLE { return Comparator.comparing(Song::getTitle); };
get()
raqamiga qo'ng'iroq qilishdan qanday qochish kerakligini ko'rsatadi. delegatsiya varianti. - person Holger   schedule 21.01.2016