Telegram Web Link
Чем анонимный внутренний класс отличается от лямбды?

Лямбда-выражение имеет более легковесный синтаксис. Не нужно явно указывать тип функционального интерфейса, который лямбда реализует – он автоматически выведется из контекста. Лямбда-выражения добавлены в язык в первую очередь как синтаксический сахар.

С другой стороны, у класса есть поля. Экземпляр анонимного класса сохраняет свое состояние между вызовами, и меняет его при необходимости. Для лямбды доступен лишь захват и effectively final использование внешних переменных.

Лямбдой реализуется только функциональный интерфейс. Функциональный интерфейс – это тип с единственным абстрактным методом. Анонимным классом же можно расширить любой расширяемый класс или реализовать интерфейс с любым количеством абстрактных методов.

Анонимный класс создает новый скоуп, лямбда работает в текущем. Это значит, что объявление переменной с именем, которое уже используется снаружи, в лямбде вызовет ошибку компиляции «variable is already defined», в анонимном классе скроет (shadowing) внешнюю переменную.

С точки зрения реализации JVM, для лямбды не создается дополнительного .class файла, как это происходит для анонимного класса. Соответственно, не происходит и обычной загрузки и верификации класса. Вместо этого используется механизм invokedynamic и класс генерируется на лету с помощью LambdaMetafactory. Так что лямбда-выражения обычно работают быстрее. Внутренности реализации подробно разобраны например в этой статье.

@javatg
#вопросы_с_собеседований
Что такое BeanPostProcessor и чем он отличается от BeanFactoryPostProcessor?

Spring использует несколько BeanPostProcessor’ов.
Например, CommonAnnotationPostProcessor или AutowiredAnnotationBeanPostProcessor.
BPP работает с экземплярами бинов, т.е. контейнер создает бин, а затем начинает работать BPP.
ТОП-25 трюков, советов и лучших практик программирования на Java

Подборка лучших практик программирования на Java для экономии времени, оптимизации и улучшения качества кода.

https://proglib.io/p/25-java-tricks

@javatg
#вопросы_с_собеседований
Назовите исключения, создаваемые классами Spring DAO.

На диаграмме изображены все классы Spring DAO в иерархическом порядке.
Как использовать Spring Boot для приложений командной строки?

Как и любая другая программа 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 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
#вопросы_с_собеседований
Есть ли способ ограничить элементы, к которым можно применить аннотацию?

Да
, для этой цели можно использовать аннотацию @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
Как работает инъекция прототипа в синглтон?

Раньше мы уже рассматривали различия скоупов 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
Media is too big
VIEW IN TELEGRAM
Техническое интервью Java Developer

Интервью состоит из 14 видео доступных на youtube

@javatg
Производительность: нюансы против очевидностей. JDK edition

Привет, это продолжение статьи, в которой я разбирал разные неочевидные вещи из мира производительности. В этот раз будем копать ещё глубже, хоть и начнём с относительно простых примеров. И да, в этой статье будет много интересного про строки. Да, несмотря на "Катехизис java.lang.String", "The Lord of the Strings: Two Scours" и пары моих статей (раз, два, три) там всё ещё есть куда копать :)

Читать дальше

@javatg
LanguageTool – программное обеспечение для поиска ошибок в тексте с открытым исходным кодом. Работает для английского, французского, немецкого, польского, русского и более чем 20 других языков.

Находит ошибки, которые простые программы проверки орфографии не могут обнаружить.

#GitHub | #Java

@javatg
Какой результат выведет следующая программа?
Anonymous Quiz
25%
0
6%
200
51%
100
18%
Compiler Error
🔥 Собери свою идеальную Java. 5 полезных библиотек

Рассмотрим несколько библиотек для Java, которые помогут сделать код лаконичнее, а его написание более приятным и быстрым.

Читать дальше

@javatg
2024/10/04 05:32:28
Back to Top
HTML Embed Code: