Java for Beginner
871 subscribers
1.01K photos
275 videos
14 files
1.68K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
👍2
Что такое Phaser? 🤓

Ответ:

Phaser — это более гибкая замена CyclicBarrier и CountDownLatch, появившаяся в Java 7.

Он поддерживает многофазную синхронизацию потоков, которые могут динамически регистрироваться и дерегистрироваться. Каждая фаза имеет номер.

Потоки вызывают arriveAndAwaitAdvance() — прибытие и ожидание перехода к следующей фазе. Phaser может использоваться для организации синхронизации в алгоритмах с несколькими итерациями (фазами), где количество участников меняется.

Поддерживает иерархию (родительские Phaser'ы).


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
История технологии сегодня — 23 мая

Сегодня Java исполнился 31 год! 🎉

Изначально язык назывался Oak («Дуб»), разрабатывался Джеймсом Гослингом для программирования бытовых электронных устройств. Из-за того, что язык с таким названием уже существовал, Oak был переименован в Java. Назван в честь марки кофе Java, которая, в свою очередь, получила наименование одноимённого острова (Ява), поэтому на официальной эмблеме языка изображена чашка с горячим кофе. Существует и другая версия происхождения названия языка, связанная с аллюзией на кофемашину как пример бытового устройства, для программирования которого изначально язык создавался. В соответствии с этимологией в русскоязычной литературе с конца двадцатого и до первых лет двадцать первого века название языка нередко переводилось как Ява, а не транскрибировалось.

С середины 1990-х годов язык стал широко использоваться для написания клиентских приложений и серверного программного обеспечения. Тогда же определённое распространение получила технология Java-апплетов — графических Java-приложений, встраиваемых в веб-страницы; с развитием возможностей динамических веб-страниц в 2000-е годы технология стала применяться редко.


ℹ️ Кто родился в этот день

Роберт Артур Муг (Моуг; англ. Robert A. Moog, Bob Moog /ˈmoʊɡ/; 23 мая 1934 — 21 августа 2005) — американский изобретатель, предприниматель, пионер электронной музыки, известен как создатель синтезатора Муга.

Джон Ба́рди́н (англ. John Bardeen; 23 мая 1908, Мадисон, Висконсин, США — 30 января 1991, Бостон, Массачусетс, США) — американский физик, один из пяти человек, получивших за свою жизнь по две Нобелевские премии: в 1956 году за транзистор совместно с Уильямом Брэдфордом Шокли и Уолтером Браттейном и в 1972 году за основополагающую теорию обычных сверхпроводников совместно с Леоном Нилом Купером и Джоном Робертом Шриффером. Сейчас эта теория называется теорией Бардина — Купера — Шриффера, или просто БКШ-теория.


🌐 Знаковые события

1934 — первый полёт экспериментальной крылатой ракеты, спроектированной под руководством С. П. Королёва в ГИРД, оснащённой ГРД.

1995 — компания Sun официально представила Java и HotJava на выставке SunWorld '95.


#Biography #Birth_Date #Events #23мая
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5🍾3
С 09.05 по 22.05
Предыдущий пост(с 02.05 по 08.05)

Запись встреч/видео:
13. Kafka: переход от очереди задач к журналу событий
Keycloak с нуля: от первого токена до современной auth-архитектуры

Обучающие статьи:
[Совет по Java #035]
Тема: java.util.Timer создает один поток для всех задач.

[Совет по Java #037]
Тема: File.delete() не бросает исключение при неудаче.

[Совет по Java #038]
Тема: SimpleDateFormat не потокобезопасен.

[Совет по Java #039]
Тема: String.split() принимает регулярное выражение.

[Совет по Java #040]
Тема: Переменные в catch и finally не видны снаружи.

Раздел 9. Исключения, логирование, отладка

Глава 2. Логирование (Logging)
Подключение SLF4J + Logback в проект (Maven/Gradle). Базовый пример получения логгера
Уровни логирования: TRACE, DEBUG, INFO, WARN, ERROR. Когда что использовать. Иерархия и фильтрация
Параметризованные сообщения SLF4J: почему это лучше конкатенации строк
Логирование исключений — правильная передача throwable последним параметром
Конфигурация Logback через logback.xml (или logback-test.xml)

Полезные статьи и видео:
Java нас обманывает: скрытая цена чистого кода

Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
👍1🔥1
История технологии сегодня — 24 мая

ℹ️ Кто родился в этот день

Алекса́ндр Алексе́евич Лема́нский (24 мая 1935, Москва — 27 сентября 2007, Капустин Яр, Ахтубинский район, Астраханская область) советский и российский учёный, генеральный конструктор НПО «Алмаз», заведующий кафедрой «Радиолокация, радиоуправление и информатика» Факультета радиотехники и кибернетики МФТИдоктор технических наукпрофессор, руководитель работ по созданию системы С-400.

Даниель Габриель Фаренгейт (Фаренхайт; нем. Daniel Gabriel Fahrenheit; 24 мая 1686, Данциг (ныне — Гданьск, Польша) — 16 сентября 1736Гаага) — немецкий физик, родившийся в Польше. В Нидерландах он впервые изготовил термометр и барометр. Вначале термоскопической жидкостью ему служил спирт, но затем около 1715 года он заменил спирт ртутью, чем достиг гораздо большей точности измерений. Фаренгейтом изготовлены также первый весовой ареометр и термобарометр. В 1721 году он открыл, что вода может быть охлаждена ниже точки замерзания и оставаться в жидком состоянии; работал также над устройством машины для осушения местностей, подвергшихся наводнениям. Единица измерения температуры градус Фаренгейта (°F) была названа в его честь.


🌐 Знаковые события

1949 — пуск первой советской геофизической ракеты В-1А. Начало регулярных научных исследований верхних слоёв атмосферы.

2001 — в русской Википедии появилась первая статья.

2006 — запущен проект Wikimapia.


#Biography #Birth_Date #Events #24мая
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Почему все-таки программирование?

Мне, 40-летнему человеку, по теории, должно было быть сложно менять профессию.
Тем более, я уже успел получить несколько других и добиться в них немалого успеха.


Так почему же я решился на такую авантюру? (а по другому, мои родные это не называли 😂)

Вот некоторые из тех принципов, которые определили пройденный путь:

1. Успех в определенной профессии != достойной зарплате и условиям труда 🫰.

Поработав в разных сферах и в разных условиях, посмотрев как трудятся люди разных профессий, начинаешь понимать ценность спокойной, "удаленной" работы и достойного, денежного эквивалента этого труда. ☝️

2. Развитие и перспективы в обозримом будущем 🏝.

По моему скромному мнению, пределов развития и так называемого "потолка", у человека выбравшего программирование - нет. Вот нет и все. Кто готов поспорить - жду в комментариях 🤓

А есть лишь естественные причины - физические ограничения и ЛЕНЬ.
😵

А это значит, что пока руки поднимаются - опускать их мимо клавиатуры, противоестественно! 💪

3. Неугасаемый интерес к процессу созидания (написанию кода) 🧑‍💻.

Один из мощнейших, мотивационных принципов для меня.

Ведь, что может быть прекраснее, чем наблюдать как созданный тобой корабль (условно, конечно же), держится и продолжает плыть в самом современном море, которое еще не исследовано до конца? ⛵️


Все это, в совокупности, перевесило мое нежелание (или инерцию мышления и жизни) изучать программирование.

И даже когда (очень часто, столкнувшись с нерешаемой задачей 😭) мне казалось, что я сделал опрометчиво-глупый выбор - эти принципы помогали преодолеть сомнения (и конечно же задачу, потому что нерешаемых задач НЕТ 💪).

😎

#motivation
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍2
История технологии сегодня — 25 мая

ℹ️ Кто родился в этот день

Джек Стейнбергер (англ. Jack Steinberger; 25 мая 1921, Бад-Киссинген, Германия — 12 декабря 2020, Женева, Швейцария) — американский физик, известный работами по физике элементарных частицнобелевский лауреат (1988) за открытие и исследование мюонного нейтрино и антинейтрино.

Пи́тер Зе́еман (нид. Pieter Zeeman; 25 мая 1865, Зоннемайре, Нидерланды — 9 октября 1943, Амстердам) — нидерландский физик, лауреат Нобелевской премии по физике 1902 года (совместно с Хендриком Лоренцем) за открытие и теоретическое объяснение расщепления спектральных линий в магнитном поле (эффекта Зеемана).

Аугу́сто Ульдери́ко Сикаре́ (исп. Augusto Ulderico Cicaré, 25 мая 1937 — 26 января 2022) — аргентинский изобретательинженер и авиаконструктор, основатель и первый президент компании Cicaré Helicópteros S.A. Сикаре создал свой первый вертолёт Cicaré CH-1 в 1958 году. CH-1 был первым вертолётом, разработанным в Южной Америке. В 1972 году был представлен третий летательный аппарат — Cicaré CH-3. В конце 1960-х изобретатель разработал 4-тактный V-образный двигатель для автомобилей DKW, протестированный аргентинским гонщиком Хуаном Мануэлем Фанхио. Также была разработана спортивная версия, но банкротство DKW привело к закрытию проекта. Сикаре разработал прототипы вертолётов итальянской фирмы «Heli-Sport» CH-7 Angel и 2-местный CH-7 Kompress, совместно с Деннисом Феттерсом Mini-500Voyager-500.


🌐 Знаковые события

1939 — первые в стране испытания системы автоматического взлёта и посадки тяжёлого самолёта ТБ-1.


#Biography #Birth_Date #Events #25мая
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Напоминаю, что продолжаю набор, желающих изучить Java. 🤓

Пишите в лс, все обсудим. 😉

@oleborn
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
[Совет по Java #041]

Тема: Integer кэширует значения от -128 до 127.

Проблема: JVM кэширует объекты Integer для небольшого диапазона значений (по умолчанию от -128 до 127). При автоупаковке (autoboxing) или вызове Integer.valueOf() для числа в этом диапазоне возвращается один и тот же объект из кэша. Для чисел вне диапазона каждый раз создается новый объект. Использование оператора == для сравнения Integer проверяет равенство ссылок, а не значений.

Решение: Всегда сравнивайте объекты IntegerLongShortByteCharacter через метод equals() или используйте примитивные типы (int). Для безопасного сравнения с возможным null применяйте Objects.equals(a, b). Кэш можно расширить параметром -XX:AutoBoxCacheMax=size, но это не решает концептуальной проблемы. Для Long кэш работает только для значений от -128 до 127, для Character — от 0 до 127.
public class IntegerCache {

public static void main(String[] args) {
//В пределах кэша (-128..127)
Integer a1 = 100;
Integer b1 = 100;
System.out.println("100 == 100: " + (a1 == b1)); // true (один объект)
System.out.println("100 equals 100: " + a1.equals(b1)); // true

//Вне кэша
Integer a2 = 200;
Integer b2 = 200;
System.out.println("200 == 200: " + (a2 == b2)); // false (разные объекты!)
System.out.println("200 equals 200: " + a2.equals(b2)); // true

//Разные способы создания
Integer a3 = Integer.valueOf(127); // из кэша
Integer b3 = new Integer(127); // новый объект (deprecated)
System.out.println("valueOf(127) == new Integer(127): " + (a3 == b3)); // false

//Опасность в коллекциях
var map = new java.util.HashMap<Integer, String>();
map.put(200, "value");
System.out.println("map.get(200): " + map.get(200)); // работает, т.к. внутри equals

//Правильное сравнение
Integer x = 300;
Integer y = 300;
if (x.equals(y)) {
System.out.println("300 equals 300 — корректно");
}

//null-safe сравнение
Integer nullable = null;
System.out.println("Objects.equals: " + Objects.equals(nullable, 300));
}
}


Объяснение:
 Кэш Integer реализован в методе Integer.valueOf() и используется при автоупаковке. Его размер можно настроить, но полагаться на кэш — плохая практика.

Оператор == для объектов сравнивает ссылки, и для чисел вне диапазона кэша они гарантированно разные. Проблема усугубляется тем, что код работает в разработке (где числа обычно маленькие) и ломается в production (где диапазон шире). equals() сравнивает значения и всегда работает корректно.

Для смешанного сравнения Integer и int происходит распаковка (unboxing), и == работает правильно: Integer a = 200; int b = 200; a == b будет true, потому что a распаковывается в int. Но для единообразия всегда используйте equals().

#Java #советы
👍5
Что выведет код?

public class Task250526 {
public static void main(String[] args) {
Short a = 100;
Short b = 100;
Short c = 200;
Short d = 200;

System.out.println(a == b);
System.out.println(c == d);
System.out.println(c.equals(d));
}
}


#Tasks
👍3
👍4
Что такое ThreadFactory? 🤓

Ответ:

ThreadFactory — это интерфейс для создания новых потоков с возможностью кастомизации.

Единственный метод: Thread newThread(Runnable r). Используется в ExecutorService (например, Executors.newFixedThreadPool(10, myThreadFactory)).

Позволяет задавать: имена потоков (для упрощения отладки), приоритеты, демонический статус, UncaughtExceptionHandler.

Хорошая практика — создавать потоки с понятными именами (например, "db-pool-%d"). Утилита Executors.defaultThreadFactory() возвращает стандартную фабрику.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
История технологии сегодня — 26 мая

ℹ️ Кто родился в этот день

Бори́с Серге́евич Петропа́вловский (14 (26) мая 1898, Курск — 6 ноября 1933, Ленинград) — российский и советский военный инженер-артиллерист, участник Первой мировой и Гражданской войн, один из организаторов разработок ракетной техники в СССР, руководитель Газодинамической лаборатории, главный инженер Ленинградского отделения Реактивного научно-исследовательского института (РНИИ). Именем Б. С. Петропавловского был назван кратер на обратной стороне Луны.


🌐 Знаковые события

1868 — Альфред Нобель подал заявку на американский патент на изобретение динамита.



#Biography #Birth_Date #Events #26мая
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Раздел 9. Исключения, логирование, отладка

Глава 2. Логирование (Logging)

MDC (Mapped Diagnostic Context) – привязка контекстной информации к логам

В многопоточном серверном приложении один и тот же логгер обрабатывает запросы от множества клиентов параллельно. Стандартный вывод логов представляет собой линейную последовательность сообщений от разных потоков, где запросы перемешаны хаотично. Без дополнительного контекста невозможно отследить, какие сообщения относятся к конкретному пользователю или HTTP-запросу.

Рассмотрим типичный лог без MDC:
2024-01-15 10:23:14 [http-nio-8080-exec-3] INFO  OrderService - Processing order
2024-01-15 10:23:14 [http-nio-8080-exec-1] INFO PaymentService - Charging card
2024-01-15 10:23:14 [http-nio-8080-exec-3] WARN InventoryService - Low stock
2024-01-15 10:23:15 [http-nio-8080-exec-2] ERROR OrderService - Payment failed

По имени потока можно различить запросы, но имена потоков переиспользуются пулом и не несут бизнес-семантики. Для анализа проблемы конкретного пользователя или запроса требуется ручной поиск по временным меткам и косвенным признакам.


Архитектура MDC

MDC — это карта ключ-значение, привязанная к текущему потоку выполнения через ThreadLocal. SLF4J предоставляет статический API класса org.slf4j.MDC, который делегирует реализации (Logback или Log4j2) фактическое хранение контекста. Каждый поток имеет собственную изолированную копию MDC, что гарантирует отсутствие перекрестного загрязнения между параллельными запросами.

Основные операции:
MDC.put(String key, String value) — добавляет пару ключ-значение в контекст текущего потока
MDC.get(String key) — извлекает значение по ключу
MDC.remove(String key) — удаляет конкретный ключ
MDC.clear() — очищает весь контекст текущего потока

Контекст MDC автоматически подставляется в лог-сообщения через conversion specifier %X{key} в PatternLayout.

Базовое использование
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;

public class OrderService {
private static final Logger logger = LoggerFactory.getLogger(OrderService.class);

public void processOrder(String orderId, String userId) {
// Установка контекста в начале операции
MDC.put("orderId", orderId);
MDC.put("userId", userId);
MDC.put("operation", "processOrder");

try {
logger.info("Starting order processing");
validateOrder(orderId);
chargePayment(orderId, userId);
updateInventory(orderId);
logger.info("Order processing completed");
} catch (Exception e) {
logger.error("Order processing failed", e);
throw e;
} finally {
// Обязательная очистка контекста
MDC.clear();
}
}
}


Конфигурация Logback для вывода MDC:
<property name="LOG_PATTERN" 
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} [%X{userId}] [%X{orderId}] - %msg%n"/>

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>


Результат:
2024-01-15 10:23:14.123 [http-nio-8080-exec-3] INFO  OrderService [user-42] [order-789] - Starting order processing
2024-01-15 10:23:14.145 [http-nio-8080-exec-3] INFO PaymentService [user-42] [order-789] - Charging payment
2024-01-15 10:23:14.167 [http-nio-8080-exec-3] INFO OrderService [user-42] [order-789] - Order processing completed

Все сообщения, выведенные в рамках одного запроса, содержат идентификаторы пользователя и заказа. Это позволяет фильтровать логи grep-ом или в системах агрегации по конкретным значениям MDC.


#Java #для_новичков #beginner #logging #Log4j2 #Logback #SLF4J
👍1
MDC в веб-приложении: Servlet Filter

В веб-приложении контекст запроса устанавливается в фильтре сервлетов и очищается при завершении обработки. Это гарантирует, что все компоненты, участвующие в обработке запроса — контроллеры, сервисы, репозитории — имеют доступ к единому контексту без явной передачи параметров через сигнатуры методов.
import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.UUID;

@Component
public class LoggingContextFilter extends OncePerRequestFilter {

private static final String REQUEST_ID_HEADER = "X-Request-Id";

@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {

// Генерация или извлечение идентификатора запроса
String requestId = request.getHeader(REQUEST_ID_HEADER);
if (requestId == null || requestId.isBlank()) {
requestId = UUID.randomUUID().toString();
}

// Извлечение контекста аутентификации
String userId = extractUserId(request);
String sessionId = request.getSession(false) != null ?
request.getSession().getId() : "anonymous";

// Установка MDC
MDC.put("requestId", requestId);
MDC.put("userId", userId != null ? userId : "anonymous");
MDC.put("sessionId", sessionId);
MDC.put("method", request.getMethod());
MDC.put("uri", request.getRequestURI());

// Проброс requestId в ответ для клиентской трассировки
response.setHeader(REQUEST_ID_HEADER, requestId);

try {
filterChain.doFilter(request, response);
} finally {
// Очистка обязательна, иначе поток из пула вернется с загрязненным контекстом
MDC.clear();
}
}

private String extractUserId(HttpServletRequest request) {
// Извлечение из SecurityContext или токена
return SecurityContextHolder.getContext().getAuthentication() != null ?
SecurityContextHolder.getContext().getAuthentication().getName() : null;
}
}

Ключевой момент: MDC.clear() находится в блоке finally, что гарантирует очистку даже при исключении. Без этого поток из пула вернется с загрязненным MDC, и следующий запрос, обработанный этим потоком, унаследует чужой контекст.

Конфигурация Logback с MDC:
<property name="LOG_PATTERN" 
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} [%X{requestId}] [%X{userId}] [%X{method} %X{uri}] - %msg%n"/>

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>



#Java #для_новичков #beginner #logging #Log4j2 #Logback #SLF4J
👍3
Распределенная трассировка: propagation MDC

В микросервисной архитектуре запрос проходит через несколько сервисов. Для сквозной трассировки идентификатор запроса должен передаваться между сервисами. Это достигается через HTTP-заголовки или сообщения брокера.
@Service
public class OrderClient {
private final RestTemplate restTemplate;

public OrderDto getOrder(String orderId) {
String requestId = MDC.get("requestId");

HttpHeaders headers = new HttpHeaders();
headers.set("X-Request-Id", requestId); // Propagation

HttpEntity<Void> entity = new HttpEntity<>(headers);
ResponseEntity<OrderDto> response = restTemplate.exchange(
"http://order-service/orders/" + orderId,
HttpMethod.GET,
entity,
OrderDto.class
);

return response.getBody();
}
}

Принимающий сервис извлекает X-Request-Id из заголовка и устанавливает в свой MDC через тот же фильтр. Таким образом, все логи по цепочке запросов содержат единый идентификатор, позволяя восстановить полный путь в системах агрегации.


MDC и асинхронное выполнение

ThreadLocal привязка MDC создает проблему при асинхронном выполнении: при передаче задачи в другой поток (через CompletableFuture, @Async, пул потоков) контекст MDC не переносится автоматически.
// Антипаттерн: MDC теряется при асинхронном выполнении
CompletableFuture.runAsync(() -> {
// MDC пуст — задача выполняется в другом потоке
logger.info("Async task"); // Нет requestId, userId
});


Решение — явное копирование контекста:
Map<String, String> contextMap = MDC.getCopyOfContextMap();

CompletableFuture.runAsync(() -> {
MDC.setContextMap(contextMap); // Восстановление контекста
try {
logger.info("Async task with context");
processAsync();
} finally {
MDC.clear();
}
});


В Spring для @Async методов можно использовать TaskDecorator:
@Configuration
public class AsyncConfig implements AsyncConfigurer {

@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setTaskDecorator(new MdcTaskDecorator());
executor.initialize();
return executor;
}
}

public class MdcTaskDecorator implements TaskDecorator {
@Override
public Runnable decorate(Runnable runnable) {
Map<String, String> contextMap = MDC.getCopyOfContextMap();
return () -> {
try {
MDC.setContextMap(contextMap);
runnable.run();
} finally {
MDC.clear();
}
};
}
}



MDC.clear() vs MDC.remove()

MDC.clear() удаляет все ключи из контекста текущего потока. Это предпочтительный метод при завершении обработки запроса, так как гарантирует полную очистку.
MDC.remove(String key) удаляет конкретный ключ. Используется, когда часть контекста больше не нужна, но остальная должна сохраняться. Однако в большинстве сценариев проще и безопаснее использовать clear() в блоке finally.


JSON-формат и MDC

При структурированном логировании в JSON MDC-значения автоматически включаются как отдельные поля:
<encoder class="net.logstash.logback.encoder.LogstashEncoder"/>


Результат:
{
"@timestamp": "2024-01-15T10:23:14.123+00:00",
"message": "Order processing completed",
"logger_name": "com.example.OrderService",
"level": "INFO",
"thread_name": "http-nio-8080-exec-3",
"requestId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"userId": "user-42",
"sessionId": "session-xyz",
"method": "POST",
"uri": "/api/orders"
}

Это позволяет системам агрегации индексировать MDC-поля и выполнять точные фильтры без парсинга строк.

#Java #для_новичков #beginner #logging #Log4j2 #Logback #SLF4J
👍5
Что выведет код?

import com.fasterxml.jackson.databind.ObjectMapper;

public class Task260526 {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();

String json = "{\"name\":\"Buddy\",\"breed\":\"Labrador\"}";

Animal260526 animal = mapper.readValue(json, Animal260526.class);
System.out.println(animal.getClass().getSimpleName());
}
}

interface Animal260526 {
String getName();
}

class Dog260526 implements Animal260526 {
public String name;
public String breed;

public Dog260526() {}

@Override
public String getName() { return name; }
}


#Tasks
👍2
👍2
Что такое short-circuit операторы? 🤓

Ответ:

Логические операторы && (И) и || (ИЛИ) являются короткозамкнутыми (short-circuit).

Это означает, что второй операнд вычисляется только при необходимости.

Для &&: если левый операнд false, всё выражение false, правый не вычисляется.
Для ||: если левый операнд true, всё выражение true, правый не вычисляется.

Это позволяет безопасно писать: if (obj != null && obj.isValid()). В отличие от & и |, которые всегда вычисляют оба операнда.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
История технологии сегодня — 27 мая

ℹ️ Кто родился в этот день

Джон Дуглас Кокрофт (англ. John Douglas Cockcroft; 27 мая 1897 — 18 сентября 1967) — британский физик-ядерщик, лауреат Нобелевской премии по физике за 1951 год «за исследовательскую работу по расщеплению атомных ядер с помощью искусственно ускоряемых атомных частиц», совместно с Эрнестом Уолтоном.


🌐 Знаковые события

1930 — Ричард Дрю запатентовал «прозрачную целлофановую липкую ленту» — скотч. Новинку использовали для защиты стекла автомашины при покраске.

1988 — компания Microsoft выпустила Windows 2.1x.


#Biography #Birth_Date #Events #27мая
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3