Вопрос с собеседований
Что такое marker interface?🤓
Ответ:
Marker-интерфейс не содержит методов, а лишь помечает класс, предоставляя JVM или фреймворкам дополнительную информацию.
Примеры — Serializable и Cloneable.
Хотя современный подход — аннотации, такие интерфейсы всё ещё встречаются в старом коде.
#собеседование
Что такое marker interface?
Ответ:
Примеры — Serializable и Cloneable.
Хотя современный подход — аннотации, такие интерфейсы всё ещё встречаются в старом коде.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Forwarded from ChatRoom (Java for Beginner) (Первожрец Java)
Чет я основы забывать начал🤦🏼♂️😆
Короче могу взять несколько человек в падаваны и обучить Java с нуля))
Короче могу взять несколько человек в падаваны и обучить Java с нуля))
🔥2
История IT-технологий сегодня — 27 ноября
ℹ️ Кто родился в этот день
Алан Эмтадж (родился 27 ноября 1964 года) — барбадосско-канадский программист и исследователь, создатель первой поисковой системы «Archie», одного из ранних инструментов навигации по FTP‐архивам в интернете.
🌐 Знаковые события
1980 — стартовал пилотируемый космический аппарат «Союз Т-3»; экипаж — Леонид Кизим, Олег Макаров, Геннадий Стрекалов, при этом Макаров первым из советских космонавтов совершает четвёртый космический полёт.
#Biography #Birth_Date #Events #27Ноября
Алан Эмтадж (родился 27 ноября 1964 года) — барбадосско-канадский программист и исследователь, создатель первой поисковой системы «Archie», одного из ранних инструментов навигации по FTP‐архивам в интернете.
1980 — стартовал пилотируемый космический аппарат «Союз Т-3»; экипаж — Леонид Кизим, Олег Макаров, Геннадий Стрекалов, при этом Макаров первым из советских космонавтов совершает четвёртый космический полёт.
#Biography #Birth_Date #Events #27Ноября
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
https://t.me/Java_for_beginner_dev/3765
А если реально то меня несколько раз в комментариях на Ютубе спрашивали о менторстве.
Думаю нужно попробовать)
Пишите, возьму всего несколько человек!💪 ☺️
А если реально то меня несколько раз в комментариях на Ютубе спрашивали о менторстве.
Думаю нужно попробовать)
Пишите, возьму всего несколько человек!
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
Java for Beginner
Чет я основы забывать начал🤦🏼♂️😆
Короче могу взять несколько человек в падаваны и обучить Java с нуля))
Короче могу взять несколько человек в падаваны и обучить Java с нуля))
👍3
GraphQL vs REST vs gRPC
REST — ресурсно-ориентированный HTTP API, обычно JSON по HTTP/1.1. Прост, совместим с любым клиентом, хорош для публичных и простых API.
GraphQL — язык запросов + схема; клиент сам описывает форму данных. Один эндпоинт, строгая схема, гибкость запросов, удобен для фронтенда.
gRPC — RPC-фреймворк на основе HTTP/2 + Protocol Buffers; строгие контракты (.proto), бинарная сериализация, встроенный стриминг. Ориентирован на высокую производительность и внутренние сервисы.
Формат данных
REST → JSON (текстовый, человекочитаемый).
GraphQL → JSON-ответ, но запросы декларативны и строго типизированы схемой.
gRPC → Protocol Buffers (бинарный), компактно, фиксированные поля.
Вывод: protobuf обычно экономит трафик и парсится быстрее; JSON удобнее для дебага и совместимости.
Протокол транспорта
REST → HTTP/1.1 (обычно), можно HTTP/2, но без нативного стриминга.
GraphQL → обычно HTTP/1.1 POST/GET для Query/Mutation; Subscription — WebSocket или HTTP/2 SSE.
gRPC → HTTP/2 по умолчанию, мультиплексирование, потоковые фреймы, двунаправленность.
Вывод: для потоковых сценариев и мультиплексирования gRPC технически лучше.
Типы взаимодействия
REST → запрос/ответ (stateless).
GraphQL → query/mutation/subscription; один запрос может агрегировать много сущностей.
gRPC → unary, server streaming, client streaming, bidirectional streaming (всё на уровне протокола).
Вывод: если нужны сложные стримы и двунаправленные каналы — gRPC.
Типизация и контракт
REST → схема часто нестрогая (OpenAPI/Swagger добавляет контракт).
GraphQL → строгая схема (SDL).
gRPC → строгие контракты (.proto).
Вывод: GraphQL и gRPC обеспечивают статический контракт; REST требует дополнительных инструментов для той же дисциплины.
Производительность (в общих чертах)
gRPC обычно выигрывает по пропускной способности и латентности за счёт бинарной сериализации и HTTP/2.
GraphQL может быть эффективным по числу запросов (агрегация) и по уменьшению round-trip’ов, но JSON+резолверы добавляют накладные расходы.
REST проще и зачастую медленнее при больших объёмах и при множественных запросах с агрегацией.
Вывод: для внутренней коммуникации между сервисами с высокой нагрузкой — gRPC; для клиентского слоя — GraphQL/REST в зависимости от потребностей.
Эволюция API и версияция
REST → часто версионируют (/v1/) или добавляют параметры; ломкость при изменениях.
GraphQL → расширяемость без версий (добавление полей безопасно), депрекация поддерживается.
gRPC → совместимость через правила protobuf (резервирование, добавление новых полей безопасно при соблюдении правил).
Вывод: GraphQL и gRPC дают удобные инструменты для эволюции без жесткой версии.
Инструментальная поддержка и экосистема
REST → универсальная поддержка, простые средства тестирования.
GraphQL → богатая экосистема: GraphiQL, Apollo, Relay, Codegen. Отлично для фронтенда.
gRPC → генерация стубов под любые языки, хорошие SDK для серверов и клиентов; браузерная поддержка требует gRPC-Web.
Вывод: выбор зависит от клиентской среды: браузер напрямую лучше работает с REST/GraphQL; для gRPC нужен шлюз (gRPC-Web) или прокси.
#Java #middle #GraphQL
REST — ресурсно-ориентированный HTTP API, обычно JSON по HTTP/1.1. Прост, совместим с любым клиентом, хорош для публичных и простых API.
GraphQL — язык запросов + схема; клиент сам описывает форму данных. Один эндпоинт, строгая схема, гибкость запросов, удобен для фронтенда.
gRPC — RPC-фреймворк на основе HTTP/2 + Protocol Buffers; строгие контракты (.proto), бинарная сериализация, встроенный стриминг. Ориентирован на высокую производительность и внутренние сервисы.
Формат данных
REST → JSON (текстовый, человекочитаемый).
GraphQL → JSON-ответ, но запросы декларативны и строго типизированы схемой.
gRPC → Protocol Buffers (бинарный), компактно, фиксированные поля.
Вывод: protobuf обычно экономит трафик и парсится быстрее; JSON удобнее для дебага и совместимости.
Протокол транспорта
REST → HTTP/1.1 (обычно), можно HTTP/2, но без нативного стриминга.
GraphQL → обычно HTTP/1.1 POST/GET для Query/Mutation; Subscription — WebSocket или HTTP/2 SSE.
gRPC → HTTP/2 по умолчанию, мультиплексирование, потоковые фреймы, двунаправленность.
Вывод: для потоковых сценариев и мультиплексирования gRPC технически лучше.
Типы взаимодействия
REST → запрос/ответ (stateless).
GraphQL → query/mutation/subscription; один запрос может агрегировать много сущностей.
gRPC → unary, server streaming, client streaming, bidirectional streaming (всё на уровне протокола).
Вывод: если нужны сложные стримы и двунаправленные каналы — gRPC.
Типизация и контракт
REST → схема часто нестрогая (OpenAPI/Swagger добавляет контракт).
GraphQL → строгая схема (SDL).
gRPC → строгие контракты (.proto).
Вывод: GraphQL и gRPC обеспечивают статический контракт; REST требует дополнительных инструментов для той же дисциплины.
Производительность (в общих чертах)
gRPC обычно выигрывает по пропускной способности и латентности за счёт бинарной сериализации и HTTP/2.
GraphQL может быть эффективным по числу запросов (агрегация) и по уменьшению round-trip’ов, но JSON+резолверы добавляют накладные расходы.
REST проще и зачастую медленнее при больших объёмах и при множественных запросах с агрегацией.
Вывод: для внутренней коммуникации между сервисами с высокой нагрузкой — gRPC; для клиентского слоя — GraphQL/REST в зависимости от потребностей.
Эволюция API и версияция
REST → часто версионируют (/v1/) или добавляют параметры; ломкость при изменениях.
GraphQL → расширяемость без версий (добавление полей безопасно), депрекация поддерживается.
gRPC → совместимость через правила protobuf (резервирование, добавление новых полей безопасно при соблюдении правил).
Вывод: GraphQL и gRPC дают удобные инструменты для эволюции без жесткой версии.
Инструментальная поддержка и экосистема
REST → универсальная поддержка, простые средства тестирования.
GraphQL → богатая экосистема: GraphiQL, Apollo, Relay, Codegen. Отлично для фронтенда.
gRPC → генерация стубов под любые языки, хорошие SDK для серверов и клиентов; браузерная поддержка требует gRPC-Web.
Вывод: выбор зависит от клиентской среды: браузер напрямую лучше работает с REST/GraphQL; для gRPC нужен шлюз (gRPC-Web) или прокси.
#Java #middle #GraphQL
👍1
Практические сценарии
публичный HTTP API для сторонних клиентов (публичная документация)
Выбор: REST или GraphQL
Почему: совместимость, простота, отсутствие необходимости требованиям к бинарному протоколу.
REST, если API простое, CRUD-ориентированное, нужно кэширование по URL и широчайшая совместимость.
GraphQL, если клиенты (много разных) требуют разные наборы данных и важно уменьшить число запросов.
фронтенд (SPA, мобильные клиенты) с разнообразными представлениями
Выбор: GraphQL
Почему: клиент сам формирует shape ответов; экономия round-trips; отличная интеграция с Apollo/Relay; кодогенерация типов для TS/Swift/Kotlin.
внутренняя связь между микросервисами с высокой нагрузкой
Выбор: gRPC
Почему: низкая латентность, компактность, стриминг, строгие контракты, удобная кодогенерация для множества языков.
real-time (чат, телеметрия, видео/аудио)
Выбор: gRPC (bidirectional) или GraphQL Subscriptions (WebSocket)
Почему: gRPC даёт нативный поток; GraphQL Subscriptions удобны для фронтенда, но требуют инфраструктуры и могут быть сложнее в масштабировании.
интеграция с legacy REST-сервисами
Выбор: GraphQL в качестве BFF (Backend-for-Frontend) или REST-шлюз
Почему: GraphQL может агрегировать несколько REST-вызовов и отдать клиенту нужную структуру.
Почему часто комбинируют: GraphQL для клиентов, gRPC для микросервисов
Это распространённый и рациональный паттерн:
Внутренние сервисы общаются по gRPC (эффективно, типобезопасно, стриминг).
BFF / API Gateway (или отдельный GraphQL-сервер) агрегирует данные из gRPC/REST/БД и предоставляет фронту единый, гибкий интерфейс.
Фронтенд работает с GraphQL (или REST), не заботясь о том, как именно данные доставлены внутри инфраструктуры.
Преимущества паттерна:
Отделение оптимизации внутренней сетевой коммуникации (gRPC) от удобства клиентских API (GraphQL).
Централизация логики агрегации и адаптации под клиентов.
Возможность менять внутреннюю реализацию без ломки фронта.
Пример (псевдокод Java resolver, вызывающий gRPC-stub):
Детальный разбор преимуществ и ограничений
Удобство разработки
REST: быстро стартовать, понятная модель. Но при сложных клиентских потребностях растёт число эндпоинтов.
GraphQL: позволяет фронтенду быстро изменять данные без координации с бэком, но требует работы со схемой и авторизацией на уровне полей.
gRPC: требует .proto и генерации стабов, но даёт сильную типизацию и меньше рутинного кода при изменениях.
Кеширование
REST: простое кеширование по URL (HTTP caches, CDNs).
GraphQL: кеширование сложнее — операция может возвращать разные поля; решения: persisted queries, apollo cache, CDN на уровне persisted queries/operation id.
gRPC: кеширование на транспортном уровне сложнее; обычно кешируют ответы в сервисах.
Отладка и наблюдаемость
REST: легко отлаживать (curl, браузер).
GraphQL: дебаг через GraphiQL/Apollo Studio; трассировка полей сложнее (нужны field-level metrics).
gRPC: бинарные пакеты труднее смотреть вручную; нужно подходящие инструменты (grpcurl, tshark + protobuf descriptors).
Безопасность и авторизация
REST: стандартные механизмы (OAuth, JWT, TLS).
GraphQL: нужно управлять авторизацией на уровне полей (field-level), чтобы не раскрывать данные; также важны depth-limiting, query complexity limiting, persisted queries.
gRPC: поддерживает mTLS, аутентификацию/авторизацию через metadata; access control реализуется в сервисах.
Количество сетевых вызовов / latency
GraphQL часто уменьшает RTT за счёт агрегации (один запрос вместо множества).
gRPC уменьшает сетевые накладные расходы: меньше байт, лучше TCP connection reuse, HTTP/2 мультиплексирование.
#Java #middle #GraphQL
публичный HTTP API для сторонних клиентов (публичная документация)
Выбор: REST или GraphQL
Почему: совместимость, простота, отсутствие необходимости требованиям к бинарному протоколу.
REST, если API простое, CRUD-ориентированное, нужно кэширование по URL и широчайшая совместимость.
GraphQL, если клиенты (много разных) требуют разные наборы данных и важно уменьшить число запросов.
фронтенд (SPA, мобильные клиенты) с разнообразными представлениями
Выбор: GraphQL
Почему: клиент сам формирует shape ответов; экономия round-trips; отличная интеграция с Apollo/Relay; кодогенерация типов для TS/Swift/Kotlin.
внутренняя связь между микросервисами с высокой нагрузкой
Выбор: gRPC
Почему: низкая латентность, компактность, стриминг, строгие контракты, удобная кодогенерация для множества языков.
real-time (чат, телеметрия, видео/аудио)
Выбор: gRPC (bidirectional) или GraphQL Subscriptions (WebSocket)
Почему: gRPC даёт нативный поток; GraphQL Subscriptions удобны для фронтенда, но требуют инфраструктуры и могут быть сложнее в масштабировании.
интеграция с legacy REST-сервисами
Выбор: GraphQL в качестве BFF (Backend-for-Frontend) или REST-шлюз
Почему: GraphQL может агрегировать несколько REST-вызовов и отдать клиенту нужную структуру.
Почему часто комбинируют: GraphQL для клиентов, gRPC для микросервисов
Это распространённый и рациональный паттерн:
Внутренние сервисы общаются по gRPC (эффективно, типобезопасно, стриминг).
BFF / API Gateway (или отдельный GraphQL-сервер) агрегирует данные из gRPC/REST/БД и предоставляет фронту единый, гибкий интерфейс.
Фронтенд работает с GraphQL (или REST), не заботясь о том, как именно данные доставлены внутри инфраструктуры.
Преимущества паттерна:
Отделение оптимизации внутренней сетевой коммуникации (gRPC) от удобства клиентских API (GraphQL).
Централизация логики агрегации и адаптации под клиентов.
Возможность менять внутреннюю реализацию без ломки фронта.
Пример (псевдокод Java resolver, вызывающий gRPC-stub):
// GraphQL resolver
public class UserResolver {
private final UserGrpc.UserBlockingStub userStub;
public UserResolver(UserGrpc.UserBlockingStub userStub) {
this.userStub = userStub;
}
public User getUser(String id) {
UserRequest req = UserRequest.newBuilder().setId(id).build();
UserResponse resp = userStub.getUser(req); // gRPC call to internal service
return mapToGraphQLUser(resp);
}
}
Детальный разбор преимуществ и ограничений
Удобство разработки
REST: быстро стартовать, понятная модель. Но при сложных клиентских потребностях растёт число эндпоинтов.
GraphQL: позволяет фронтенду быстро изменять данные без координации с бэком, но требует работы со схемой и авторизацией на уровне полей.
gRPC: требует .proto и генерации стабов, но даёт сильную типизацию и меньше рутинного кода при изменениях.
Кеширование
REST: простое кеширование по URL (HTTP caches, CDNs).
GraphQL: кеширование сложнее — операция может возвращать разные поля; решения: persisted queries, apollo cache, CDN на уровне persisted queries/operation id.
gRPC: кеширование на транспортном уровне сложнее; обычно кешируют ответы в сервисах.
Отладка и наблюдаемость
REST: легко отлаживать (curl, браузер).
GraphQL: дебаг через GraphiQL/Apollo Studio; трассировка полей сложнее (нужны field-level metrics).
gRPC: бинарные пакеты труднее смотреть вручную; нужно подходящие инструменты (grpcurl, tshark + protobuf descriptors).
Безопасность и авторизация
REST: стандартные механизмы (OAuth, JWT, TLS).
GraphQL: нужно управлять авторизацией на уровне полей (field-level), чтобы не раскрывать данные; также важны depth-limiting, query complexity limiting, persisted queries.
gRPC: поддерживает mTLS, аутентификацию/авторизацию через metadata; access control реализуется в сервисах.
Количество сетевых вызовов / latency
GraphQL часто уменьшает RTT за счёт агрегации (один запрос вместо множества).
gRPC уменьшает сетевые накладные расходы: меньше байт, лучше TCP connection reuse, HTTP/2 мультиплексирование.
#Java #middle #GraphQL
👍1
Практические шаблоны интеграции (patterns)
1) BFF (Backend-for-Frontend) — GraphQL на фронте + gRPC внутри
GraphQL агрегатор (BFF) вызывает gRPC сервисы, комбинирует ответы и отдаёт клиенту.
Позволяет хранить оптимизированные внутр. контракты и независимую клиентскую схему.
2) API Gateway с трансляцией
gRPC Gateway (прокси) экспонирует REST/JSON поверх gRPC-сервисов или наоборот.
Полезно для совместимости с внешними клиентами.
3) Dual API
Предоставлять одновременно REST (для публичного потребления) и GraphQL (для интерактивного фронта).
Поддерживать один источник данных и разные фасады.
4) Persisted Queries + CDN
Для GraphQL: генерировать хэш-запросов (operationId) и кэшировать на CDN; уменьшает payload и риск DoS.
Частые ошибки
Выбор gRPC для публичного браузерного API без gRPC-Web — приведёт к дополнительной сложности (нужен прокси).
GraphQL без контроля сложности — клиенты могут генерировать тяжёлые запросы (глубокая вложенность). Нужно ставить лимиты.
REST для сложной фронт-логики — приведёт к множеству эндпоинтов и оверхеду в клиенте.
Игнорирование кэширования в GraphQL — потеря преимуществ CDN/edge caching; нужен persisted queries или отдельные REST-эндпоинты для тяжелых ресурсов.
Чек-лист для принятия решения (практический)
Клиенты — браузеры? мобильные? сторонние интеграторы?
браузер/мобильный фронт → GraphQL выгоден;
сторонние сторонние потребители → REST предпочтителен (совместимость).
Нужен ли стриминг / двунаправленная связь?
да → gRPC;
нет → GraphQL/REST.
Высокая нагрузка внутри сети (RTT, пропускная способность)?
да → gRPC;
Требуется гибкость выбора полей клиентом и уменьшение запросов?
да → GraphQL;
Требуется простое кеширование через CDN/HTTP?
да → REST (или реализовать persisted queries для GraphQL).
Нужно строгая схема и codegen для многих языков?
gRPC или GraphQL (оба дают schema/codegen).
Рекомендованные архитектурные сочетания (рецепты)
Внутренние микросервисы (gRPC) + GraphQL BFF + браузерный фронт — оптимальный вариант для больших команд: скорость внутри, гибкость для фронтенда.
REST public API + GraphQL internal BFF for web clients — если нужно максимально простое публичное API, но гибкость для своих фронтенд-команд.
gRPC end-to-end — когда все клиенты контролируются и могут использовать gRPC (например, мобильный клиент с gRPC-Web или нативный клиент).
Пример архитектуры
Сценарий: крупное приложение с веб-клиентом и мобильными приложениями + множество микросервисов.
Внутренние микросервисы: общаются по gRPC (protobuf).
Aggregation Layer: GraphQL BFF. Он:
вызывает gRPC сервисы (stub-ы),
использует DataLoader / batching для борьбы с N+1,
кеширует часто запрашиваемые фрагменты,
реализует field-level авторизацию.
Фронтенд: запрашивает GraphQL; для критичных статических ресурсов (изображения) используется CDN.
Преимущество: фронтенд получает гибкий API, внутренние сервисы остаются быстрыми и типобезопасными.
#Java #middle #GraphQL
1) BFF (Backend-for-Frontend) — GraphQL на фронте + gRPC внутри
GraphQL агрегатор (BFF) вызывает gRPC сервисы, комбинирует ответы и отдаёт клиенту.
Позволяет хранить оптимизированные внутр. контракты и независимую клиентскую схему.
2) API Gateway с трансляцией
gRPC Gateway (прокси) экспонирует REST/JSON поверх gRPC-сервисов или наоборот.
Полезно для совместимости с внешними клиентами.
3) Dual API
Предоставлять одновременно REST (для публичного потребления) и GraphQL (для интерактивного фронта).
Поддерживать один источник данных и разные фасады.
4) Persisted Queries + CDN
Для GraphQL: генерировать хэш-запросов (operationId) и кэшировать на CDN; уменьшает payload и риск DoS.
Частые ошибки
Выбор gRPC для публичного браузерного API без gRPC-Web — приведёт к дополнительной сложности (нужен прокси).
GraphQL без контроля сложности — клиенты могут генерировать тяжёлые запросы (глубокая вложенность). Нужно ставить лимиты.
REST для сложной фронт-логики — приведёт к множеству эндпоинтов и оверхеду в клиенте.
Игнорирование кэширования в GraphQL — потеря преимуществ CDN/edge caching; нужен persisted queries или отдельные REST-эндпоинты для тяжелых ресурсов.
Чек-лист для принятия решения (практический)
Клиенты — браузеры? мобильные? сторонние интеграторы?
браузер/мобильный фронт → GraphQL выгоден;
сторонние сторонние потребители → REST предпочтителен (совместимость).
Нужен ли стриминг / двунаправленная связь?
да → gRPC;
нет → GraphQL/REST.
Высокая нагрузка внутри сети (RTT, пропускная способность)?
да → gRPC;
Требуется гибкость выбора полей клиентом и уменьшение запросов?
да → GraphQL;
Требуется простое кеширование через CDN/HTTP?
да → REST (или реализовать persisted queries для GraphQL).
Нужно строгая схема и codegen для многих языков?
gRPC или GraphQL (оба дают schema/codegen).
Рекомендованные архитектурные сочетания (рецепты)
Внутренние микросервисы (gRPC) + GraphQL BFF + браузерный фронт — оптимальный вариант для больших команд: скорость внутри, гибкость для фронтенда.
REST public API + GraphQL internal BFF for web clients — если нужно максимально простое публичное API, но гибкость для своих фронтенд-команд.
gRPC end-to-end — когда все клиенты контролируются и могут использовать gRPC (например, мобильный клиент с gRPC-Web или нативный клиент).
Пример архитектуры
Сценарий: крупное приложение с веб-клиентом и мобильными приложениями + множество микросервисов.
Внутренние микросервисы: общаются по gRPC (protobuf).
Aggregation Layer: GraphQL BFF. Он:
вызывает gRPC сервисы (stub-ы),
использует DataLoader / batching для борьбы с N+1,
кеширует часто запрашиваемые фрагменты,
реализует field-level авторизацию.
Фронтенд: запрашивает GraphQL; для критичных статических ресурсов (изображения) используется CDN.
Преимущество: фронтенд получает гибкий API, внутренние сервисы остаются быстрыми и типобезопасными.
#Java #middle #GraphQL
👍1
Что выведет код?
#Tasks
public class Task271125 {
public static void main(String[] args) {
int i = 0;
do {
i++;
if (i == 2) continue;
System.out.print(i + " ");
} while (i < 3 && i > 0);
System.out.print("end: " + i);
}
}#Tasks
Вопрос с собеседований
Что делает метод Objects.requireNonNull()?🤓
Ответ:
Метод Objects.requireNonNull() проверяет аргумент на null и выбрасывает NullPointerException с сообщением при нарушении.
Это позволяет явно гарантировать корректность входных параметров и упростить диагностику ошибок.
Применяется в конструкторах, сеттерах и публичных API.
#собеседование
Что делает метод Objects.requireNonNull()?
Ответ:
Это позволяет явно гарантировать корректность входных параметров и упростить диагностику ошибок.
Применяется в конструкторах, сеттерах и публичных API.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2