Более простой способ переопределить метод compareTo для данного экземпляра.

Некоторая внешняя функция дает мне экземпляр java.io.File, но я хотел бы изменить поведение по умолчанию для compareTo для этого экземпляра на лету. Какой лучший подход?

Единственное, о чем я могу думать, это обернуть этот экземпляр File в

public class FileWrapper extends File{   

    FileWrapper(File in){
        //Assign var to the global var      
    }

    @Overrides
    public compareTo(File in){ return whatever;}

}

И сделать так, чтобы все методы переопределяли методы File и перенаправляли вызовы глобальному обернутому экземпляру, пропущенному через конструктор, но это очень уродливо...

Может быть, я забыл какой-то другой более простой способ...


person Whimusical    schedule 31.05.2012    source источник
comment
Что такое анонимная функция в Java?   -  person adarshr    schedule 31.05.2012
comment
Извините, я имел в виду функцию внутри анонимного класса   -  person Whimusical    schedule 31.05.2012
comment
Я не уверен, что это сработает, как бы вы ни пытались это сделать. compareTo должен быть коммутативным: File.compareTo(FileWrapper) должен быть симметричным с FileWrapper.compareTo(File), но вы не можете контролировать File.compareTo(FileWrapper).   -  person Louis Wasserman    schedule 31.05.2012


Ответы (1)


Единственная причина, по которой вы можете захотеть использовать метод compareTo, — это сортировка коллекции.

Вы всегда можете создать Comparator и передать его в вызов Collections.sort.

Collections.sort(myList, new Comparator<File>() {
    public int compare(File file1, File file2) {
        // write your custom compare logic here.
    }
});

Даже если вы используете отсортированную коллекцию, такую ​​как TreeSet, она уже предоставляет вам перегруженный конструктор для передачи в Comparator.

/**
 * Constructs a new, empty tree set, sorted according to the specified
 * comparator.  All elements inserted into the set must be <i>mutually
 * comparable</i> by the specified comparator: {@code comparator.compare(e1,
 * e2)} must not throw a {@code ClassCastException} for any elements
 * {@code e1} and {@code e2} in the set.  If the user attempts to add
 * an element to the set that violates this constraint, the
 * {@code add} call will throw a {@code ClassCastException}.
 *
 * @param comparator the comparator that will be used to order this set.
 *        If {@code null}, the {@linkplain Comparable natural
 *        ordering} of the elements will be used.
 */
public TreeSet(Comparator<? super E> comparator) {
    this(new TreeMap<E,Object>(comparator));
}
person adarshr    schedule 31.05.2012
comment
Вы точно угадали! Спасибо!! - person Whimusical; 31.05.2012
comment
Есть ли что-то подобное с равными? Эквалайзер или что? Представьте тот же случай, но вы хотите переопределить equals, потому что он должен быть согласован с compareTo. - person Whimusical; 31.05.2012
comment
Нашел, тот же Компаратор включает метод equals, который компаратор не включал :) - person Whimusical; 31.05.2012