3

我正在实现一个处理ComparatorComparable接口的层次结构。我不清楚的几件事:

  1. 如果我将比较器添加到比较器链中,那么这段代码到底是什么意思

    chain.addComparator(new sortByTitle());

    我知道sortByTitle()参数必须是比较器,但我不明白你是如何实现这样的函数的?比较器需要你实现一个compare(obj1, obj2)函数,它需要两个参数来比较一个和另一个,你如何从这个函数中得到一个没有参数的(看起来像构造函数)调用?

  2. 假设我实现了一个名为的类Database,它将一些项目存储在一个ArrayList被调用的item. 该变量item本身就是一个私有变量。现在在主程序中,进行了这样的调用:

    Collections.sort(library.item, chain);

    怎么可能直接访问对象的实例itemitem需要私有的数据库状态规范,这可以吗?

我将不胜感激任何帮助。

4

1 回答 1

4
  • 您可能知道,Comparator它本身就是一个接口。当您说 时chain.addComparator(new sortByTitle());,您传递的是 Comparator 的实现实例,该实例按标题对对象进行排序。在这种情况下,sortByTitle该类将实现 Comparator并将提供该 compare(obj1, obj2)方法的实现。您的链可以在您传入的那个实例上调用它。通常,不是每次都传递一个新实例,而是将 Object 的所有Comparator实现声明为 Object 本身的 public static final 成员。

例如:

public static final Comparator TITLE_COMPARATOR = new Comparator() {
    @Override
    public int compare(Object lhs, Object rhs) {
        // comparison logic
    }
};

然后,您可以通过这种方式将它们简单地传递到您的链中:

chain.addComparator(YourObject.TITLE_COMPARATOR);

这有一个额外的好处,即允许在其他地方使用比较器(它是无状态的),而无需每次都创建一个新实例。

  • 您需要在 Library 类中编写 getter 和 setter(如果您愿意,可以使用访问器和修改器),这将允许其他类读取/更新 item 变量,即使它被声明为私有。

就像是:

public List getItem() {
    return item;
}

public void setItem(List item) {
    this.item = item;
}

在图书馆类。

于 2012-06-23T22:44:23.977 回答