3

Я работаю над реализацией иерархии, которая имеет дело с Comparator и интерфейсом Comparable. Пара вещей, которые для меня неясным:Компаратор/сравнимый/ComparatorChain вопросы

  1. Если я добавляю компараторов в компараторе цепи, что именно делает этот кусок кода означает

    chain.addComparator(new sortByTitle());

    Я знаю, что sortByTitle() аргумент должен быть компаратором, но я не понимаю, как вы реализуете такую ​​функцию? Компаратор требует, чтобы вы реализовали функцию compare(obj1, obj2), которая принимает два аргумента для сравнения друг с другом, как вы получаете от этого к одному вызову (то, что выглядит как конструктор) без аргументов?

  2. Скажите, что я реализовал класс под названием Database, который хранит некоторые элементы в ArrayList под названием item. Переменная item сама является частной переменной. В настоящее время в основной программе, вызов, как это сделано:

    Collections.sort(library.item, chain);

    Как можно непосредственно получить доступ к объекту библиотеку «s экземпляр item? Спецификация для базы данных гласит, что item должен быть закрытым, может ли это работать?

Я был бы признателен за любую помощь.

ответ

4
  • Как вы, наверное, знаете, Comparator сам по себе является интерфейсом. Когда вы скажите chain.addComparator(new sortByTitle());, вы передаете экземпляр реализации компаратора, который сортирует ваш объект по названию. Класс sortByTitle в этом случае реализует Comparator и обеспечит реализацию метода compare(obj1, obj2). которую ваша цепочка может вызывать на этом экземпляре . Как правило, вместо передачи нового экземпляра каждый раз все реализации Comparator для объекта объявляются публичными статическими конечными членами объекта .

Например:

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

Вы могли бы просто передать их в вас цепь таким образом:

chain.addComparator(YourObject.TITLE_COMPARATOR); 

Это имеет дополнительное benifit позволять компаратор (который является лицом без гражданства) для использования в других местах без создания нового экземпляра каждый раз.

  • Вы должны были бы написать добытчик и сеттер (аксессор и мутаторы, если вы предпочитаете) в классе библиотеки, что позволит переменную элемент для чтения/обновляются другими классами, даже если он объявлен как частные.

Что-то вроде:

public List getItem() { 
    return item; 
} 

и

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

в классе библиотеки.

+0

Спасибо за помощь. – Mike