Доброго воскресного утра! ☀️
А вы знали что сегодня самый короткий день в году?
Только включил IDE - уже спать пора 😂
Елку уже поставили?🎄
Поделитесь идеями для следующих видео? Чет я не знаю, что записать...
Всем хороших выходных 🎉
А вы знали что сегодня самый короткий день в году?
Только включил IDE - уже спать пора 😂
Елку уже поставили?
Поделитесь идеями для следующих видео? Чет я не знаю, что записать...
Всем хороших выходных 🎉
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
История IT-технологий сегодня — 21 декабря
ℹ️ Кто родился в этот день
Адель Голдстайн (урожденная Кац; 21 декабря 1920 — ноябрь 1964) — американский математик и программист. Она написала руководство для первого электронного цифрового компьютера ENIAC . Благодаря своей работе в области программирования она сыграла важную роль в преобразовании ENIAC из компьютера, требующего перепрограммирования при каждом использовании, в компьютер, способный выполнять набор из пятидесяти сохраненных инструкций.
🌐 Знаковые события
1898 — Пьер и Мари Кюри открыли радий.
2012 — впервые в истории YouTube и Интернета количество просмотров одного видеоклипа превысило 1 миллиард раз. Этим видео стал клип южно-корейского исполнителя PSY «Gangnam Style».
#Biography #Birth_Date #Events #21Декабря
Адель Голдстайн (урожденная Кац; 21 декабря 1920 — ноябрь 1964) — американский математик и программист. Она написала руководство для первого электронного цифрового компьютера ENIAC . Благодаря своей работе в области программирования она сыграла важную роль в преобразовании ENIAC из компьютера, требующего перепрограммирования при каждом использовании, в компьютер, способный выполнять набор из пятидесяти сохраненных инструкций.
1898 — Пьер и Мари Кюри открыли радий.
2012 — впервые в истории YouTube и Интернета количество просмотров одного видеоклипа превысило 1 миллиард раз. Этим видео стал клип южно-корейского исполнителя PSY «Gangnam Style».
#Biography #Birth_Date #Events #21Декабря
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Кусочек правды
Очередной день на работе...
Тонны кода, таски, инциденты и никакого просвета впереди.
В IT-шке кризис, зарплату не повышают, и солнце е...ный фонарь...
Знакомо?
Давай разбираться как не потерять в таких условиях мотивацию и продолжать бороться.
Кризис в IT
Самое демотивирующий фактор сегодня для большинства начинающих разработчиков - это не снижение количества вакансий в целом или отрицательный рост зарплат.
Самое тяжёлое — это ощущение, что ты не можешь себе позволить уйти.
Из-за этого приходится терпеть бредовые таски, токсичное отношение и прочие прелести.
И это хорошо, если у Вас есть денежная подушка и возможность пересидеть эти моменты дома, в тепле и уюте.
А как поступать тем кто только собрался вкатываться? Или тем, кто весной закончит профильное образование?
Сокращения — и почему от этого страшно всем
Во многих чатах, профильных каналах в телеграмме и ютубе, наблюдаю волну сокращений в IT РФ.
Причем сокращают не только джунов, но и вполне себе устоявшихся мидлов которые отработали в сфере не один год.
И это вообще не значит, что появились новые рабочие места, на которые можно залететь.
Это урезание бюджетов, попытка пересидеть/переждать компаниями, в условиях неопределенности рынков.
Поэтому ощущение нестабильности сегодня — норма, а не исключение.
Почему в такие моменты опускаются руки
И сидишь ты такой, в отсутствии перспектив и думаешь:
- “а зачем стараться?”
- “а вдруг это вообще тупик?”
- “а может, я зря всё это начал?”
И это не слабость.
Это естественная реакция на неопределённость.
Что предлагаю делать:
1. Не надеяться, что все само рассосется и завтра станет как вчера.
Не станет. Как показывает опыт, хорошее временно, а плохое надолго (потому что выгодно).
Привыкаем к текущим условиям и гребём широкими замахами.
2. Перестать верить, что ты точно достиг того уровня, на котором тебя не уволят.
Уволят и еще попробуют лишить трех положенных выплат. Не сомневайся.
Незаменимых нет, сегодняшнее похлопывание по спине легко превратится завтра в пинок под зад.
Сегодняшний бизнес уверен: 4 волка-вкатуна с 5-ю годами опыта в резюме и требованиями в 70к зп, легко заменят одного синьора, еще и сдача останется. А если взять 2их и подключить каждому акк GPT 5.2 за 20 баксов, то отдел разработки вообще ничего не потеряет и можно будет выписать себе премию за экономию по итогам года.
3. Не переставать бороться
Только рост и только прогресс. В кризис выживают не хайповые, а те кто копнул в глубину и сумел реально сделать себя незаменимым для бизнеса.
Активность, разумность, работоспособность и сдержанность ценились всегда. А истерики из-за отсутствия халявных печенек в офисе - нет.
Но если ты уже в себе уверен, смотри п.2
4. Ставить реальные цели
Бизнес не хочет видеть разраба, который говорит - через полгода я вам запилю Spring AI-сервис и доходы взлетят.
Бизнесу нужен разраб который грамотно разберется почему сегодня лагает сайт и клиенты не могут зайти.
Наверно не стОит учить полгода в свободное время JavaFX если в твоя компания работает только с веб-сайта.
Сейчас важно не “интересно”, а полезно.
5. Что делать новичкам
Перечитать еще раз предыдущие пункты.
Научиться толкаться локтями.
Возможно рассмотреть иные варианты самореализации🤷♀️ 😂
А если честно — я не знаю, как будет завтра.
Я не знаю, станет ли рынок лучше через полгода, или когда закончится СВО.
Появятся ли снова лёгкие офферы и исчезнет ли это ощущение, что ты всё время бежишь, а лента не крутится.
Но я уверен в одном.
Паника, обиды и ожидание чуда никого ещё не спасли.
А размеренная работа над собой, даже без аплодисментов и быстрых наград, точно сделает нас лучше.
Поэтому изучаем, делимся и общаемся. А я Вам помогу)
Если статья зашла — поделись с другом и позови его на канал.
А мне — плюсик к карме😉
😎
#motivation
Очередной день на работе...
Тонны кода, таски, инциденты и никакого просвета впереди.
В IT-шке кризис, зарплату не повышают, и солнце е...ный фонарь...
Знакомо?
Давай разбираться как не потерять в таких условиях мотивацию и продолжать бороться.
Кризис в IT
Самое тяжёлое — это ощущение, что ты не можешь себе позволить уйти.
Из-за этого приходится терпеть бредовые таски, токсичное отношение и прочие прелести.
А как поступать тем кто только собрался вкатываться? Или тем, кто весной закончит профильное образование?
Сокращения — и почему от этого страшно всем
Во многих чатах, профильных каналах в телеграмме и ютубе, наблюдаю волну сокращений в IT РФ.
Причем сокращают не только джунов, но и вполне себе устоявшихся мидлов которые отработали в сфере не один год.
И это вообще не значит, что появились новые рабочие места, на которые можно залететь.
Это урезание бюджетов, попытка пересидеть/переждать компаниями, в условиях неопределенности рынков.
Поэтому ощущение нестабильности сегодня — норма, а не исключение.
Почему в такие моменты опускаются руки
И сидишь ты такой, в отсутствии перспектив и думаешь:
- “а вдруг это вообще тупик?”
- “а может, я зря всё это начал?”
Это естественная реакция на неопределённость.
Что предлагаю делать:
1. Не надеяться, что все само рассосется и завтра станет как вчера.
Не станет. Как показывает опыт, хорошее временно, а плохое надолго (потому что выгодно).
Привыкаем к текущим условиям и гребём широкими замахами.
2. Перестать верить, что ты точно достиг того уровня, на котором тебя не уволят.
Уволят и еще попробуют лишить трех положенных выплат. Не сомневайся.
Незаменимых нет, сегодняшнее похлопывание по спине легко превратится завтра в пинок под зад.
Сегодняшний бизнес уверен: 4 волка-вкатуна с 5-ю годами опыта в резюме и требованиями в 70к зп, легко заменят одного синьора, еще и сдача останется. А если взять 2их и подключить каждому акк GPT 5.2 за 20 баксов, то отдел разработки вообще ничего не потеряет и можно будет выписать себе премию за экономию по итогам года.
3. Не переставать бороться
Только рост и только прогресс. В кризис выживают не хайповые, а те кто копнул в глубину и сумел реально сделать себя незаменимым для бизнеса.
Активность, разумность, работоспособность и сдержанность ценились всегда. А истерики из-за отсутствия халявных печенек в офисе - нет.
Но если ты уже в себе уверен, смотри п.2
4. Ставить реальные цели
Бизнес не хочет видеть разраба, который говорит - через полгода я вам запилю Spring AI-сервис и доходы взлетят.
Бизнесу нужен разраб который грамотно разберется почему сегодня лагает сайт и клиенты не могут зайти.
Наверно не стОит учить полгода в свободное время JavaFX если в твоя компания работает только с веб-сайта.
Сейчас важно не “интересно”, а полезно.
5. Что делать новичкам
Перечитать еще раз предыдущие пункты.
Научиться толкаться локтями.
Возможно рассмотреть иные варианты самореализации
А если честно — я не знаю, как будет завтра.
Я не знаю, станет ли рынок лучше через полгода, или когда закончится СВО.
Появятся ли снова лёгкие офферы и исчезнет ли это ощущение, что ты всё время бежишь, а лента не крутится.
Но я уверен в одном.
Паника, обиды и ожидание чуда никого ещё не спасли.
А размеренная работа над собой, даже без аплодисментов и быстрых наград, точно сделает нас лучше.
Поэтому изучаем, делимся и общаемся. А я Вам помогу)
Если статья зашла — поделись с другом и позови его на канал.
А мне — плюсик к карме
#motivation
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍1 1
История IT-технологий сегодня — 22 декабря
ℹ️ Кто родился в этот день
Сринива́са Рамануджа́н Айенго́р (произношение там. ஸ்ரீனிவாஸ ராமானுஜன் ஐயங்கார் [sriːniʋaːsa ɾaːmaːnud͡ʑan ajːaŋgar]; англ. Srinivasa Ramanujan Aiyangar; 22 декабря 1887 — 26 апреля 1920) — индийский математик. Не имея специального математического образования, получил замечательные результаты в области теории чисел. Наиболее значительна его работа совместно с Годфри Харди по асимптотике числа разбиений p(n).
(Смотрел экранизацию его жизни - мне понравилось)
🌐 Знаковые события
1891 – Астероид 323 Брусия становится первым астероидом, обнаруженным с помощью фотографии
#Biography #Birth_Date #Events #22Декабря
Сринива́са Рамануджа́н Айенго́р (произношение там. ஸ்ரீனிவாஸ ராமானுஜன் ஐயங்கார் [sriːniʋaːsa ɾaːmaːnud͡ʑan ajːaŋgar]; англ. Srinivasa Ramanujan Aiyangar; 22 декабря 1887 — 26 апреля 1920) — индийский математик. Не имея специального математического образования, получил замечательные результаты в области теории чисел. Наиболее значительна его работа совместно с Годфри Харди по асимптотике числа разбиений p(n).
(Смотрел экранизацию его жизни - мне понравилось)
1891 – Астероид 323 Брусия становится первым астероидом, обнаруженным с помощью фотографии
#Biography #Birth_Date #Events #22Декабря
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Глава 7. Сравнение объектов
Интерфейс Comparable — концепция естественного порядка
В мире объектно-ориентированного программирования сравнение объектов представляет собой одну из наиболее фундаментальных и одновременно сложных операций. В отличие от примитивных типов данных, где сравнение значений является тривиальной операцией, объекты в Java требуют глубокого философского осмысления вопроса: "Что означает, что один объект меньше или больше другого?"
Интерфейс Comparable предлагает элегантное решение этой проблемы, вводя концепцию естественного порядка (natural ordering) — внутренне присущего объекту способа упорядочивания себя относительно других объектов того же типа. Эта концепция уходит корнями в математическую теорию порядка и теорию множеств, где бинарное отношение сравнения должно удовлетворять определенным аксиомам для формирования корректного линейного порядка.
Математические основы интерфейса Comparable
Аксиомы полного порядка
Интерфейс Comparable формализует математическое понятие тотального (линейного) порядка, который должен удовлетворять трем фундаментальным свойствам:
Рефлексивность (Reflexivity): ∀x: x.compareTo(x) == 0
Объект должен быть равен самому себе — это тривиальная, но необходимая аксиома.
Антисимметричность (Antisymmetry): ∀x, y: если x.compareTo(y) < 0, то y.compareTo(x) > 0
Если объект A меньше объекта B, то объект B должен быть больше объекта A. Это свойство обеспечивает непротиворечивость порядка.
Транзитивность (Transitivity): ∀x, y, z: если x.compareTo(y) < 0 и y.compareTo(z) < 0, то x.compareTo(z) < 0
Если A меньше B, а B меньше C, то A должно быть меньше C. Это ключевое свойство для формирования последовательного упорядочивания.
Нарушение аксиом как источник ошибок
Нарушение любой из этих аксиом приводит к непредсказуемому поведению алгоритмов сортировки и поиска. Например, если транзитивность нарушена, то сортировка может давать различные результаты при разных порядках обработки элементов или вовсе не завершаться.
Концепция естественного порядка
Естественный порядок — это способ упорядочивания объектов, который интуитивно понятен для предметной области.
Например:
Для чисел: порядок по величине
Для строк: лексикографический порядок (словарный порядок)
Для дат: хронологический порядок
Для файлов: алфавитный порядок имен или порядок по дате изменения
Важно понимать, что "естественность" является контекстно-зависимым понятием. Для одного приложения естественным порядком сотрудников может быть сортировка по фамилии, для другого — по дате найма, для третьего — по зарплате.
Противопоставление: Comparable vs Comparator
Интерфейс Comparable определяет внутренний, естественный порядок — тот порядок, который является наиболее логичным и ожидаемым для объектов данного класса по умолчанию.
В противоположность этому, интерфейс Comparator определяет внешний, альтернативный порядок — специальные правила сравнения, которые могут меняться в зависимости от контекста использования.
Метафорически можно представить, что Comparable — это "врожденная" способность объекта знать, как он сравнивается с другими, тогда как Comparator — это "внешний измерительный инструмент", который можно применять по-разному в разных ситуациях.
#Java #для_новичков #beginner #Comparable
Интерфейс Comparable — концепция естественного порядка
В мире объектно-ориентированного программирования сравнение объектов представляет собой одну из наиболее фундаментальных и одновременно сложных операций. В отличие от примитивных типов данных, где сравнение значений является тривиальной операцией, объекты в Java требуют глубокого философского осмысления вопроса: "Что означает, что один объект меньше или больше другого?"
Интерфейс Comparable предлагает элегантное решение этой проблемы, вводя концепцию естественного порядка (natural ordering) — внутренне присущего объекту способа упорядочивания себя относительно других объектов того же типа. Эта концепция уходит корнями в математическую теорию порядка и теорию множеств, где бинарное отношение сравнения должно удовлетворять определенным аксиомам для формирования корректного линейного порядка.
Математические основы интерфейса Comparable
Аксиомы полного порядка
Интерфейс Comparable формализует математическое понятие тотального (линейного) порядка, который должен удовлетворять трем фундаментальным свойствам:
Рефлексивность (Reflexivity): ∀x: x.compareTo(x) == 0
Объект должен быть равен самому себе — это тривиальная, но необходимая аксиома.
Антисимметричность (Antisymmetry): ∀x, y: если x.compareTo(y) < 0, то y.compareTo(x) > 0
Если объект A меньше объекта B, то объект B должен быть больше объекта A. Это свойство обеспечивает непротиворечивость порядка.
Транзитивность (Transitivity): ∀x, y, z: если x.compareTo(y) < 0 и y.compareTo(z) < 0, то x.compareTo(z) < 0
Если A меньше B, а B меньше C, то A должно быть меньше C. Это ключевое свойство для формирования последовательного упорядочивания.
Нарушение аксиом как источник ошибок
Нарушение любой из этих аксиом приводит к непредсказуемому поведению алгоритмов сортировки и поиска. Например, если транзитивность нарушена, то сортировка может давать различные результаты при разных порядках обработки элементов или вовсе не завершаться.
Концепция естественного порядка
Естественный порядок — это способ упорядочивания объектов, который интуитивно понятен для предметной области.
Например:
Для чисел: порядок по величине
Для строк: лексикографический порядок (словарный порядок)
Для дат: хронологический порядок
Для файлов: алфавитный порядок имен или порядок по дате изменения
Важно понимать, что "естественность" является контекстно-зависимым понятием. Для одного приложения естественным порядком сотрудников может быть сортировка по фамилии, для другого — по дате найма, для третьего — по зарплате.
Противопоставление: Comparable vs Comparator
Интерфейс Comparable определяет внутренний, естественный порядок — тот порядок, который является наиболее логичным и ожидаемым для объектов данного класса по умолчанию.
В противоположность этому, интерфейс Comparator определяет внешний, альтернативный порядок — специальные правила сравнения, которые могут меняться в зависимости от контекста использования.
Метафорически можно представить, что Comparable — это "врожденная" способность объекта знать, как он сравнивается с другими, тогда как Comparator — это "внешний измерительный инструмент", который можно применять по-разному в разных ситуациях.
#Java #для_новичков #beginner #Comparable
👍2
Архитектура интерфейса Comparable
Структура интерфейса
Поразительная простота интерфейса — всего один метод — скрывает за собой глубокую семантику. Эта простота является примером принципа "делай одну вещь и делай ее хорошо".
Семантика возвращаемого значения
Метод compareTo возвращает целое число, интерпретация которого строго определена:
Отрицательное число: Текущий объект меньше объекта-параметра
Ноль: Объекты равны в смысле порядка (но не обязательно идентичны!)
Положительное число: Текущий объект больше объекта-параметра
Важно отметить, что величина возвращаемого числа (кроме знака) обычно не имеет значения — важен только знак. Однако некоторые реализации используют конкретные значения для оптимизации или дополнительной семантики.
Принципы реализации compareTo
Согласованность с equals
Один из наиболее важных принципов реализации Comparable — согласованность с методом equals:
Пример нарушения согласованности
Рассмотрим класс BigDecimal, где compareTo и equals ведут себя по-разному:
Цепочка сравнений
При сравнении составных объектов часто используется цепочка сравнений:
Проблема null-значений
Семантика сравнения с null
Спецификация Comparable не определяет явно поведение при сравнении с null.
Однако общепринятой практикой (и требованием многих API) является выброс NullPointerException:
Примеры реализации в стандартной библиотеке
String: лексикографическое сравнение
Класс String демонстрирует эталонную реализацию Comparable, основанную на лексикографическом порядке (кодовых точках Unicode):
Integer и другие wrapper-классы
Для числовых типов сравнение реализовано через сравнение примитивных значений:
LocalDate и временные типы
В Java Time API (Java 8+) сравнение дат и времени следует естественному хронологическому порядку:
#Java #для_новичков #beginner #Comparable
Структура интерфейса
public interface Comparable<T> {
int compareTo(T o);
}Поразительная простота интерфейса — всего один метод — скрывает за собой глубокую семантику. Эта простота является примером принципа "делай одну вещь и делай ее хорошо".
Семантика возвращаемого значения
Метод compareTo возвращает целое число, интерпретация которого строго определена:
Отрицательное число: Текущий объект меньше объекта-параметра
Ноль: Объекты равны в смысле порядка (но не обязательно идентичны!)
Положительное число: Текущий объект больше объекта-параметра
Важно отметить, что величина возвращаемого числа (кроме знака) обычно не имеет значения — важен только знак. Однако некоторые реализации используют конкретные значения для оптимизации или дополнительной семантики.
Принципы реализации compareTo
Согласованность с equals
Один из наиболее важных принципов реализации Comparable — согласованность с методом equals:
// Рекомендуется (но не обязательно), чтобы:
x.compareTo(y) == 0 ⇔ x.equals(y) == true
Нарушение этого принципа может привести к тонким ошибкам, особенно при использовании в коллекциях, основанных на упорядочивании (например, TreeSet, TreeMap).
Пример нарушения согласованности
Рассмотрим класс BigDecimal, где compareTo и equals ведут себя по-разному:
BigDecimal bd1 = new BigDecimal("1.0");
BigDecimal bd2 = new BigDecimal("1.00");
System.out.println(bd1.equals(bd2)); // false (разный масштаб)
System.out.println(bd1.compareTo(bd2)); // 0 (равны по значению)
Это историческое решение было принято для соответствия стандарту ANSI SQL, но оно служит предостережением о сложностях реализации сравнения.Цепочка сравнений
При сравнении составных объектов часто используется цепочка сравнений:
public int compareTo(Employee other) {
int result = this.lastName.compareTo(other.lastName);
if (result != 0) return result;
result = this.firstName.compareTo(other.firstName);
if (result != 0) return result;
return this.hireDate.compareTo(other.hireDate);
}
Такой подход создает иерархический порядок, где более значимые поля сравниваются первыми.Проблема null-значений
Семантика сравнения с null
Спецификация Comparable не определяет явно поведение при сравнении с null.
Однако общепринятой практикой (и требованием многих API) является выброс NullPointerException:
public int compareTo(Person other) {
if (other == null) {
throw new NullPointerException("Cannot compare with null");
}
// ... сравнение
}
Это решение основано на принципе "явное лучше неявного" — лучше получить немедленное исключение, чем молчаливую ошибку в логике упорядочивания.Примеры реализации в стандартной библиотеке
String: лексикографическое сравнение
Класс String демонстрирует эталонную реализацию Comparable, основанную на лексикографическом порядке (кодовых точках Unicode):
// Упрощенная концепция реализации
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
for (int k = 0; k < lim; k++) {
char c1 = value[k];
char c2 = anotherString.value[k];
if (c1 != c2) {
return c1 - c2; // Сравнение символов
}
}
return len1 - len2; // Более короткая строка "меньше"
}
Integer и другие wrapper-классы
Для числовых типов сравнение реализовано через сравнение примитивных значений:
public int compareTo(Integer anotherInteger) {
return compare(this.value, anotherInteger.value);
}
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
Обратите внимание на использование статического метода compare, который появился в Java 7 для улучшения читаемости.LocalDate и временные типы
В Java Time API (Java 8+) сравнение дат и времени следует естественному хронологическому порядку:
LocalDate date1 = LocalDate.of(2023, 1, 1);
LocalDate date2 = LocalDate.of(2023, 12, 31);
int result = date1.compareTo(date2); // Отрицательное число
#Java #для_новичков #beginner #Comparable
👍2
Проблемы и подводные камни
Переполнение при сравнении числовых разностей
Опасный, но распространенный антипаттерн:
Правильный подход:
Нарушение транзитивности при использовании с плавающей точкой
Сравнение объектов разных типов
Хотя интерфейс Comparable<T> является параметризованным, во время выполнения возможны попытки сравнения объектов разных типов.
Рекомендуется явная проверка:
Практические паттерны реализации
Паттерн "Делегирование"
Для классов-оберток или классов, содержащих Comparable поля:
Паттерн "Обратный порядок"
Для создания обратного (descending) порядка без изменения естественного:
Производительность и оптимизация
Сравнение примитивных полей
Для примитивных полей рекомендуется использовать специализированные методы сравнения:
Кэширование хэш-кодов и результатов сравнения
Для неизменяемых объектов с дорогим вычислением порядка:
#Java #для_новичков #beginner #Comparable
Переполнение при сравнении числовых разностей
Опасный, но распространенный антипаттерн:
// ОПАСНО: возможное переполнение!
public int compareTo(MyInteger other) {
return this.value - other.value;
}
При больших значениях разность может выйти за пределы int, что приведет к некорректным результатам.
Правильный подход:
public int compareTo(MyInteger other) {
return Integer.compare(this.value, other.value);
}Нарушение транзитивности при использовании с плавающей точкой
// ОПАСНО: нарушение транзитивности из-за NaN!
public int compareTo(DoubleWrapper other) {
return Double.compare(this.value, other.value);
// Double.compare корректно обрабатывает NaN
}
Значения с плавающей точкой, особенно NaN, требуют особой осторожности при сравнении.
Сравнение объектов разных типов
Хотя интерфейс Comparable<T> является параметризованным, во время выполнения возможны попытки сравнения объектов разных типов.
Рекомендуется явная проверка:
public int compareTo(Object other) {
if (!(other instanceof MyClass)) {
throw new ClassCastException("Cannot compare different types");
}
return compareTo((MyClass) other);
}Практические паттерны реализации
Паттерн "Делегирование"
Для классов-оберток или классов, содержащих Comparable поля:
public class Employee implements Comparable<Employee> {
private final String name;
private final LocalDate hireDate;
@Override
public int compareTo(Employee other) {
// Делегируем сравнение имени
int nameComparison = this.name.compareTo(other.name);
if (nameComparison != 0) {
return nameComparison;
}
// При равных именах сравниваем даты найма
return this.hireDate.compareTo(other.hireDate);
}
}Паттерн "Обратный порядок"
Для создания обратного (descending) порядка без изменения естественного:
Collections.sort(list, Collections.reverseOrder());
// Или для конкретного компаратора
Collections.sort(list, Comparator.reverseOrder());
Паттерн "Null-safe сравнение"
С Java 8 появились удобные методы для null-safe сравнения:
java
public int compareTo(Product other) {
return Comparator.comparing(Product::getName,
Comparator.nullsFirst(String::compareTo))
.thenComparing(Product::getPrice)
.compare(this, other);
}
Производительность и оптимизация
Сравнение примитивных полей
Для примитивных полей рекомендуется использовать специализированные методы сравнения:
public int compareTo(Person other) {
// Вместо: return this.age - other.age;
return Integer.compare(this.age, other.age);
}
Эти методы не только безопасны от переполнения, но и часто лучше оптимизируются JVM.Кэширование хэш-кодов и результатов сравнения
Для неизменяемых объектов с дорогим вычислением порядка:
public final class ComplexNumber implements Comparable<ComplexNumber> {
private final double real;
private final double imaginary;
private transient int hash; // Кэшированный хэш-код
private transient Integer comparisonCache; // Кэш сравнения
@Override
public int compareTo(ComplexNumber other) {
if (comparisonCache == null) {
// Дорогое вычисление порядка
comparisonCache = computeComparisonValue();
}
// Сравнение на основе кэшированного значения
return comparisonCache.compareTo(other.getComparisonCache());
}
}#Java #для_новичков #beginner #Comparable
👍2
Что выведет код?
#Tasks
import java.util.*;
public class Task201225 {
public static void main(String[] args) {
List<Number> list = new ArrayList<>();
list.add(10); // Integer
list.add(5.5); // Double
list.add(3); // Integer
list.add(2.0); // Double
Collections.sort(list);
System.out.println(list);
}
}
#Tasks
👍1
Варианты ответа:
Anonymous Quiz
44%
[2.0, 3, 5.5, 10]
11%
[3, 10, 2.0, 5.5]
11%
[10, 5.5, 3, 2.0]
33%
Ошибка компиляции
👍1