Lombok предусмотрительно добавил функцию "delombok" для тех, кто разочаровался и передумал. Для большинства кейсов это возможно прямо из интерфейса IDEA (для @ExtensionMethod пока не реализовано).
Вариант с AssertJ дает диагностику только ожидаемое значение vs актуальное. Но ведь там нет указания, какой именно метод был вызван ("SamplePojo::getName"), т.е. AssertJ не резолвит это, а в примере с where-выражением для hamcrest это есть.
По поводу прокси — да, есть такой вариант, но насколько я понял, это требует дополнительных зависимостей вроде cglib, плюс вызов метода, плюс это скорее всего не работает с final-методами, статическими методами, конструкторами.
/**
* Appends the specified element to the end of this list (optional
* operation).
...
* @throws UnsupportedOperationException if the <tt>add</tt> operation
* is not supported by this list
*/
boolean add(E e);
Что касается kotlin, то, во-первых, в примере делается небезопасное приведение типов, поэтому автор сам себе стреляет в ногу. А, во-вторых, коллекции в kotlin так себя ведут по причине идеологии максимальной совместимости с java (для наиболее легкой и прозрачной миграции на новый язык) и при этом насколько это только возможно исправляет его недостатки.
Спасибо за статью. В свое время наткнулся на аналогичную проблему — в моем случае интерес вызвал тест, который успешно проходил в gradle test, но не через idea. Любопытство взяло верх и в итоге я все же нашел в недрах spring-boot плагина нечто аналогичное parent pom, что Вы дали в своем примере.
В итоге стало ясно что нужно либо добавить значение атрибута value/name для аннотаций RequestParam/PathVariable, либо добавить настройку компиляции (-parameters) в idea.
Что касается совета не использовать значение атрибута аннотаций, полагаясь на название локальной переменной — я все же придерживаюсь более традиционного решения (использовать). Во-первых, это работает независимо от настроек компиляции проекта (idea при импорте gradle spring-boot проекта не применяет параметр parameters=true к javac). Во-вторых, локальная переменная (аргумент метода) интуитивно рассматривается как что-то, что можно без последствий переименовать, как private-метод, например. А если по какой-то причине это делать нельзя, желательно либо оставлять пометки в коде вроде комментария, но здесь проще дать значение атрибуту. Либо подстраховываться интеграционным тестом, который этот самый параметр передает (ну тест это само собой must have). В общем, это IMHO конечно.
Здесь скорее речь про математический скаляр как отображение один-к-одному ClientId<->String. И скаляр как одномерная величина в противовес вектору (многомерный). Классические примеры скаляров — числовые и строковые типы.
Имплементация charAt() — это часть имплементации интерфейса CharSequence и именно этот факт дает возможность использовать объект как строку. Конкретно нужен не метод, но реализовать интерфейс частично не выйдет. Если например кидать в реализации charAt() UnsupportedOperationException, то некоторое строковое api будет вылетать, к примеру Pattern.matcher(cliendId).
однородность. В том смысле, что если используются специальные термины — везде используются одни и те же, а не синонимы. Если есть стилистические приемы (например, куски xml-запросов или оформление кодов ошибок) — везде оформлены в одном стиле. Проблема особенно актуальна, когда документацию ведет несколько человек
википедичный стиль изложения. В частности, изложение исключительно от третьего лица.
список изменений, версия документа
если речь идет о каких-либо интеграциях — всегда прилагать пример запросов-ответов или прочих вызовов. Это существенно упрощает понимание текста.
В компании используем asciidoctor + uml (asciidoctor-diagram).
Исходники документации в git, сборка и версионирование средствами gradle (исторически сложилось, т.к. документацию изначально писали программисты; оказалось удобно), до этого был maven.
Сборка в pdf (также есть html, но мы его не используем), каждый файл получает в имени номер версии (во избежание путаницы у получателя).
Из приятных удобняшек — один исходник используется для двух сборок — одна xml-api, другая json (по сути различается примерами запросов-ответов). Используется условный оператор.
Все так, но то речь про String, а собственная реализация CharSequence действительно может делать и view оригинального объекта (если вдруг по каким-то причинам это принципиально в рамках проекта).
Что касается примера в статье в интерфейсе DefaultCharSequence — там идет сначала преобразование в String.
Большой ли смысл держать на одном сервере БД более сотни соединений (не говоря уже о тысячах)? TPS от этого не вырастет, зато накладные ресурсы от переключений контекстов и расхода памяти будут весьма велики (что в форках, что в потоках).
В Motorola RAZR другой глюк еще был. Долго не могли понять, почему приложение не может нормально распарсить HTTP-ответ сервера, хотя на эмуляторе и других устройствах было ок. В итоге решили вывести ответ сервера на экран телефона, а там «HTTP/1.0 200 OK\r\n» и далее по списку, т.е. в потоке все тело ответа вместе с шапкой.
Я видел комментарий выше про antialiasing grayscale, становится по-другому, но сказать чтобы лучше.
Проверил на Mac OS — там действительно шрифт выглядит хорошо.
Судя по всему, важно.
Так оно выглядит на Win7 — не очень приятно.
Шрифт FiraCode_1.102
Если подскажете, как это сделать приятнее на вид, буду признателен.
Решая задачу, лезу сразу в гугл (как правило попадая на stackoverflow) в случаях:
1) я уже знаю ответ на вопрос, просто не помню точной формулировки (например, название параметра/класса/метода)
2) я вообще не знаю, в какую сторону искать, но есть за что зацепиться (например, сообщение об ошибке в слабо знакомой технологии)
3) необходимая срочность решения
В остальных случаях хотя бы полчаса-час решаю задачу самостоятельно (анализ сорцов либы, эксперименты, спеки). Даже получив ответ, иногда все же захожу в гугл — посмотреть чужой опыт и найти нехватающие нюансы. Полученный таким способом ответ намного лучше оседает в памяти, да и ачивка за решение — всегда приятно.
Lombok предусмотрительно добавил функцию "delombok" для тех, кто разочаровался и передумал. Для большинства кейсов это возможно прямо из интерфейса IDEA (для
@ExtensionMethodпока не реализовано).Вариант с AssertJ дает диагностику только ожидаемое значение vs актуальное. Но ведь там нет указания, какой именно метод был вызван (
"SamplePojo::getName"), т.е. AssertJ не резолвит это, а в примере сwhere-выражением для hamcrest это есть.По поводу прокси — да, есть такой вариант, но насколько я понял, это требует дополнительных зависимостей вроде cglib, плюс вызов метода, плюс это скорее всего не работает с final-методами, статическими методами, конструкторами.
Похоже, мы решали одну и ту же проблему (null-safety и диагностика), просто зашли с разных сторон — в моем случае — с hamcrest expression.
Неплохой вариант, но, к сожалению не работает начиная с Java 9. Развернутый комментарий написал в статье
Javadoc на
List.addясно говорит:Что касается kotlin, то, во-первых, в примере делается небезопасное приведение типов, поэтому автор сам себе стреляет в ногу. А, во-вторых, коллекции в kotlin так себя ведут по причине идеологии максимальной совместимости с java (для наиболее легкой и прозрачной миграции на новый язык) и при этом насколько это только возможно исправляет его недостатки.
Спасибо за статью. В свое время наткнулся на аналогичную проблему — в моем случае интерес вызвал тест, который успешно проходил в gradle test, но не через idea. Любопытство взяло верх и в итоге я все же нашел в недрах spring-boot плагина нечто аналогичное parent pom, что Вы дали в своем примере.
В итоге стало ясно что нужно либо добавить значение атрибута
value/nameдля аннотацийRequestParam/PathVariable, либо добавить настройку компиляции (-parameters) в idea.Что касается совета не использовать значение атрибута аннотаций, полагаясь на название локальной переменной — я все же придерживаюсь более традиционного решения (использовать). Во-первых, это работает независимо от настроек компиляции проекта (idea при импорте gradle spring-boot проекта не применяет параметр
parameters=trueк javac). Во-вторых, локальная переменная (аргумент метода) интуитивно рассматривается как что-то, что можно без последствий переименовать, как private-метод, например. А если по какой-то причине это делать нельзя, желательно либо оставлять пометки в коде вроде комментария, но здесь проще дать значение атрибуту. Либо подстраховываться интеграционным тестом, который этот самый параметр передает (ну тест это само собой must have). В общем, это IMHO конечно.Я бы с удовольствием взял и собственный интерфейс, но ведь стандартная библиотека java и spring-jdbc ничего про них не знают.
Здесь скорее речь про математический скаляр как отображение один-к-одному ClientId<->String. И скаляр как одномерная величина в противовес вектору (многомерный). Классические примеры скаляров — числовые и строковые типы.
Имплементация charAt() — это часть имплементации интерфейса CharSequence и именно этот факт дает возможность использовать объект как строку. Конкретно нужен не метод, но реализовать интерфейс частично не выйдет. Если например кидать в реализации charAt() UnsupportedOperationException, то некоторое строковое api будет вылетать, к примеру Pattern.matcher(cliendId).
Можно добавить:
В компании используем asciidoctor + uml (asciidoctor-diagram).
Исходники документации в git, сборка и версионирование средствами gradle (исторически сложилось, т.к. документацию изначально писали программисты; оказалось удобно), до этого был maven.
Сборка в pdf (также есть html, но мы его не используем), каждый файл получает в имени номер версии (во избежание путаницы у получателя).
Из приятных удобняшек — один исходник используется для двух сборок — одна xml-api, другая json (по сути различается примерами запросов-ответов). Используется условный оператор.
Все так, но то речь про String, а собственная реализация CharSequence действительно может делать и view оригинального объекта (если вдруг по каким-то причинам это принципиально в рамках проекта).
Что касается примера в статье в интерфейсе DefaultCharSequence — там идет сначала преобразование в String.
Большой ли смысл держать на одном сервере БД более сотни соединений (не говоря уже о тысячах)? TPS от этого не вырастет, зато накладные ресурсы от переключений контекстов и расхода памяти будут весьма велики (что в форках, что в потоках).
soft reset последнего коммита с выводом статуса
Проверил на Mac OS — там действительно шрифт выглядит хорошо.
Так оно выглядит на Win7 — не очень приятно.
Шрифт FiraCode_1.102
Если подскажете, как это сделать приятнее на вид, буду признателен.
1) я уже знаю ответ на вопрос, просто не помню точной формулировки (например, название параметра/класса/метода)
2) я вообще не знаю, в какую сторону искать, но есть за что зацепиться (например, сообщение об ошибке в слабо знакомой технологии)
3) необходимая срочность решения
В остальных случаях хотя бы полчаса-час решаю задачу самостоятельно (анализ сорцов либы, эксперименты, спеки). Даже получив ответ, иногда все же захожу в гугл — посмотреть чужой опыт и найти нехватающие нюансы. Полученный таким способом ответ намного лучше оседает в памяти, да и ачивка за решение — всегда приятно.