Как правильно настраивать типизацию класса Comparator?

Как можно улучшить класс `WorkerComparator` для избавления от необходимости явного приведения типа к `Worker` и предотвращения появления предупреждений компилятора при работе с методом `thenComparing` в Java?
  • 24 июля 2024 г. 12:03
Ответы на вопрос 2
Для настройки типизации класса Comparator следует использовать дженерики. Чтобы улучшить класс `WorkerComparator`, можно использовать дженерики для указания типа данных сравниваемых объектов, чтобы избежать необходимости явного приведения типа. 

Пример улучшенного класса `WorkerComparator` с использованием дженериков:

```java
import java.util.Comparator;

public class WorkerComparator implements Comparator<Worker> {

    @Override
    public int compare(Worker w1, Worker w2) {
        // реализация метода сравнения
    }
}
```

Теперь для `WorkerComparator` указан тип данных `Worker` с использованием дженерика `<Worker>`, что позволяет избежать приведения типа при сравнении объектов типа `Worker`.

Для избавления от предупреждений компилятора при использовании метода `thenComparing` в Java, необходимо также настроить типизацию для метода, указав тип данных ``WorkerComparator` в качестве аргумента:

```java
Comparator<Worker> comparator = Comparator.comparing(Worker::getName)
                                          .thenComparing(new WorkerComparator());
```

Таким образом, используя дженерики и корректно настроенные типы данных для класса `WorkerComparator`, можно улучшить его производительность и избежать предупреждений компилятора при работе с методом `thenComparing` в Java.
Все дело было в "safeCompare". Он вносил сумятицу. Без него все выходит норм 

return Objects.compare(o1, o2,
                Comparator.<Worker, String>comparing(key -> key.fio().surname())
                        .thenComparing(key -> key.fio().name())
                        .thenComparing(Worker::salary)
                        .thenComparing(Worker::hiredOn));


Но так как у меня null значения, приходится делать так. Лучшего ничего не придумал.

class WorkerComparator implements Comparator<Worker> {
    final static Comparator<String> safeString = Comparator.nullsFirst(Comparator.naturalOrder());
    final static Comparator<Integer> safeInteger = Comparator.nullsFirst(Comparator.naturalOrder());
    final static Comparator<LocalDateTime> safeLocalDateTime = Comparator.nullsFirst(Comparator.naturalOrder());

    @Override
    public int compare(Worker o1, Worker o2) {

        return Objects.compare(o1, o2,
                Comparator.<Worker, String>comparing(key -> key.fio().surname(), safeString)
                        .thenComparing(key -> key.fio().name(), safeString)
                        .thenComparing(Worker::salary, safeInteger)
                        .thenComparing(Worker::hiredOn, safeLocalDateTime));
    }
}


Сделал под разные типы свой Comparator
Похожие вопросы