This question already has answers here:
How are Anonymous inner classes used in Java?
                                
                                    (18个回答)
                                
                        
                4年前关闭。
            
        

最近,我试图使人们更熟悉Java中的Comparator接口。我有一个练习,即将字符串的ArrayList从最短到最长排序。我使用了字符串比较器。在网上搜索时,我发现以下解决方案:

    public static Comparator<String> lengthComparator = new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        if (a.length() == b.length()) {
            return a.compareTo(b);
        } else {
            return (a.length() > b.length() ? 1 : -1);
        }
    }

};


然后在代码中使用它对集合进行排序:

Collections.sort(set, lengthComparator);


而且有效。我想问的是在这里定义lengthComparator对象的特定方式。我们创建一个新对象:

new Comparator<String>()


使用默认构造函数。但是,在“ {}”括号中还有一个覆盖了方法的代码。这是创建对象的正常方法吗?我从未见过它,我想了解更多有关它的信息。您能否建议我一些参考资料,以便在其中找到更多信息?

最佳答案

是的,这是创建对象的常用方法,称为anonymous class

Comparator是一个接口,您希望实例化一个类,因此您可以通过实现anonymous classComparator创建一个对象。



匿名类的例子

public void sortSetByStringLength(Set set) {
    Comparator<String> lengthComparator = new Comparator<String>() {
        @Override
        public int compare(String a, String b) {
            if (a.length() == b.length()) {
                return a.compareTo(b);
            } else {
                return (a.length() > b.length() ? 1 : -1);
            }
        }
    }

    Collections.sort(set, lengthComparator);
}




普通班例子

public class LengthComparator implements Comparator<String> {
    @Override
    public int compare(String a, String b) {
        if (a.length() == b.length()) {
            return a.compareTo(b);
        } else {
            return (a.length() > b.length() ? 1 : -1);
        }
    }
}


然后在您的程序中按以下方式对列表进行排序:

public void sortSetByStringLength(Set set) {
    Collections.sort(set, new LengthComparator());
}

10-07 12:06