Что будет результатом фрагмента кода?
Anonymous Quiz
72%
JPA выполнит SELECT * FROM Employee WHERE email = ?
12%
JPA выбросит NoSuchMethodException, т.к. findByEmail не определен
5%
БД не сможет найти запись, если email не является primary key
6%
Запрос выполнится, но результат всегда будет пустым
5%
JPA сначала загрузит всех сотрудников в память, а затем отфильтрует
👍5🔥2👌2
Какой порядок инициализации верный?
Anonymous Quiz
35%
Статические блоки при 1 обращении к классу - нестатические блоки перед каждым вызовом конструктора
5%
Конструктор всегда выполняется раньше всех блоков инициализации
3%
Порядок иниуиализации зависит от JVM и может меняться от запуска к запуску
2%
Нестатические блоки инициализации - статические - конструктор
55%
Статические блоки инициализации -> конструктор -> нестатические блоки
👍6🔥4
REST или GraphQL? Этот выбор может определить, насколько удобным, быстрым и масштабируемым будет ваш API.
26 августа в 20:00 на открытом уроке мы разберём, когда стоит выбрать REST, а когда — GraphQL, а также реализуем оба подхода в Spring Boot. Эксперт покажет критерии выбора, разберёт практические кейсы и типичные ошибки.
Backend-разработчики на Java/Kotlin и тимлиды узнают, как применять эти технологии на практике, чтобы их проекты работали быстрее, были проще в сопровождении и готовыми к росту.
Вебинар проходит в преддверие старта курса «Разработчик на Spring Framework».
Регистрируйтесь сейчас и получите скидку на обучение: https://vk.cc/cON5w2
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
26 августа в 20:00 на открытом уроке мы разберём, когда стоит выбрать REST, а когда — GraphQL, а также реализуем оба подхода в Spring Boot. Эксперт покажет критерии выбора, разберёт практические кейсы и типичные ошибки.
Backend-разработчики на Java/Kotlin и тимлиды узнают, как применять эти технологии на практике, чтобы их проекты работали быстрее, были проще в сопровождении и готовыми к росту.
Вебинар проходит в преддверие старта курса «Разработчик на Spring Framework».
Регистрируйтесь сейчас и получите скидку на обучение: https://vk.cc/cON5w2
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
❤2👍2🔥2
Может ли имя класса не совпадать с именем файла?
Компилятор требует, чтобы в .java файле был не больше чем один публичный класс верхнего уровня, и чтобы его название совпадало с названием файла. Все специальные символы также должны быть в имени файла.
Protected и private классов верхнего уровня не бывает в принципе, а вот на package-protected это ограничение не распространяется. Это значит, что класс без модификатора доступа может иметь любое имя. Также это значит, что рядом с основным публичным классом файла (или вместо него) можно объявить любое количество других классов без модификатора доступа, с произвольными именами. Они будут доступны внутри всего пакета.
Так что ответ – может.
Java Guru🤓 #java
Компилятор требует, чтобы в .java файле был не больше чем один публичный класс верхнего уровня, и чтобы его название совпадало с названием файла. Все специальные символы также должны быть в имени файла.
Protected и private классов верхнего уровня не бывает в принципе, а вот на package-protected это ограничение не распространяется. Это значит, что класс без модификатора доступа может иметь любое имя. Также это значит, что рядом с основным публичным классом файла (или вместо него) можно объявить любое количество других классов без модификатора доступа, с произвольными именами. Они будут доступны внутри всего пакета.
Так что ответ – может.
Java Guru🤓 #java
👍10🔥5❤1
Как сравнивать элементы перечисления?
Элементы enum-а компилируются в статические константы-экземпляры его класса. Экземпляры гарантированно синглтоны. Это значит, для их сравнения безопасно использовать ==, даже после десериализации и в многопоточной среде.
Скомпилированный класс неявно наследуется от java.lang.Enum, в котором все методы из Object кроме toString объявлены финальными. В частности, невозможно изменить поведение метода equals – он сравнивает enum-ы с помощью ==. Так что equals тоже можно использовать без опаски.
Но помимо этого есть несколько отличий в пользу ==:
1. == не выбросит NullPointerException. Прежде чем вызывать equals у переменной, придется удостовериться что она не null.
2. == не позволит сравнить объекты разных типов. Оператор еще на этапе компиляции подскажет, что такое сравнение не имеет смысла. equals же будет принимать аргумент под типом Object, и всегда возвращать false уже в рантайме.
3. == быстрее. Скорее всего разница в производительности будет незаметной, но тем не менее, оператор не требует лишнего вызова метода.
Java Guru🤓 #java
Элементы enum-а компилируются в статические константы-экземпляры его класса. Экземпляры гарантированно синглтоны. Это значит, для их сравнения безопасно использовать ==, даже после десериализации и в многопоточной среде.
Скомпилированный класс неявно наследуется от java.lang.Enum, в котором все методы из Object кроме toString объявлены финальными. В частности, невозможно изменить поведение метода equals – он сравнивает enum-ы с помощью ==. Так что equals тоже можно использовать без опаски.
Но помимо этого есть несколько отличий в пользу ==:
1. == не выбросит NullPointerException. Прежде чем вызывать equals у переменной, придется удостовериться что она не null.
2. == не позволит сравнить объекты разных типов. Оператор еще на этапе компиляции подскажет, что такое сравнение не имеет смысла. equals же будет принимать аргумент под типом Object, и всегда возвращать false уже в рантайме.
3. == быстрее. Скорее всего разница в производительности будет незаметной, но тем не менее, оператор не требует лишнего вызова метода.
Java Guru🤓 #java
👍8🔥6❤1
🤖 AI заменит разработчиков?
Этот вопрос звучит как кликбейт. Но когда смотришь на то, что делает Explyt Agent, начинаешь думать иначе.
Этот AI не просто подсказывает код, а реально:
• редактирует файлы в проекте
• запускает тесты и отлавливает ошибки
• выполняет команды в терминале
• анализирует проект и добавляет недостающие файлы
Фактически, он ведет себя как джун, которому ты говоришь: «вот таска, сделай». А ты только проверяешь результат.
Попробуйте, как устроен этот агент и что он умеет🚀
Этот вопрос звучит как кликбейт. Но когда смотришь на то, что делает Explyt Agent, начинаешь думать иначе.
Этот AI не просто подсказывает код, а реально:
• редактирует файлы в проекте
• запускает тесты и отлавливает ошибки
• выполняет команды в терминале
• анализирует проект и добавляет недостающие файлы
Фактически, он ведет себя как джун, которому ты говоришь: «вот таска, сделай». А ты только проверяешь результат.
Попробуйте, как устроен этот агент и что он умеет🚀
🥴7👍3🔥3
Что будет выведено на экран?
Anonymous Quiz
2%
RuntimeException
81%
Child
4%
Ошибка компиляции
11%
Parent
3%
Parent Child
👍6🔥5
🔗 Секреты межсервисных запросов: как сделать приложение быстрым и надёжным
📅 25 августа | 20:00 мск | бесплатно
На вебинаре разберём:
• Почему “просто вызвать другой сервис” не работает
• Как избежать каскадных задержек и повысить отказоустойчивость
• API Gateway, агрегаторы, GraphQL — когда стоит применять
• CQRS: разделение команд и запросов для масштабирования и оптимизации
💡Полезно для:
• Разработчиков и архитекторов ПО
• DevOps-инженеров
• Техлидов
✅После вебинара вы сможете:
• Проектировать устойчивые и быстрые межсервисные запросы
• Централизовать и агрегировать API без превращения в монолит
• Применять CQRS для оптимизации работы системы
👉 Регистрируйтесь:
https://vk.cc/cOPlJu
Занятие приурочено к старту курса "Software Architect", обучение на котором позволит освоить компетенции архитектора по моделированию и построению отказоустойчивых, масштабируемых информационных систем.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
📅 25 августа | 20:00 мск | бесплатно
На вебинаре разберём:
• Почему “просто вызвать другой сервис” не работает
• Как избежать каскадных задержек и повысить отказоустойчивость
• API Gateway, агрегаторы, GraphQL — когда стоит применять
• CQRS: разделение команд и запросов для масштабирования и оптимизации
💡Полезно для:
• Разработчиков и архитекторов ПО
• DevOps-инженеров
• Техлидов
✅После вебинара вы сможете:
• Проектировать устойчивые и быстрые межсервисные запросы
• Централизовать и агрегировать API без превращения в монолит
• Применять CQRS для оптимизации работы системы
👉 Регистрируйтесь:
https://vk.cc/cOPlJu
Занятие приурочено к старту курса "Software Architect", обучение на котором позволит освоить компетенции архитектора по моделированию и построению отказоустойчивых, масштабируемых информационных систем.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
👍2🔥2❤1
Что будет результатом инжекта бина А?
Anonymous Quiz
18%
Выведутся сообщения: Ainitialized B initialized
7%
Приложение запустится, но "а" в В останется null.
47%
BeanCurrentlyInCreationException
5%
Будет создан только бин А
23%
Ошибка компиляции
👍5🔥4😢1
Какие бывают проблемы с арифметикой в Java?
Переполнения.
Числа примитивных типов в Java хранятся в дискретной оперативной памяти компьютера и занимают фиксированный объем. Из этого вытекает ограничение диапазона возможных значений. Когда результат арифметической операции выпадает из диапазона, значение идет по кругу – максимальное становится минимальным, либо наоборот. Такая ситуация называется переполнение (underflow/overflow).
Решение: если опасность переполнения значима, помогут методы с суффиксом *Exact из классе Math. Это безопасные аналоги арифметических операций, которые бросают исключение в случае переполнения.
Платформо-зависимые округления.
По умолчанию JVM производит арифметические вычисления насколько это возможно точно. Пределы точности могут зависеть от аппаратного обеспечения. Это неприемлемо для программ, к которым предъявляют строгие требования переносимости, когда результат вычислений должен быть одним и тем же на любом железе.
Решение: модификатор strictfp в объявлении класса или метода приводит точность вычислений к единой спецификации IEEE 754. За это может ухудшиться производительность и уменьшиться точность значений.
ArithmeticException.
Операторы могут выбрасывать исключение. Это происходит, например, при делении на ноль. Это же исключение бросают безопасные методы из Math.
Решение: неожиданное исключение обычно указывает на логическую ошибку. Лучший способ предотвратить логические ошибки – покрыть код Unit-тестами.
Java Guru🤓 #java
Переполнения.
Числа примитивных типов в Java хранятся в дискретной оперативной памяти компьютера и занимают фиксированный объем. Из этого вытекает ограничение диапазона возможных значений. Когда результат арифметической операции выпадает из диапазона, значение идет по кругу – максимальное становится минимальным, либо наоборот. Такая ситуация называется переполнение (underflow/overflow).
Решение: если опасность переполнения значима, помогут методы с суффиксом *Exact из классе Math. Это безопасные аналоги арифметических операций, которые бросают исключение в случае переполнения.
Платформо-зависимые округления.
По умолчанию JVM производит арифметические вычисления насколько это возможно точно. Пределы точности могут зависеть от аппаратного обеспечения. Это неприемлемо для программ, к которым предъявляют строгие требования переносимости, когда результат вычислений должен быть одним и тем же на любом железе.
Решение: модификатор strictfp в объявлении класса или метода приводит точность вычислений к единой спецификации IEEE 754. За это может ухудшиться производительность и уменьшиться точность значений.
ArithmeticException.
Операторы могут выбрасывать исключение. Это происходит, например, при делении на ноль. Это же исключение бросают безопасные методы из Math.
Решение: неожиданное исключение обычно указывает на логическую ошибку. Лучший способ предотвратить логические ошибки – покрыть код Unit-тестами.
Java Guru🤓 #java
🔥12👍5
Что будет результатом кода?
Anonymous Quiz
55%
{"username":"john_doe","email":" [email protected] "}
22%
{"username":"john_doe"}
8%
{"username":"john_doe","email":null}
8%
Ошибка компиляции
7%
RuntimeException
👍9🔥1
Отличаются ли сокращенные и обычные операторы?
Java предлагает программисту сокращенную запись для применения операции с сохранением ответа в операнд. Это например +=, &=, и другие. Их правильное название – операторы сложного присваивания (compound assignment). Сокращенные версии есть для всех арифметических и битовых операторов.
У таких сокращений есть одно неочевидное отличие от полных версий. Если прочитать спецификацию, там сказано, что x += y – это на самом деле сокращение от x = (XType)(x + y). То есть, кроме самой операции происходит приведение результата к типу левого операнда.
Незнание этой особенности может привести к ошибочно успешной компиляции, и неожиданным результатам работы кода (как в примере на изображении).
Java Guru🤓 #java
Java предлагает программисту сокращенную запись для применения операции с сохранением ответа в операнд. Это например +=, &=, и другие. Их правильное название – операторы сложного присваивания (compound assignment). Сокращенные версии есть для всех арифметических и битовых операторов.
У таких сокращений есть одно неочевидное отличие от полных версий. Если прочитать спецификацию, там сказано, что x += y – это на самом деле сокращение от x = (XType)(x + y). То есть, кроме самой операции происходит приведение результата к типу левого операнда.
Незнание этой особенности может привести к ошибочно успешной компиляции, и неожиданным результатам работы кода (как в примере на изображении).
Java Guru🤓 #java
👍11🔥7❤3
Лишает ли var строгой типизации?
Ключевое слово var появилось в Java 10. Указание var вместо типа локальной переменной применяет к ней механизм вывода типов (type inference). Тип будет вычислен на этапе компиляции из того, чем переменная инициализируется.
Отсюда несколько выводов. Во-первых, нельзя использовать var в полях класса, параметрах метода, и где-либо еще кроме локальных переменных. Во-вторых, обязана быть инициализация с понятным типом – варианты var x; или var x = null; не скомпилируются.
И главное следствие – к концу компиляции у таких переменных фиксированный и известный тип, который не может быть изменен позднее. А это и есть определение строгой типизации.
Ответ: нет, выводимый тип – строгий. Более того, типизация остается статической.
Главное упущение – в инициализации разрешено использовать diamond operator. В обычных обстоятельствах в нём выведется правильный generic-тип, но в случае var информации недостаточно, и типом-параметром будет Object.
Java Guru🤓 #java
Ключевое слово var появилось в Java 10. Указание var вместо типа локальной переменной применяет к ней механизм вывода типов (type inference). Тип будет вычислен на этапе компиляции из того, чем переменная инициализируется.
Отсюда несколько выводов. Во-первых, нельзя использовать var в полях класса, параметрах метода, и где-либо еще кроме локальных переменных. Во-вторых, обязана быть инициализация с понятным типом – варианты var x; или var x = null; не скомпилируются.
И главное следствие – к концу компиляции у таких переменных фиксированный и известный тип, который не может быть изменен позднее. А это и есть определение строгой типизации.
Ответ: нет, выводимый тип – строгий. Более того, типизация остается статической.
Главное упущение – в инициализации разрешено использовать diamond operator. В обычных обстоятельствах в нём выведется правильный generic-тип, но в случае var информации недостаточно, и типом-параметром будет Object.
Java Guru🤓 #java
👍6🔥3❤1
🐇 RabbitMQ vs Kafka: что выбрать?
📅 27 августа | 20:00 мск | бесплатно
🎓На вебинаре разберём:
• Различия и области применения RabbitMQ и Kafka
• Как брокеры обеспечивают отказоустойчивость
• Гарантированная доставка и минимизация потерь данных
💡Кому будет полезно:
• Backend и FullStack разработчикам
• DevOps-инженерам
• Системным архитекторам
✅ После вебинара вы сможете:
• Понимать, когда использовать RabbitMQ, а когда — Kafka
• Организовывать стабильную и безопасную обработку сообщений
💥 Регистрируйтесь и прокачайте скилл работы с брокерами сообщений:
https://vk.cc/cOVbMw
Занятие приурочено к старту курса «Архитектура и шаблоны проектирования», где вы глубже освоите DDD, CQRS, Event Storming и другие архитектурные практики.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
📅 27 августа | 20:00 мск | бесплатно
🎓На вебинаре разберём:
• Различия и области применения RabbitMQ и Kafka
• Как брокеры обеспечивают отказоустойчивость
• Гарантированная доставка и минимизация потерь данных
💡Кому будет полезно:
• Backend и FullStack разработчикам
• DevOps-инженерам
• Системным архитекторам
✅ После вебинара вы сможете:
• Понимать, когда использовать RabbitMQ, а когда — Kafka
• Организовывать стабильную и безопасную обработку сообщений
💥 Регистрируйтесь и прокачайте скилл работы с брокерами сообщений:
https://vk.cc/cOVbMw
Занятие приурочено к старту курса «Архитектура и шаблоны проектирования», где вы глубже освоите DDD, CQRS, Event Storming и другие архитектурные практики.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
❤3👍2🔥2
Что лучше, ArrayList или LinkedList?
Самый избитый вопрос. Проверяет знание особенностей реализации (кишки ArrayList, кишки LinkedList) и эффективности операций в этих разных реализациях. В вопрос иногда добавляют Vector – пересинхронизированный и устаревший вариант ArrayList, который лучше заменить Collections.synchronizedList().
ArrayList хранит данные в массиве, LinkedList в двусвязном списке. Из этого вытекает разница в эффективности разных операций: ArrayList лучше справляется с изменениями в середине и ростом в пределах capacity, LinkedList – на краях. В целом обычно ArrayList лучше.
Стоит добавить, что для работы на краях лучше использовать реализации специально для этого спроектированного интерфейса Deque: например реализующую кольцевой буфер ArrayDeque.
Java Guru🤓 #java
Самый избитый вопрос. Проверяет знание особенностей реализации (кишки ArrayList, кишки LinkedList) и эффективности операций в этих разных реализациях. В вопрос иногда добавляют Vector – пересинхронизированный и устаревший вариант ArrayList, который лучше заменить Collections.synchronizedList().
ArrayList хранит данные в массиве, LinkedList в двусвязном списке. Из этого вытекает разница в эффективности разных операций: ArrayList лучше справляется с изменениями в середине и ростом в пределах capacity, LinkedList – на краях. В целом обычно ArrayList лучше.
Стоит добавить, что для работы на краях лучше использовать реализации специально для этого спроектированного интерфейса Deque: например реализующую кольцевой буфер ArrayDeque.
Java Guru🤓 #java
👍9🔥4
Как удалить элемент из ArrayList при итерации?
Обычно формулируется в виде задачи на внимательность «что здесь не так», например
Подвох в том, что итератор ArrayList, который используется в таком варианте цикла for, является fail-fast, то есть не поддерживает итерацию с параллельной модификацией. А параллельная модификация случается даже в одном потоке, что демонстрирует этот пример. Следующий шаг итератора после удаления элемента выбросит ConcurrentModificationException.
Не исключение, но неожиданный результат получится если пользоваться не итератором, а обычным циклом for – при каждом удалении нумерация элементов будет сдвигаться.
Единственный способ удалить элемент из коллекции при обходе, не получив при этом ConcurrentModificationException или неопределенное поведение – удалить с помощью remove() того же инстанса итератора. Вариант ListIterator поможет, если в теле цикла требуется и работа с индексами.
Некоторые коллекции, такие как CopyOnWriteArrayList и ConcurrentHashMap адаптированные под многопоточную среду и имеют fail-safe итераторы.
Java Guru🤓 #java
Обычно формулируется в виде задачи на внимательность «что здесь не так», например
for (String item : arrayList)
if (item.length() > 2)
arrayList.remove(item);
Подвох в том, что итератор ArrayList, который используется в таком варианте цикла for, является fail-fast, то есть не поддерживает итерацию с параллельной модификацией. А параллельная модификация случается даже в одном потоке, что демонстрирует этот пример. Следующий шаг итератора после удаления элемента выбросит ConcurrentModificationException.
Не исключение, но неожиданный результат получится если пользоваться не итератором, а обычным циклом for – при каждом удалении нумерация элементов будет сдвигаться.
Единственный способ удалить элемент из коллекции при обходе, не получив при этом ConcurrentModificationException или неопределенное поведение – удалить с помощью remove() того же инстанса итератора. Вариант ListIterator поможет, если в теле цикла требуется и работа с индексами.
Некоторые коллекции, такие как CopyOnWriteArrayList и ConcurrentHashMap адаптированные под многопоточную среду и имеют fail-safe итераторы.
Java Guru🤓 #java
👍8❤4🔥4
Как создать идеальную внутреннюю платформу для разработчиков:
опыт MWS Cloud Platform⬜️
В новой статье на Хабре инженер MWS рассказал, как построить эффективную команду Development Platform.
Автор поделился ключевыми принципами, которые помогут:
➡️ Наладить взаимодействие между инфраструктурными и продуктовыми командами
➡️ Минимизировать техдолг
➡️ Создать культуру общего кода
⏩️ Читать статью
опыт MWS Cloud Platform
В новой статье на Хабре инженер MWS рассказал, как построить эффективную команду Development Platform.
Автор поделился ключевыми принципами, которые помогут:
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2
Какова структура Java Collections Framework? Почему Map не Collection?
Collection – хранилище отдельных значений, Map – хранилище ключ-значение. Отсюда разные методы этих интерфейсов. Если проще, разные сигнатуры методов put и add.
Collection в свою очередь делится на три основных группы, и соответствующих им интерфейса:
🔘 List – упорядоченные списки с возможностью содержания дубликатов и доступа по индексу (random access);
🔘 Queue – обычно FIFO-коллекции, предполагает добавление/удаление элементов с края. Интерфейс-наследник Deque – двусвязная очередь;
🔘 Set – не обязательно упорядоченный набор уникальных (с точки зрения equals) значений;
HashMap можно привести к виду Collection вызвав например keySet(), entrySet() или values().
Java Guru🤓 #java
Collection – хранилище отдельных значений, Map – хранилище ключ-значение. Отсюда разные методы этих интерфейсов. Если проще, разные сигнатуры методов put и add.
Collection в свою очередь делится на три основных группы, и соответствующих им интерфейса:
HashMap можно привести к виду Collection вызвав например keySet(), entrySet() или values().
Java Guru🤓 #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤4🔥4