enum lambda iboralari yordamida bekor qilish usullari

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); };


person Tranquility    schedule 21.01.2016    source manba
comment
stackoverflow.com/q/23361418/2711488 E'tibor bering, bu savoldagi misol get() raqamiga qo'ng'iroq qilishdan qanday qochish kerakligini ko'rsatadi. delegatsiya varianti.   -  person Holger    schedule 21.01.2016
comment
Sizga haqiqatan ham enum kerakmi? Nega bu 3 ta solishtirgichni enum misollari o'rniga sinfning doimiysi qilib qo'ymaslik kerak?   -  person JB Nizet    schedule 21.01.2016


Javoblar (1)


Nima bo'ldi:

public enum SongComparator implements Comparator<Song> {

    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 int compare(Song s1, Song s2) {
        return comp.compare(s1, s2);
    };

}
person Brian Goetz    schedule 21.01.2016
comment
Ha, bu hiyla qiladi! Faqat ikki marta tekshirish uchun - agar ushbu dastur sort (...) usuliga o'tkazilishi kerak bo'lsa, masalan. SongComparator.BY_TITLE dasturidan o‘tdim. Kalit chiqarish funksiyasi (Comparator.comparing) raqamlash maydonini ishga tushirish uchun faqat bir marta chaqiriladi, deb o'ylayman, lekin saralash bekor qilingan taqqoslash usuliga qayta qo'ng'iroq qilishda emas? Buning o'rniga, menimcha, bu sodir bo'layotgan barcha narsa enumning bekor qilingan taqqoslash usulidan tuzilgan Comparator tomonidan o'tkaziladigan delegatsiyaning bir qadamidir? - person Tranquility; 22.01.2016
comment
Enums - bu sinflarni e'lon qilishning ajoyib usullari. Barcha misol konstruktorlari ishga tushirilgandan so'ng, siz oddiy ob'ekt bo'lgan enum misoli bilan qolasiz. - person Brian Goetz; 22.01.2016