Обратите внимание, что по первой ссылке приведен метод valueOf() с двумя аргументами, а не с одним. В статье же речь шла про valueOf() с одним аргументом. О существовании valueOf() с двумя аргументами было написано чуть выше процитированного отрывка.
По второй ссылке также приведен не тот метод, про который написано в статье - getEnumConstants() вместо values().
... single-element enum type is often the best way to implement a singleton.
Правда я не уверен, что кто-либо хочет видеть в своих синглтоновых классах методы valueOf(), values(), compareTo() , ordinal() и т.д. Ради интереса я даже пытался найти хотя бы один синглтон на основе enum в стандартной библиотеке Java, но не нашел.
Кстати, в Котлине не стали пользоваться рекомендацией Блоха и у них object разворачивается в обычный класс с одной внутренней статической константой. Сам класс от `java.lang.Enum` не наследуется
появилась поддержка лямбда-выражений — это то, чего не хватало в SLF4J. Кажется, что связка System.Logger и log4j2 будет идеальной;
убрали лишние уровни логирования типа FINE, FINER, FINEST и оставили привычные 5 уровней (+2 системных);
но при этом поленились создавать методы debug(), info() и прочие, предлагая каждый раз указывать уровень логирования в аргументах метода;
в lombok до сих пор нет аннотации, которая будет генерировать инстанс такого логера.
В итоге переход с SLF4J будет слишком тяжелым: нужно будет руками создавать экземпляр логера в каждом классе и везде придется поменять вызовы логирующих методов. Если с первый недостаток можно было бы устранить, сделав PR в lombok, то для устранения второго придется писать тулзу (или искать существующую), которая пробежится по всем классам и переделает вызовы логирования в соответствии с новой парадигмой.
В общем, создать универсальное средство для логирования, которое стало бы общепринятым в Java-мире, так и не удалось. SLF4J и Logback мертвы, но все еще хорошо справляются со своей работой, а переход с SLF4J на System.Logger кажется слишком болезненным.
К сожалению, библиотека Spring Email (org.springframework.mail) предоставляет функционал только для отправки писем. Если требуется читать письма, то можно воспользоваться ванильной javax.mail со всеми ее недостатками.
Возможно есть какое-то API для чтения писем в Spring Integration, но мне пока не доводилось с ним работать.
Странно, что не упомянули аналог springdoc-openapi-ui — springfox, т.к. у Springfox в 5 раз больше звездочек на гитхабе (тут следует заметить, что ни тот, ни другой проект не имеют отношения к фреймворку Spring и не мейнтейнятся Pivotal'ом).
Мы у себя в проекте пользуемся springdoc-openapi-ui, потому что так исторически сложилось.
Для того чтобы не перегружать контроллер описаниями мы сначала придумали собственные аннотации, описывающие стандартные виды ответа сервера: @BadRequestApiResponse, @UnauthorizedApiResponse. Эти аннотации включали в себя обычные аннотации из io.swagger. Вот пример такой аннотации:
В итоге в контроллере нужно было подробно описывать только положительный исход работы API, но и для этого мы потом тоже придумали аннотацию. Вот так стала выглядеть шапка метода контроллера (все названия и описания моделей изменены):
@GetMapping("/entities")
@SecureOperation(summary = "Поиск сущностей по фильтрам")
@OkApiResponse(description = "Отпагинированный список сущностей")
@BadRequestApiResponse
@UnauthorizedApiResponse
@InternalServerErrorApiResponse
SearchPage<EntityJsonPojo> findEntities(
Когда описание API стало занимать больше половины класса контроллера мы вынесли его в интерфейс.
Насчет того что модели становятся перегруженными, на мой взгляд, в этом нет ничего страшного — у них работа такая. В итоге на полями моделей висит три вида аннотаций: от com.fasterxml.jackson, от javax.validation и от io.swagger:
@Schema(description = "Мобильный телефон", example = "8005553535")
@NotNull
@JsonProperty(value = "phone")
@Pattern(regexp = "\\d{10}", message = "Телефон должен состоять из 10 символов (без 8)")
private String phoneNumber;
Стоит добавить еще подкаст The Art Of Programming, все-таки уже больше 10 лет выходит с завидной регулярностью (спасибо Голодному из Иркутска). Подкаст начинался, как посвященный Java, но на сегодняшний день там обсуждаются темы без привязки к определенной технологии / ЯП.
Обратите внимание, что по первой ссылке приведен метод valueOf() с двумя аргументами, а не с одним. В статье же речь шла про valueOf() с одним аргументом. О существовании valueOf() с двумя аргументами было написано чуть выше процитированного отрывка.
По второй ссылке также приведен не тот метод, про который написано в статье - getEnumConstants() вместо values().
Подскажите, пожалуйста, зачем Microprofile написали свою собственную реализацию OpenApi, если есть уже готовая библиотека от мейнтейнеров OpenApi - SmartBear?
Ага, еще Джошуа Блох писал, что
Правда я не уверен, что кто-либо хочет видеть в своих синглтоновых классах методы
valueOf()
,values()
,compareTo()
,ordinal()
и т.д.Ради интереса я даже пытался найти хотя бы один синглтон на основе
enum
в стандартной библиотеке Java, но не нашел.Кстати, в Котлине не стали пользоваться рекомендацией Блоха и у них
object
разворачивается в обычный класс с одной внутренней статической константой. Сам класс от`java.lang.Enum`
не наследуетсяПара мыслей про новый
System.Logger
:System.Logger
и log4j2 будет идеальной;FINE
,FINER
,FINEST
и оставили привычные 5 уровней (+2 системных);debug()
,info()
и прочие, предлагая каждый раз указывать уровень логирования в аргументах метода;В итоге переход с SLF4J будет слишком тяжелым: нужно будет руками создавать экземпляр логера в каждом классе и везде придется поменять вызовы логирующих методов. Если с первый недостаток можно было бы устранить, сделав PR в lombok, то для устранения второго придется писать тулзу (или искать существующую), которая пробежится по всем классам и переделает вызовы логирования в соответствии с новой парадигмой.
В общем, создать универсальное средство для логирования, которое стало бы общепринятым в Java-мире, так и не удалось. SLF4J и Logback мертвы, но все еще хорошо справляются со своей работой, а переход с SLF4J на
System.Logger
кажется слишком болезненным.К сожалению, библиотека Spring Email (
org.springframework.mail
) предоставляет функционал только для отправки писем. Если требуется читать письма, то можно воспользоваться ванильнойjavax.mail
со всеми ее недостатками.Возможно есть какое-то API для чтения писем в Spring Integration, но мне пока не доводилось с ним работать.
Странно, что не упомянули аналог
springdoc-openapi-ui
— springfox, т.к. у Springfox в 5 раз больше звездочек на гитхабе (тут следует заметить, что ни тот, ни другой проект не имеют отношения к фреймворку Spring и не мейнтейнятся Pivotal'ом).Мы у себя в проекте пользуемся
springdoc-openapi-ui
, потому что так исторически сложилось.Для того чтобы не перегружать контроллер описаниями мы сначала придумали собственные аннотации, описывающие стандартные виды ответа сервера:
@BadRequestApiResponse
,@UnauthorizedApiResponse
. Эти аннотации включали в себя обычные аннотации изio.swagger
. Вот пример такой аннотации:В итоге в контроллере нужно было подробно описывать только положительный исход работы API, но и для этого мы потом тоже придумали аннотацию. Вот так стала выглядеть шапка метода контроллера (все названия и описания моделей изменены):
Когда описание API стало занимать больше половины класса контроллера мы вынесли его в интерфейс.
Насчет того что модели становятся перегруженными, на мой взгляд, в этом нет ничего страшного — у них работа такая. В итоге на полями моделей висит три вида аннотаций: от
com.fasterxml.jackson
, отjavax.validation
и отio.swagger
: