Java: Короткая задача
Задача:
Что выведет программа и почему?
Разбор:
Блок finally всегда выполняется, даже если есть return в try.
Когда JVM встречает return 1;, она сохраняет значение для возврата.
Затем выполняет finally.
В finally есть новый return 2; — он перезаписывает сохранённый результат.
👉 Поэтому вернётся 2, а не 1.
Полезно знать:
Такое поведение часто ломает логику при работе с ресурсами - finally может изменить или "затереть" возвращаемое значение.
Лучше не использовать return внутри finally вообще.
Задача:
Что выведет программа и почему?
public class Tricky {
public static void main(String[] args) {
System.out.println(getValue());
}
static int getValue() {
try {
return 1;
} finally {
return 2;
}
}
}
Разбор:
Блок finally всегда выполняется, даже если есть return в try.
Когда JVM встречает return 1;, она сохраняет значение для возврата.
Затем выполняет finally.
В finally есть новый return 2; — он перезаписывает сохранённый результат.
👉 Поэтому вернётся 2, а не 1.
Полезно знать:
Такое поведение часто ломает логику при работе с ресурсами - finally может изменить или "затереть" возвращаемое значение.
Лучше не использовать return внутри finally вообще.
👍19🤔5❤4
# Хитрая задачка на Java: не то, чем кажется
Внимательно изучите следующий код:
Вопрос:
Что напечатает эта программа? Обоснуйте каждый вывод, опираясь на спецификацию Java и особенности работы с пулом строк, кэшированием обёрток и автоупаковкой.
Внимательно изучите следующий код:
public class WhatTheJava {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
String s4 = new String("hello").intern();
System.out.println(s1 == s2); // (1)
System.out.println(s1 == s3); // (2)
System.out.println(s1 == s4); // (3)
System.out.println(s3 == s4); // (4)
Integer i1 = 1000;
Integer i2 = 1000;
Integer i3 = 100;
Integer i4 = 100;
System.out.println(i1 == i2); // (5)
System.out.println(i3 == i4); // (6)
Boolean b1 = true;
Boolean b2 = true;
Boolean b3 = Boolean.valueOf("true");
Boolean b4 = new Boolean(true);
System.out.println(b1 == b2); // (7)
System.out.println(b1 == b3); // (8)
System.out.println(b1 == b4); // (9)
}
}
Вопрос:
Что напечатает эта программа? Обоснуйте каждый вывод, опираясь на спецификацию Java и особенности работы с пулом строк, кэшированием обёрток и автоупаковкой.
❤6
❓Что выведет код на изображении выше?
Anonymous Quiz
40%
Static Main
19%
Instance Static Main
3%
Instance Main
16%
Main
22%
Ошибка компиляции
🔥1
⚡️ Java лайфхак: не убивай производительность боксингом
Многие даже не замечают, как теряют скорость из-за автoboxing в Stream API.
❌ Плохо (создаются объекты Integer):
Stream<Integer> boxed = Stream.of(1, 2, 3, 4, 5);
int sum = boxed.reduce(0, Integer::sum);
Каждое число → объект → лишняя память + нагрузка на GC
✅ Хорошо (работа с примитивами):
int sum = IntStream.of(1, 2, 3, 4, 5).sum();
Без лишних объектов. Быстрее. Чище.
Запомни:
- IntStream → для int
- LongStream → для long
- DoubleStream → для double
Если работаешь с числами — всегда используй primitive streams.
Это мелочь, которая на больших данных превращается в реальную экономию ресурсов.
Сохрани, чтобы не писать медленный код.
Многие даже не замечают, как теряют скорость из-за автoboxing в Stream API.
❌ Плохо (создаются объекты Integer):
Stream<Integer> boxed = Stream.of(1, 2, 3, 4, 5);
int sum = boxed.reduce(0, Integer::sum);
Каждое число → объект → лишняя память + нагрузка на GC
✅ Хорошо (работа с примитивами):
int sum = IntStream.of(1, 2, 3, 4, 5).sum();
Без лишних объектов. Быстрее. Чище.
Запомни:
- IntStream → для int
- LongStream → для long
- DoubleStream → для double
Если работаешь с числами — всегда используй primitive streams.
Это мелочь, которая на больших данных превращается в реальную экономию ресурсов.
Сохрани, чтобы не писать медленный код.
🔥8👍3❤1
⚡️ Перестаём писать методы с 7+ параметрами
Если сигнатура выглядит как:
Это уже сигнал, что модель данных развалилась.
Проблема не только в читаемости.
Такие методы сложнее поддерживать, расширять и тестировать. Любое изменение ломает сигнатуру и тянет за собой каскад правок.
Нормальный вариант - собрать связанные данные в объект:
Получаем:
- чище API
- проще добавлять поля
- меньше ошибок при передаче параметров
- код начинает отражать доменную модель, а не список строк
Это базовый приём, но именно на нём чаще всего экономят, а потом платят сложностью.
Если сигнатура выглядит как:
createUser(firstName, lastName, email, phone, address, city, country)
Это уже сигнал, что модель данных развалилась.
Проблема не только в читаемости.
Такие методы сложнее поддерживать, расширять и тестировать. Любое изменение ломает сигнатуру и тянет за собой каскад правок.
Нормальный вариант - собрать связанные данные в объект:
UserInfo userInfoПолучаем:
- чище API
- проще добавлять поля
- меньше ошибок при передаче параметров
- код начинает отражать доменную модель, а не список строк
Это базовый приём, но именно на нём чаще всего экономят, а потом платят сложностью.
👍7❤3
Каким будет результат выполнения кода?
Anonymous Quiz
20%
A is equal to NaN
35%
A is equal to Infinity
23%
Ошибка при выполнении
19%
Ошибка при компиляции
3%
Узнать ответ
🔥3👍1
В Java можно динамически изменять поведение объектов, используя
InvocationHandler и Proxy.🗣️ Это полезно для создания прокси-объектов, которые могут оборачивать существующие объекты и добавлять новые функции, такие как логирование, кеширование или контроль доступа.
• InvocationHandler позволяет перехватывать вызовы методов у прокси-объекта и добавлять дополнительное поведение, такое как логирование.• Использование Proxy позволяет динамически создавать новый объект, который ведет себя как реальный объект, но с добавленным поведением.• Этот подход позволяет добавлять новое поведение к существующим объектам без изменения их кода, что делает его мощным инструментом для реализации аспектно-ориентированного программирования (AOP).Please open Telegram to view this post
VIEW IN TELEGRAM
👍2