Чем анонимный внутренний класс отличается от лямбды?
Лямбда-выражение имеет более легковесный синтаксис. Не нужно явно указывать тип функционального интерфейса, который лямбда реализует – он автоматически выведется из контекста. Лямбда-выражения добавлены в язык в первую очередь как синтаксический сахар.
С другой стороны, у класса есть поля. Экземпляр анонимного класса сохраняет свое состояние между вызовами, и меняет его при необходимости. Для лямбды доступен лишь захват и effectively final использование внешних переменных.
Лямбдой реализуется только функциональный интерфейс. Функциональный интерфейс – это тип с единственным абстрактным методом. Анонимным классом же можно расширить любой расширяемый класс или реализовать интерфейс с любым количеством абстрактных методов.
Анонимный класс создает новый скоуп, лямбда работает в текущем. Это значит, что объявление переменной с именем, которое уже используется снаружи, в лямбде вызовет ошибку компиляции «variable is already defined», в анонимном классе скроет (shadowing) внешнюю переменную.
С точки зрения реализации JVM, для лямбды не создается дополнительного .class файла, как это происходит для анонимного класса. Соответственно, не происходит и обычной загрузки и верификации класса. Вместо этого используется механизм
@javatg
Лямбда-выражение имеет более легковесный синтаксис. Не нужно явно указывать тип функционального интерфейса, который лямбда реализует – он автоматически выведется из контекста. Лямбда-выражения добавлены в язык в первую очередь как синтаксический сахар.
С другой стороны, у класса есть поля. Экземпляр анонимного класса сохраняет свое состояние между вызовами, и меняет его при необходимости. Для лямбды доступен лишь захват и effectively final использование внешних переменных.
Лямбдой реализуется только функциональный интерфейс. Функциональный интерфейс – это тип с единственным абстрактным методом. Анонимным классом же можно расширить любой расширяемый класс или реализовать интерфейс с любым количеством абстрактных методов.
Анонимный класс создает новый скоуп, лямбда работает в текущем. Это значит, что объявление переменной с именем, которое уже используется снаружи, в лямбде вызовет ошибку компиляции «variable is already defined», в анонимном классе скроет (shadowing) внешнюю переменную.
С точки зрения реализации JVM, для лямбды не создается дополнительного .class файла, как это происходит для анонимного класса. Соответственно, не происходит и обычной загрузки и верификации класса. Вместо этого используется механизм
invokedynamic
и класс генерируется на лету с помощью LambdaMetafactory
. Так что лямбда-выражения обычно работают быстрее. Внутренности реализации подробно разобраны например в этой статье.@javatg
#вопросы_с_собеседований
Что такое BeanPostProcessor и чем он отличается от BeanFactoryPostProcessor?
Spring использует несколько BeanPostProcessor’ов.
Например, CommonAnnotationPostProcessor или AutowiredAnnotationBeanPostProcessor.
BPP работает с экземплярами бинов, т.е. контейнер создает бин, а затем начинает работать BPP.
Что такое BeanPostProcessor и чем он отличается от BeanFactoryPostProcessor?
Spring использует несколько BeanPostProcessor’ов.
Например, CommonAnnotationPostProcessor или AutowiredAnnotationBeanPostProcessor.
BPP работает с экземплярами бинов, т.е. контейнер создает бин, а затем начинает работать BPP.
ТОП-25 трюков, советов и лучших практик программирования на Java
Подборка лучших практик программирования на Java для экономии времени, оптимизации и улучшения качества кода.
https://proglib.io/p/25-java-tricks
@javatg
Подборка лучших практик программирования на Java для экономии времени, оптимизации и улучшения качества кода.
https://proglib.io/p/25-java-tricks
@javatg
Библиотека программиста
ТОП-25 трюков, советов и лучших практик программирования на Java
Подборка лучших практик программирования на Java для экономии времени, оптимизации и улучшения качества кода.
#вопросы_с_собеседований
Назовите исключения, создаваемые классами Spring DAO.
На диаграмме изображены все классы Spring DAO в иерархическом порядке.
Назовите исключения, создаваемые классами Spring DAO.
На диаграмме изображены все классы Spring DAO в иерархическом порядке.
Как использовать Spring Boot для приложений командной строки?
Как и любая другая программа Java, приложение командной строки Spring Boot должно иметь метод main.
Этот метод служит точкой входа, которая вызывает метод SpringApplication .run для начальной загрузки приложения.
Затем класс SpringApplication запускает контейнер Spring и автоматически настраивает bean-компоненты. После вызова метода run можно выполнять другие команды, как в обычной программе.
@javatg
Как и любая другая программа Java, приложение командной строки Spring Boot должно иметь метод main.
Этот метод служит точкой входа, которая вызывает метод SpringApplication .run для начальной загрузки приложения.
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class);
// наш код
}
}
Затем класс SpringApplication запускает контейнер Spring и автоматически настраивает bean-компоненты. После вызова метода run можно выполнять другие команды, как в обычной программе.
@javatg
Killergram – Модуль Android Xposed для удаления нововведённых рекламных сообщений Telegram разработанный на Java.
Поддерживаемые клиенты:
• Official
• Official
• Official
• NekoX
• Nekogram
• Nanogram
• Plus Messenger
• iMe Messenger
• BGram
• Catogram
• Forkgram
• aka
@javatg | #Java #Telegram
Поддерживаемые клиенты:
• Official
telegram.messenger
• Official
telegram.messenger.web
• Official
telegram.messenger.beta
• NekoX
nekox.messenger
• Nekogram
tw.nekomimi.nekogram
• Nanogram
cool2645.nekolite
• Plus Messenger
telegram.plus
• iMe Messenger
com.iMe.android
• BGram
org.telegram.BifToGram
• Catogram
itaysonlab.messenger
• Forkgram
forkclient.messenger.beta
• aka
org.aka.messenger
@javatg | #Java #Telegram
#вопросы_с_собеседований
Есть ли способ ограничить элементы, к которым можно применить аннотацию?
Да, для этой цели можно использовать аннотацию
Вот пример ограничения использования аннотации
@javatg
Есть ли способ ограничить элементы, к которым можно применить аннотацию?
Да, для этой цели можно использовать аннотацию
@Target
. Если мы попытаемся использовать аннотацию в контексте, где она неприменима, компилятор выдаст ошибку.Вот пример ограничения использования аннотации
@SimpleAnnotation
только объявлениями полей:@Target(ElementType.FIELD)
public @interface SimpleAnnotation {
// ...
}
Мы можем передать несколько констант, если хотим сделать их применимыми в большем количестве контекстов:@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PACKAGE })
Мы даже можем сделать аннотацию, чтобы ее нельзя было использовать для аннотирования чего-либо. Это может пригодиться, когда объявленные типы предназначены исключительно для использования в качестве типа-члена в сложных аннотациях:@Target({})
public @interface NoTargetAnnotation {
// ...
}
@javatg
Какие встроенные серверы поддерживает Spring Boot?
Spring MVC поддерживает Tomcat, Jetty и Undertow. Tomcat — это сервер приложений по умолчанию, поддерживаемый веб-стартером Spring Boot.
Spring WebFlux поддерживает Reactor Netty, Tomcat, Jetty и Undertow с Reactor Netty по умолчанию.
В Spring MVC, чтобы изменить значение по умолчанию, скажем, на Jetty, нам нужно исключить Tomcat и включить Jetty в зависимости (код на картинке). Точно так же, чтобы изменить значение по умолчанию в WebFlux на UnderTow, нам нужно исключить Reactor Netty и включить UnderTow в зависимости.
Cтатья содержит более подробную информацию о различных встроенных серверах, которые мы можем использовать с Spring MVC.
#вопросы_с_собеседований
@javatg
Spring MVC поддерживает Tomcat, Jetty и Undertow. Tomcat — это сервер приложений по умолчанию, поддерживаемый веб-стартером Spring Boot.
Spring WebFlux поддерживает Reactor Netty, Tomcat, Jetty и Undertow с Reactor Netty по умолчанию.
В Spring MVC, чтобы изменить значение по умолчанию, скажем, на Jetty, нам нужно исключить Tomcat и включить Jetty в зависимости (код на картинке). Точно так же, чтобы изменить значение по умолчанию в WebFlux на UnderTow, нам нужно исключить Reactor Netty и включить UnderTow в зависимости.
Cтатья содержит более подробную информацию о различных встроенных серверах, которые мы можем использовать с Spring MVC.
#вопросы_с_собеседований
@javatg
Как работает инъекция прототипа в синглтон?
Раньше мы уже рассматривали различия скоупов singleton и prototype в Spring Framework. Допустим ситуацию, когда в singleton-компонент внедряется зависимость со скоупом prototype – когда будет создан её объект?
Если просто добавить к определению бина аннотацию
Примитивный способ получать новый объект при каждом обращении – отказаться от
Воспользоваться автоматическим внедрением зависимостей можно через внедрение метода (паттерн «Команда»). Автовайрится не сам объект, а производящий его метод.
Более красивый декларативный способ – правильно настроить определение бина. В аннотации
Лучший способ разобраться со скоупами – прочитать официальный гайд с иллюстрациями, и поэкспериментировать на практике. Для начала попробуйте пример с изображения ниже.
#Spring
@javatg
Раньше мы уже рассматривали различия скоупов singleton и prototype в Spring Framework. Допустим ситуацию, когда в singleton-компонент внедряется зависимость со скоупом prototype – когда будет создан её объект?
Если просто добавить к определению бина аннотацию
@Scope(SCOPE_PROTOTYPE)
, и использовать этот бин в синглтоне через аннотацию @Autowired
– будет создан только один объект. Потому что синглтон создается только однажды, и обращение к прототипу случится тоже однажды при его создании (при внедрении зависимости).Примитивный способ получать новый объект при каждом обращении – отказаться от
@Autowired
, и доставать его из контекста вручную. Для этого нужно вызывать context.getBean(MyPrototype.class)
.Воспользоваться автоматическим внедрением зависимостей можно через внедрение метода (паттерн «Команда»). Автовайрится не сам объект, а производящий его метод.
Более красивый декларативный способ – правильно настроить определение бина. В аннотации
@Scope
кроме самого scopeName
доступен второй параметр – proxyMode
. По умолчанию его значение NO
– прокси не создается. Но если указать INTERFACES
или TARGET_CLASS
, то под @Autowired
будет внедряться не сам объект, а сгенерированный фреймворком прокси. И когда проксируемый бин имеет скоуп prototype
, то объект внутри прокси будет пересоздаваться при каждом обращении. Лучший способ разобраться со скоупами – прочитать официальный гайд с иллюстрациями, и поэкспериментировать на практике. Для начала попробуйте пример с изображения ниже.
#Spring
@javatg
Регистрация и авторизация в веб-приложении с помощью Spring WebFlux
https://tproger.ru/articles/registracija-i-avtorizacija-na-baze-postgresql-s-pomoshhju-spring-webflux/
@javatg
https://tproger.ru/articles/registracija-i-avtorizacija-na-baze-postgresql-s-pomoshhju-spring-webflux/
@javatg
Tproger
Регистрация и авторизация на PostgreSQL и Spring WebFlux
Подробно описали, как создать регистрацию и авторизацию пользователя при помощи PostgreSQL и Spring WebFlux.
Производительность: нюансы против очевидностей. JDK edition
Привет, это продолжение статьи, в которой я разбирал разные неочевидные вещи из мира производительности. В этот раз будем копать ещё глубже, хоть и начнём с относительно простых примеров. И да, в этой статье будет много интересного про строки. Да, несмотря на "Катехизис java.lang.String", "The Lord of the Strings: Two Scours" и пары моих статей (раз, два, три) там всё ещё есть куда копать :)
Читать дальше
@javatg
Привет, это продолжение статьи, в которой я разбирал разные неочевидные вещи из мира производительности. В этот раз будем копать ещё глубже, хоть и начнём с относительно простых примеров. И да, в этой статье будет много интересного про строки. Да, несмотря на "Катехизис java.lang.String", "The Lord of the Strings: Two Scours" и пары моих статей (раз, два, три) там всё ещё есть куда копать :)
Читать дальше
@javatg
LanguageTool – программное обеспечение для поиска ошибок в тексте с открытым исходным кодом. Работает для английского, французского, немецкого, польского, русского и более чем 20 других языков.
Находит ошибки, которые простые программы проверки орфографии не могут обнаружить.
#GitHub | #Java
@javatg
Находит ошибки, которые простые программы проверки орфографии не могут обнаружить.
#GitHub | #Java
@javatg
GitHub
GitHub - languagetool-org/languagetool: Style and Grammar Checker for 25+ Languages
Style and Grammar Checker for 25+ Languages. Contribute to languagetool-org/languagetool development by creating an account on GitHub.
Скомпилируется ли программа?
Anonymous Quiz
12%
Да, выведет false
9%
Да, выведет true
35%
Да, но ничего не произойдет
45%
Нет
🔥 Собери свою идеальную Java. 5 полезных библиотек
Рассмотрим несколько библиотек для Java, которые помогут сделать код лаконичнее, а его написание более приятным и быстрым.
Читать дальше
@javatg
Рассмотрим несколько библиотек для Java, которые помогут сделать код лаконичнее, а его написание более приятным и быстрым.
Читать дальше
@javatg
☕ Учебник по Java: списочный массив ArrayList
https://proglib.io/p/uchebnik-po-java-spisochnyy-massiv-arraylist-2022-07-24
https://proglib.io/p/uchebnik-po-java-spisochnyy-massiv-arraylist-2022-07-24
Библиотека программиста
☕ Учебник по Java: списочный массив ArrayList
В продолжении серии постов о языке программировании Java поговорим об ArrayList. Для чего он нужен и как его использовать.