代码之家  ›  专栏  ›  技术社区  ›  Tranquility

使用lambda表达式的枚举重写方法

  •  1
  • Tranquility  · 技术社区  · 9 年前

    我有两种解决方案,一种是使用一个构成比较器库的枚举:

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

    1 回复  |  直到 9 年前
        1
  •  5
  •   Brian Goetz    9 年前

    有什么问题:

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