Comparator/Comparable/ComparatorChain questions

apache-commons-collection, comparable, interface, java, subclass

Solution

- As you probably know, `Comparator` itself is an interface. When you say `chain.addComparator(new sortByTitle());`, you are passing in an instance of an implementation of a Comparator that sorts your object by title. The `sortByTitle` class will in this case implement `Comparator` and will provide an implementation of the `compare(obj1, obj2)` method. which your chain can invoke on that instance you pass in. Typically, instead of passing a new instance in every time, all `Comparator` implementations for an Object are declared as public static final members of the Object itself.

For example:

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

You could then simply pass them into you chain in this way:

chain.addComparator(YourObject.TITLE_COMPARATOR);

This has the added benifit of allowing the comparator (which is stateless) to be used elsewhere without creating a new instance every time.

- You would need to write getters and setters (accessors and mutators if you prefer) in the Library class, which will allow the item variable to be read / updated by other classes, even though it is declared as private.

Something like:

public List getItem() {
    return item;
}

and

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

in the Library class.

Problem

I'm working on implementing a hierarchy which deals with `Comparator` and the `Comparable` interface. Couple of things that are unclear to me: If I'm adding comparators to a comparator chain, what exactly does this piece of code mean `chain.addComparator(new sortByTitle());` I know that the `sortByTitle()` argument has to be a comparator but I don't understand how you implement a function like this? The comparator requires you to implement the `compare(obj1, obj2)` function which takes two arguments to compare one against the other, how do you get from that to a single (what looks like a constructor) call with no arguments? Say that I implemented a class called `Database` which stores some items in an `ArrayList` called `item`. The variable `item` is itself a private variable. Now in the main program, a call like this is made: `Collections.sort(library.item, chain);` How is it possible to directly access an object library's instance of `item`? The specification for database states that `item` needs to be private, can this work? I would appreciate any help.

Original source