Продолжаем конкурс на самый интересный контент в телеграм-каналах Proglib!
Призовой фонд — 280 тысяч рублей. Срок окончания конкурса -- 15 мая
Автор лучшего поста в отдельно взятом канале получает 20 тысяч рублей.
Мы упростили конкурс — теперь вам достаточно найти интересную и актуальную статью 2020-2021 года, написать к ней небольшой анонс (до 700 знаков) и прислать нам, тем не менее ваши идеи по другим форматам только добавляют + в общий зачет. Авторство можем указать по вашему желанию. В канале @progbook предлагаем отправлять рецензии на новые книги и старые актуальные.
Полный список каналов:
https://yangx.top/progbook
https://yangx.top/proglibrary
https://yangx.top/pyproglib
https://yangx.top/frontendproglib
https://yangx.top/javaproglib
https://yangx.top/dsproglib
https://yangx.top/phpproglib
https://yangx.top/cppproglib
https://yangx.top/mobileproglib
https://yangx.top/goproglib
https://yangx.top/csharpproglib
https://yangx.top/devopsslib
https://yangx.top/testerlib
https://yangx.top/hackproglib
Все посты будут с лайками и дизлайками и хэштегом #proglib_contest. Ссылки мы будем прогонять через наш сокращатель, будут браться в расчет лайки, дизлайки, охваты, клики по ссылкам. Выиграет тот кто наберёт больше всего лайков/охватов/кликов по ссылкам в публикации. Присылайте посты боту @proglib_contest_bot с указанием, на какой канал идет публикация. Юридическая информация здесь.
Призовой фонд — 280 тысяч рублей. Срок окончания конкурса -- 15 мая
Автор лучшего поста в отдельно взятом канале получает 20 тысяч рублей.
Мы упростили конкурс — теперь вам достаточно найти интересную и актуальную статью 2020-2021 года, написать к ней небольшой анонс (до 700 знаков) и прислать нам, тем не менее ваши идеи по другим форматам только добавляют + в общий зачет. Авторство можем указать по вашему желанию. В канале @progbook предлагаем отправлять рецензии на новые книги и старые актуальные.
Полный список каналов:
https://yangx.top/progbook
https://yangx.top/proglibrary
https://yangx.top/pyproglib
https://yangx.top/frontendproglib
https://yangx.top/javaproglib
https://yangx.top/dsproglib
https://yangx.top/phpproglib
https://yangx.top/cppproglib
https://yangx.top/mobileproglib
https://yangx.top/goproglib
https://yangx.top/csharpproglib
https://yangx.top/devopsslib
https://yangx.top/testerlib
https://yangx.top/hackproglib
Все посты будут с лайками и дизлайками и хэштегом #proglib_contest. Ссылки мы будем прогонять через наш сокращатель, будут браться в расчет лайки, дизлайки, охваты, клики по ссылкам. Выиграет тот кто наберёт больше всего лайков/охватов/кликов по ссылкам в публикации. Присылайте посты боту @proglib_contest_bot с указанием, на какой канал идет публикация. Юридическая информация здесь.
Telegram
Книги для программистов
Все о книгах из мира IT.
По рекламе: @proglib_adv
Учиться у нас: https://proglib.io/w/de94a698
Работать у нас: https://job.proglib.io/
Наши каналы: https://yangx.top/proglibrary/9197
РКН: https://www.gosuslugi.ru/snet/67931954509aba565214777d
По рекламе: @proglib_adv
Учиться у нас: https://proglib.io/w/de94a698
Работать у нас: https://job.proglib.io/
Наши каналы: https://yangx.top/proglibrary/9197
РКН: https://www.gosuslugi.ru/snet/67931954509aba565214777d
Мы уверены на 1011%, что JavaScript-разработчики умеют буквально всё и даже могут спасти нашу планету от уничтожения 💥 Поэтому сделали квест @mgfon_bot, который можно пройти, только если ты умеешь отлично кодить.
Запомни: у тебя есть примерно 2 месяца, чтобы попробовать свои силы. Затем мы отберём 10 лучших прогеров, которым подарим мерч, а самых-самых позовём на собеседование.
Ну что, ты готов показать класс?
Запомни: у тебя есть примерно 2 месяца, чтобы попробовать свои силы. Затем мы отберём 10 лучших прогеров, которым подарим мерч, а самых-самых позовём на собеседование.
Ну что, ты готов показать класс?
Что такое fail-fast и fail-safe итераторы?
Это не какие-то отдельные типы, а характеристики разных реализаций интерфейса
Fail-fast – «быстрый» итератор. Когда после его создания коллекция как-либо изменилась, он падает с ошибкой без лишних разбирательств. Так работает итератор класса
Fail-safe – «умный» итератор. Обычно плата за отказоустойчивость – возможная неконсистентность данных («слабая консистентность»). Итератор класса
Это не какие-то отдельные типы, а характеристики разных реализаций интерфейса
Iterator
. Они определяют, как поведет себя итератор при изменении перебираемой последовательности.Fail-fast – «быстрый» итератор. Когда после его создания коллекция как-либо изменилась, он падает с ошибкой без лишних разбирательств. Так работает итератор класса
ArrayList
, при изменении он выбрасывает ConcurrentModificationException
. Рекомендуется не основывать логику программы на fail-fast отказах, и использовать их только как признак ошибки реализации.Fail-safe – «умный» итератор. Обычно плата за отказоустойчивость – возможная неконсистентность данных («слабая консистентность»). Итератор класса
ConcurrentHashMap
работает с копией данных, он не выбросит исключение при изменении коллекции, но может не увидеть часть свежих изменений. Плата за отсутствие ошибок других fail-safe итераторов может отличаться, детали всегда можно найти в документации коллекций.💻 Какие IT каналы в Telegram читаем мы?
Сегодня представляем вашему вниманию 5 каналов, которые действительно этого заслуживают. Подписывайтесь на наших друзей:
CodeCamp — Мастхэв канал для любого IT-специалиста: лучшие книги, полезные сервисы и отборные видеоуроки.
@bugfeature — Подлинный канал "Не баг, а фича", который раскрывает секреты социальных сетей, уязвимости приложений, а так же рассказывает об этичном хакинге, анонимности в сети и личной безопасности в интернете.
@front_end_dev – Актуальные материалы для веб-разработчика: статьи, туториалы, инструменты, фишки ЯП и лучшие практики.
@S_E_Book — Самая редкая и актуальная литература в сети, для ИТ специалистов любого уровня и направления, которая публикуется еще до момента выхода в официальных источниках.
GIT — Канал, где Вы найдете уникальные онлайн-сервисы и инструменты на все случаи жизни.
Сегодня представляем вашему вниманию 5 каналов, которые действительно этого заслуживают. Подписывайтесь на наших друзей:
CodeCamp — Мастхэв канал для любого IT-специалиста: лучшие книги, полезные сервисы и отборные видеоуроки.
@bugfeature — Подлинный канал "Не баг, а фича", который раскрывает секреты социальных сетей, уязвимости приложений, а так же рассказывает об этичном хакинге, анонимности в сети и личной безопасности в интернете.
@front_end_dev – Актуальные материалы для веб-разработчика: статьи, туториалы, инструменты, фишки ЯП и лучшие практики.
@S_E_Book — Самая редкая и актуальная литература в сети, для ИТ специалистов любого уровня и направления, которая публикуется еще до момента выхода в официальных источниках.
GIT — Канал, где Вы найдете уникальные онлайн-сервисы и инструменты на все случаи жизни.
Какой выбрать тип для даты/времени?
В пакете java.util расположены старые классы стандартной библиотеки Java:
Постепенно стандартом де-факто стала сторонняя библиотека Joda-Time. Её разработчики решили все названные выше проблемы.
В Java 8 был добавлен пакет java.time, который взял решения из Joda-Time в стандарт, создатель библиотеки участвовал в разработке. Ключевые классы пакета:
•
•
•
Отдельно существуют классы
Таким образом, в проектах на Java 8+ нужно использовать современные java.time.*, для более старых – подключать Joda-Time.
В пакете java.util расположены старые классы стандартной библиотеки Java:
Date
(дата+время), Calendar
(конвертация и манипуляция), TimeZone
(смещение часового пояса). Эти классы обладали рядом известных проблем. Экземпляры были изменяемыми, что делало их потоко-небезопасными. Работа с датами через календарь была неудобной, не было нормальной поддержки часовых поясов и интернационализации.Постепенно стандартом де-факто стала сторонняя библиотека Joda-Time. Её разработчики решили все названные выше проблемы.
В Java 8 был добавлен пакет java.time, который взял решения из Joda-Time в стандарт, создатель библиотеки участвовал в разработке. Ключевые классы пакета:
•
LocalDate
, LocalTime
и LocalDateTime
– локальные для пользователя дата/время.•
ZonedDateTime
– дата/время в определенной часовой зоне.•
Period
и Duration
– периоды дат и времени соответственно.Отдельно существуют классы
Date
и Time
пакета java.sql. Это представление даты и времени для обмена данными через JDBC. Не стоит пользоваться ими вне уровня доступа к данным, хотя бы потому, что это классы-наследники старого java.util.Date
.Таким образом, в проектах на Java 8+ нужно использовать современные java.time.*, для более старых – подключать Joda-Time.
За последнее время интерес к NFT-токенам стремительно увеличивается. Вы наверное слышали о таких крупных сделках, как картина Бенкси, портрет Сноудена или токен Нурмагомедова? Кажется, мода на цифровое искусство только набирает обороты, а тут кто первый, тот и выиграл.
Являясь медиа об IT, «Библиотека программиста» просто не могла пройти мимо тренда и решила внести свой вклад в развитие блокчейн-технологий и цифрового искусства. Любой желающий может приобрести первую статью на сайте, которая имеет более 470 000 просмотров.
Цена лота от 1 Ethereum, торги продлятся 3 недели.
Узнать больше можно по ссылке.
Являясь медиа об IT, «Библиотека программиста» просто не могла пройти мимо тренда и решила внести свой вклад в развитие блокчейн-технологий и цифрового искусства. Любой желающий может приобрести первую статью на сайте, которая имеет более 470 000 просмотров.
Цена лота от 1 Ethereum, торги продлятся 3 недели.
Узнать больше можно по ссылке.
Библиотека программиста
Материалы, которые научат и помогут программировать. Книги и лекции, видеоуроки и советы, тесты знаний и обсуждение горячих тем. Присоединяйтесь!
Как прочитать криптографический ключ?
Существует большое разнообразие алгоритмов шифрования: DSA, RSA, и другие. Строка-название нужного алгоритма поставляется в фабрику ключей при её создании.
Спецификация, объект интерфейса
Сами внутренние представления ключей реализуют интерфейсы
Для каждого конкретного типа ключа используются соответствующие им классы-реализации интерфейсов.
KeyFactory
– основной класс платформы Java для работы с криптографическими ключами. Набор реализаций для этой фабрики подключается с помощью механизма SPI.Существует большое разнообразие алгоритмов шифрования: DSA, RSA, и другие. Строка-название нужного алгоритма поставляется в фабрику ключей при её создании.
KeyFactory
занимается конвертацией спецификации ключа в сам публичный или приватный ключ, и обратно.Спецификация, объект интерфейса
KeySpec
, – входные данные ключа. Это может быть например модуль и экспонента приватного ключа RSA.Сами внутренние представления ключей реализуют интерфейсы
PublicKey
и PrivateKey
– наследники общего Key
.Для каждого конкретного типа ключа используются соответствующие им классы-реализации интерфейсов.
Wikipedia
RSA
RSA (аббревиатура от фамилий Rivest, Shamir и Adleman) — криптографический алгоритм с открытым ключом, основывающийся на вычислительной сложности задачи факторизации больших полупростых чисел.
Как ведут себя конфликтующие импорты?
• Классы текущего пакета доступны без импорта. Если импортируется другой класс, совпадающий с классом-соседом по пакету – сосед перекрывается. Будет использован импортированный класс, без ошибки.
• Если в class-файле существует несколько разных классов с одинаковыми именами, объявленных здесь же или импортированных – это приводит к ошибке компиляции.
• Импортировать один и тот же класс несколько раз допускается. Будет всего лишь warning о неиспользуемом импорте.
• Для статических импортов констант действуют те же правила. Обычные и статические импорты не конфликтуют друг с другом – для выбора достаточно контекста использования.
• Чтобы применять несколько классов/констант с одинаковыми именами в одном файле, придется обойтись без импортов. Нужно будет обращаться по их полным именам, с указанием пакета.
• Классы текущего пакета доступны без импорта. Если импортируется другой класс, совпадающий с классом-соседом по пакету – сосед перекрывается. Будет использован импортированный класс, без ошибки.
• Если в class-файле существует несколько разных классов с одинаковыми именами, объявленных здесь же или импортированных – это приводит к ошибке компиляции.
• Импортировать один и тот же класс несколько раз допускается. Будет всего лишь warning о неиспользуемом импорте.
• Для статических импортов констант действуют те же правила. Обычные и статические импорты не конфликтуют друг с другом – для выбора достаточно контекста использования.
• Чтобы применять несколько классов/констант с одинаковыми именами в одном файле, придется обойтись без импортов. Нужно будет обращаться по их полным именам, с указанием пакета.
Как сериализация работает с наследованием?
Когда
При сериализации несериализуемые предки просто игнорируются.
Если класс несериализуемый и не предоставляет достаточного доступа к своему логическому состоянию для наследников, правильно реализовать его наследника сериализуемым может быть невозможно.
Популярный вопрос на тему – как когда сериализуешь объект класса-наследника, избежать сериализации его родительской части. Единственный способ добиться этого – кастомизировать сериализационную форму, определив собственную реализацию
Открытость класса для наследования делает неприменимым паттерн serialization proxy (который рассмотрим позднее).
Когда
Serializable
класс имеет цепочку родителей, пока эти родители тоже Serializable
, десериализация объекта идет от родителя к наследнику, в обход конструктора. Вместо него вызываются методы readObject
(readObjectNoData
). Но как только встречается первый предок, не реализующий интерфейс Serializable
, инициализация для него возвращается в нормальное русло – вместо readObject
вызывается конструктор без аргументов. Если такого конструктора нет, или он объявлен private
, исполнение выбросит InvalidClassException
.При сериализации несериализуемые предки просто игнорируются.
Если класс несериализуемый и не предоставляет достаточного доступа к своему логическому состоянию для наследников, правильно реализовать его наследника сериализуемым может быть невозможно.
Популярный вопрос на тему – как когда сериализуешь объект класса-наследника, избежать сериализации его родительской части. Единственный способ добиться этого – кастомизировать сериализационную форму, определив собственную реализацию
writeObject()
, либо используя интерфейс Externalizable
.Открытость класса для наследования делает неприменимым паттерн serialization proxy (который рассмотрим позднее).
Вы профи в своём деле? Мы хорошо за это заплатим. Ищем экспертов для проведения мероприятия в Москве 22 и 23 мая. Темы следующие:
- Архитектура программного обеспечения
- Подходы к решению алгоритмических задач с собеседований Google и Яндекс
- Базы данных: модели, миграции, тестирование
- Практикум по рефакторингу
За один день платим от 20 до 30 тыс. ₽ (в зависимости от опыта и вовлеченности). Отклики с резюме кидайте сюда: @proglib_expert_bot
- Архитектура программного обеспечения
- Подходы к решению алгоритмических задач с собеседований Google и Яндекс
- Базы данных: модели, миграции, тестирование
- Практикум по рефакторингу
За один день платим от 20 до 30 тыс. ₽ (в зависимости от опыта и вовлеченности). Отклики с резюме кидайте сюда: @proglib_expert_bot
Вы наверняка заметили, что мы регулярно проводим опросы, чтобы соответствовать вашим запросам и интересам. Знаем, что нас читают не только новички – многие подписчики уже стали миддлами и даже сеньорами. Если чувствуете, что переросли middle-уровень, пора задуматься о создании собственного полноценного проекта – не на одни выходные.
Для такой задачи нужно широкое видение процесса разработки и архитектуры информационных систем. На одной интуиции можно набить шишек, а книжки по таким вопросам достаточно быстро устаревают. Обратите внимание на страницу курса Архитектор ИТ https://proglib.io/w/ebb18c5f
На странице можно почерпнуть сведения о том, какие знания нужны, и составить собственную программу-максимум. Или сэкономить время и воспользоваться учебным планом GeekBrains – благо уже есть площадка с контентом, приглашенные эксперты-практики и 4 курсовых проекта с поддержкой крупных компаний.
Для такой задачи нужно широкое видение процесса разработки и архитектуры информационных систем. На одной интуиции можно набить шишек, а книжки по таким вопросам достаточно быстро устаревают. Обратите внимание на страницу курса Архитектор ИТ https://proglib.io/w/ebb18c5f
На странице можно почерпнуть сведения о том, какие знания нужны, и составить собственную программу-максимум. Или сэкономить время и воспользоваться учебным планом GeekBrains – благо уже есть площадка с контентом, приглашенные эксперты-практики и 4 курсовых проекта с поддержкой крупных компаний.
Что можно делать с переменной хранящей null?
Во-первых, если переменная не финальная, использовать как L-value этого типа – присваивать новое значение.
Во-вторых, то же, что со значением
🔘 Сравнивать с
🔘 Приводить к типу-родителю (upcast) или типу-наследнику (downcast), учитывая границы generic-параметров при наличии;
🔘 Обращаться к членам экземпляра и получать
🔘 Применять
В-третьих, можно обращаться к статическим членам класса. В вопросе подразумевается именно эта интересная часть. Это безопасно,
Во-первых, если переменная не финальная, использовать как L-value этого типа – присваивать новое значение.
Во-вторых, то же, что со значением
null
, но с учетом типа:🔘 Сравнивать с
null
или переменной этого же класса;🔘 Приводить к типу-родителю (upcast) или типу-наследнику (downcast), учитывая границы generic-параметров при наличии;
🔘 Обращаться к членам экземпляра и получать
NullPointerException
;🔘 Применять
instanceof
и получать false
🔘 Использовать как параметр для методов и других совместимых с типом операторовВ-третьих, можно обращаться к статическим членам класса. В вопросе подразумевается именно эта интересная часть. Это безопасно,
NullPointerException
не возникнет, но для упрощения отладки и из-за отсутствия переопределения статических членов рекомендуется так не делать. Вместо этого обращайтесь к статике явно через имя класса, либо неявно, добавив для класса import static
.Wikipedia
L-value
Wikimedia disambiguation page
Что такое static?
Ключевое слово
Статические поля и методы – члены класса а не экземпляра, потому к ним можно обращаться через имя класса. Код статического блока или метода имеет доступ только к статическим членам. Статические поля не участвуют в сериализации.
Для статических методов используется раннее связывание, то есть вызов конкретного метода разрешается на этапе компиляции, не работают перегрузка и переопределение в наследниках.
Статический блок инициализации выполняется потокобезопасно, один раз сразу после загрузки класса класслоадером. Инициализаторы статических полей выполняются в неявном статическом блоке. Блоков может быть несколько, выполнятся они в порядке объявления.
Статический импорт (
Ключевое слово
static
используется для объявления вложенных классов, статических методов, полей, блоков инициализации и статических импортов.Статические поля и методы – члены класса а не экземпляра, потому к ним можно обращаться через имя класса. Код статического блока или метода имеет доступ только к статическим членам. Статические поля не участвуют в сериализации.
Для статических методов используется раннее связывание, то есть вызов конкретного метода разрешается на этапе компиляции, не работают перегрузка и переопределение в наследниках.
Статический блок инициализации выполняется потокобезопасно, один раз сразу после загрузки класса класслоадером. Инициализаторы статических полей выполняются в неявном статическом блоке. Блоков может быть несколько, выполнятся они в порядке объявления.
Статический импорт (
static import
) импортирует статические члены классов в .java
-файл.Baeldung
Static and Dynamic Binding in Java | Baeldung
An exploration of how Java handles binding method names for lookup at runtime.
#вопросы_с_собеседований
Чем отличаются методы Thread.sleep() и Thread.yield()?
Чем отличаются методы Thread.sleep() и Thread.yield()?
Метод yield() служит причиной того, что поток переходит из состояния работающий (running) в состояние работоспособный (runnable), давая возможность другим потокам активизироваться. Но следующий выбранный для запуска поток может и не быть другим.
Метод sleep() вызывает засыпание текущего потока на заданное время, состояние изменяется с работающий (running) на ожидающий (waiting).
Метод sleep() вызывает засыпание текущего потока на заданное время, состояние изменяется с работающий (running) на ожидающий (waiting).
Beginning Jakarta EE Web Development (2020)
Автор: Luciano Manelli
Количество страниц: 424
Начните создавать веб-приложения на основе Java прямо сейчас, даже если вы новичок в Java. Эта всеобъемлющая и основанная на примерах книга - все, что вам нужно для разработки динамических веб-приложений на основе Java с использованием JSP, подключения к базам данных с помощью JSF и их практического использования с помощью популярного веб-сервера Java с открытым исходным кодом, Apache Tomcat.
Скачать книгу
Автор: Luciano Manelli
Количество страниц: 424
Начните создавать веб-приложения на основе Java прямо сейчас, даже если вы новичок в Java. Эта всеобъемлющая и основанная на примерах книга - все, что вам нужно для разработки динамических веб-приложений на основе Java с использованием JSP, подключения к базам данных с помощью JSF и их практического использования с помощью популярного веб-сервера Java с открытым исходным кодом, Apache Tomcat.
Скачать книгу
Telegram
Книги для программистов (reserved)
Beginning Jakarta EE Web Development (2020)
Автор: Luciano Manelli
Автор: Luciano Manelli
Крупнейший сервис Телеграм-аналитики TGStat проводит исследование аудитории Телеграма. Опрос анонимный, занимает не больше пяти-семи минут, почти везде просто клики по вариантам ответа. В результате статистика по каналам станет точнее, а жизнь — проще. Давайте поможем: https://tgstat.ru/research
TGStat.ru
Исследование аудитории Telegram 2023.
Кто же он — пользователь Telegram 2023 года?
new Integer(128) == 128?
Для всех классов-оберток над примитивами кроме
Кэшируемые значения – оба возможных
Значения кэшируются и во многих других встроенных классах:
В конкретно этом примере скрыт еще один подвох: объект класса-обертки сравнивается с примитивом. Это приводит к анбоксингу и сравнению значений. И ответ на вопрос – да.
Для всех классов-оберток над примитивами кроме
Float
и Double
работает механизм кэширования. Некоторые значения создаются на этапе инициализации класса, и переиспользуются когда объект создается не оператором new
(например с помощью valueOf
). Кэшируемые значения – оба возможных
Boolean
, Character
до 'u007f'
(127
) и все целые числа от -128
до 127
включительно. С Java 7 верхнюю границу для Integer
можно увеличить параметром java.lang.Integer.IntegerCache.high
. Значения кэшируются и во многих других встроенных классах:
BigDecimal
, Currency
, пустые коллекции. Детали можно узнавать из исходников и документаций, так как эти кэши реализованы не на уровне JVM а в коде классов. В конкретно этом примере скрыт еще один подвох: объект класса-обертки сравнивается с примитивом. Это приводит к анбоксингу и сравнению значений. И ответ на вопрос – да.
Stack Overflow
How large is the Integer cache?
Class Integer has cache, which caches the Integer values. So if I use method valueOf or inboxing the new value will not be instantiated, but get from the cache.
I know that the default cache size ...
I know that the default cache size ...
Что такое enum?
enum – тип-перечисление. Бывает много разных формулировок вопроса, все они сводятся к разговору о перечислениях вообще. Технически это финальный класс со статическими финальными полями-экземплярами.
Является
Имеет только заранее заданный набор значений. Значения неявно
Копии элементов перечисления не создаются даже при десериализации. Вот почему Effective Java предлагает использовать для сериализуемого синглтона
Экземпляры хранят свойства
Финализация и клонирование перечислений запрещены.
enum – тип-перечисление. Бывает много разных формулировок вопроса, все они сводятся к разговору о перечислениях вообще. Технически это финальный класс со статическими финальными полями-экземплярами.
enum Foo
всегда неявно наследуется от Enum<Foo>
– то есть перечислением нельзя расширить другой класс, но всё еще можно реализовать интерфейсы. Из-за generic-параметра разные перечисления не имеют общего предка кроме Object
.Является
Comparable
(сравнивается позиция по порядку объявления значений) и Serializable
(сериализуется только имя константы).Имеет только заранее заданный набор значений. Значения неявно
public static final
и это нельзя переопределить. Для инициализации констант действуют все правила статической типизации. Копии элементов перечисления не создаются даже при десериализации. Вот почему Effective Java предлагает использовать для сериализуемого синглтона
enum
. Экземпляры хранят свойства
name
и ordinal
– имя и порядковый номер константы. Статический метод values
вернет список всех констант, valueOf
– константу по имени. Спецификация.Финализация и клонирование перечислений запрещены.
Stack Overflow
Serialization of enum fields in Java
From the Javadoc of ObjectInputStream:
Enum constants are deserialized differently than ordinary serializable
or externalizable objects. The serialized form of an enum constant
consists sole...
Enum constants are deserialized differently than ordinary serializable
or externalizable objects. The serialized form of an enum constant
consists sole...
Под каким типом хранить период времени?
В стандартной библиотеке современных версий Java для этих целей есть два класса:
Оба класса реализуют общий интерфейс
Экземпляры обоих классов могут быть созданы из значений отдельных компонентов, из двух моментов времени методом between, или из строки. Строковое представление Duration:
До Java 8 основным способом хранения периода были числовые примитивы. В этом подходе есть много недостатков, среди которых в первую очередь неограниченность значений и ненаглядность. Чтобы в Java 8+ получить период числом, используется метод
В стандартной библиотеке современных версий Java для этих целей есть два класса:
Period
– календарный период. Количество дней, месяцев и лет. Одним днем здесь считается день в терминах ZonedDateTime
.Duration
– длительность времени. Количество наносекунд, секунд, минут, часов, и тоже дней. Здесь один день – ровно 24 часа.Оба класса реализуют общий интерфейс
TemporalAmount
– период времени вообще. Оба иммутабельны, и как следствие, потокобезопасны. Любая модифицирующая операция вроде plusX()
возвращает новый экземпляр с измененным значением.Экземпляры обоих классов могут быть созданы из значений отдельных компонентов, из двух моментов времени методом between, или из строки. Строковое представление Duration:
"P2DT3H4M"
, Period: "P1Y2M3D"
.До Java 8 основным способом хранения периода были числовые примитивы. В этом подходе есть много недостатков, среди которых в первую очередь неограниченность значений и ненаглядность. Чтобы в Java 8+ получить период числом, используется метод
between()
нужного элемента енама ChronoUnit
.