Что такое short-circuit операторы? 🤓
Ответ:
Логические операторы && (И) и || (ИЛИ) являются короткозамкнутыми (short-circuit).
Это означает, что второй операнд вычисляется только при необходимости.
Для &&: если левый операнд false, всё выражение false, правый не вычисляется.
Для ||: если левый операнд true, всё выражение true, правый не вычисляется.
Это позволяет безопасно писать: if (obj != null && obj.isValid()). В отличие от & и |, которые всегда вычисляют оба операнда.
#собеседование
Ответ:
Логические операторы && (И) и || (ИЛИ) являются короткозамкнутыми (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мая
Джон Дуглас Кокрофт (англ. 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
[Совет по Java #042]
Тема:
Проблема: Метод
Если передан ключ, не являющийся
Решение: Для ключей, не реализующих
Объяснение: Сигнатура
При использовании лямбд с несколькими параметрами может потребоваться явное указание типа (как в примере
#Java #советы
Тема:
Comparator.comparing(Function) требует, чтобы ключ сравнения был Comparable.Проблема: Метод
Comparator.comparing(Function<? super T, ? extends U> keyExtractor) предполагает, что тип U (ключ, по которому выполняется сравнение) реализует интерфейс Comparable<U>. Если передан ключ, не являющийся
Comparable (например, пользовательский класс без реализации Comparable, или тип, который его не реализует), код не скомпилируется с ошибкой "inferred type does not conform to equality bounds".Решение: Для ключей, не реализующих
Comparable, используйте перегруженную версию Comparator.comparing(Function keyExtractor, Comparator keyComparator). Она принимает дополнительный компаратор для сравнения ключей. Также можно использовать Comparator.comparingInt, comparingLong, comparingDouble для примитивных типов, которые не требуют Comparable. public class ComparatorComparing {
static class Person {
String name;
int age;
LocalDate birthDate;
Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return name + "(" + age + ")";
}
}
// Класс без Comparable
static class ExternalId {
String prefix;
int number;
ExternalId(String prefix, int number) {
this.prefix = prefix;
this.number = number;
}
@Override
public String toString() {
return prefix + "-" + number;
}
}
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 30),
new Person("Bob", 25),
new Person("Charlie", 35)
);
//Работает: String реализует Comparable
people.sort(Comparator.comparing(p -> p.name));
System.out.println("Sorted by name: " + people);
//Работает: int примитив через comparingInt
people.sort(Comparator.comparingInt(p -> p.age));
System.out.println("Sorted by age: " + people);
//Ошибка: ExternalId не реализует Comparable
List<ExternalId> ids = Arrays.asList(
new ExternalId("A", 10),
new ExternalId("B", 5),
new ExternalId("A", 20)
);
// ids.sort(Comparator.comparing(id -> id)); // не скомпилируется!
//Решение 1: явный компаратор для ключа
ids.sort(Comparator.comparing(
(ExternalId id) -> id.prefix,
Comparator.naturalOrder() // для строк
));
System.out.println("Sorted by prefix: " + ids);
//Решение 2: составной компаратор через thenComparing
ids.sort(Comparator
.comparing((ExternalId id) -> id.prefix)
.thenComparingInt(id -> id.number));
System.out.println("Sorted by prefix then number: " + ids);
//Решение 3: собственный компаратор для ключа
Comparator<ExternalId> byNumberDesc = Comparator.comparing(
(ExternalId id) -> id.number,
(n1, n2) -> n2 - n1 // обратный порядок
);
ids.sort(byNumberDesc);
System.out.println("Sorted by number desc: " + ids);
}
}Объяснение: Сигнатура
Comparator.comparing(Function keyExtractor) имеет ограничение <U extends Comparable<? super U>>, которое требует, чтобы тип ключа реализовывал Comparable. Это ограничение гарантирует, что для ключей существует "естественный порядок". Для ключей без естественного порядка (например, пользовательские типы, массивы, или типы с специфической логикой сравнения) необходимо предоставить компаратор явно.При использовании лямбд с несколькими параметрами может потребоваться явное указание типа (как в примере
(ExternalId id) -> id.prefix), чтобы компилятор мог вывести типы.#Java #советы
👍4
Что выведет код?
#Tasks
import java.util.*;
public class Task270526 {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 25),
new Person("Bob", 30),
new Person("Charlie", 20)
);
Comparator<Person> comparator = Comparator.comparing(p -> p.age);
people.sort(comparator);
System.out.println(people);
}
static class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return name + ":" + age;
}
}
}
#Tasks
👍3
Варианты ответа:
Anonymous Quiz
10%
[Alice:25, Bob:30, Charlie:20]
75%
[Charlie:20, Alice:25, Bob:30]
15%
Ошибка компиляции
0%
Исключение ClassCastException
👍4
Что такое instance initializer (нестатический блок)? Как он работает? 🤓
Ответ:
Нестатический блок инициализации — это { ... } внутри класса, без ключевого слова static.
Он выполняется при создании каждого экземпляра, перед конструктором, но после вызова конструктора суперкласса.
Если есть несколько блоков, они выполняются в порядке объявления сверху вниз. Используется для общих инициализаций, которые нужны для всех конструкторов, или для инициализации анонимных классов.
Например: class A { { System.out.println("init"); } A() {...} }.
#собеседование
Ответ:
Нестатический блок инициализации — это { ... } внутри класса, без ключевого слова static.
Он выполняется при создании каждого экземпляра, перед конструктором, но после вызова конструктора суперкласса.
Если есть несколько блоков, они выполняются в порядке объявления сверху вниз. Используется для общих инициализаций, которые нужны для всех конструкторов, или для инициализации анонимных классов.
Например: class A { { System.out.println("init"); } A() {...} }.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
История технологии сегодня — 28 мая
ℹ️ Кто родился в этот день
Милутин Мила́нкович (28 мая 1879, Даль (ныне Хорватия) — 12 декабря 1958, Белград) — австро-венгерский, сербский гражданский инженер, климатолог, геофизик, астрофизик и популяризатор науки.
Известен теорией ледниковых периодов, подразумевающей, что из-за периодических изменений параметров своей орбиты Земля проходит через повторяющиеся ледниковые периоды, в настоящее время известные как циклы Миланковича. Кроме того, дал оценку климатическим условиям на других планетах земной группы. Милутин Миланкович также модифицировал юлианский календарь, разработал новоюлианский календарь.
Мариа́н Смолухо́вский (фон Смолан-Смолуховский, пол. Marian Smoluchowski; 28 мая 1872, Фордер-Брюль, близ Вены — 5 сентября 1917, Краков) — австро-венгерский физик-теоретик польского происхождения.
Уравнения Смолуховского, разработанные им теоретические основы и вычислительные методы стали фундаментом статистической физики и особенно важной сегодня её отрасли, называемой теорией стохастических процессов, развиваемой как физиками, так и математиками. Применения уравнений Смолуховского простираются от физики (как макроскопических, так и субатомных систем) и химии до биологии и технических наук. Многочисленны и практические применения модели Смолуховского, например — индустриальное очищение воды, коагуляция молока, возникновение гелевых барьеров, агрегация гранулоцитов, адгезия лейкоцитов, рост нанотрубок и многое другое.
🌐 Знаковые события
1742 — в Лондоне сооружён первый крытый плавательный бассейн.
#Biography #Birth_Date #Events #28мая
Милутин Мила́нкович (28 мая 1879, Даль (ныне Хорватия) — 12 декабря 1958, Белград) — австро-венгерский, сербский гражданский инженер, климатолог, геофизик, астрофизик и популяризатор науки.
Известен теорией ледниковых периодов, подразумевающей, что из-за периодических изменений параметров своей орбиты Земля проходит через повторяющиеся ледниковые периоды, в настоящее время известные как циклы Миланковича. Кроме того, дал оценку климатическим условиям на других планетах земной группы. Милутин Миланкович также модифицировал юлианский календарь, разработал новоюлианский календарь.
Мариа́н Смолухо́вский (фон Смолан-Смолуховский, пол. Marian Smoluchowski; 28 мая 1872, Фордер-Брюль, близ Вены — 5 сентября 1917, Краков) — австро-венгерский физик-теоретик польского происхождения.
Уравнения Смолуховского, разработанные им теоретические основы и вычислительные методы стали фундаментом статистической физики и особенно важной сегодня её отрасли, называемой теорией стохастических процессов, развиваемой как физиками, так и математиками. Применения уравнений Смолуховского простираются от физики (как макроскопических, так и субатомных систем) и химии до биологии и технических наук. Многочисленны и практические применения модели Смолуховского, например — индустриальное очищение воды, коагуляция молока, возникновение гелевых барьеров, агрегация гранулоцитов, адгезия лейкоцитов, рост нанотрубок и многое другое.
1742 — в Лондоне сооружён первый крытый плавательный бассейн.
#Biography #Birth_Date #Events #28мая
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Раздел 10. Логирование и мониторинг в Java
Глава 2. Логирование (Logging)
Логирование в «Библиотеке»
Часть 1. Подключение и настройка Logback
В
Конфигурация:
Создайте файл
Ключевые моменты:
Условное включение через
#Java #для_новичков #beginner #logging #Log4j2 #Logback #SLF4J #практика
Глава 2. Логирование (Logging)
Логирование в «Библиотеке»
Часть 1. Подключение и настройка Logback
В
pom.xml (если Maven) или убедитесь, что Logback на classpath:<<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.14</version>
</dependency>
<<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.9</version>
</dependency>
Конфигурация:
logback.xmlСоздайте файл
src/main/resources/logback.xml:<?xml version="1.0" encoding="UTF-8"?>
<<configuration>
<!-- Переменная для профиля -->
<springProperty scope="context" name="PROFILE" source="spring.profiles.active" defaultValue="default"/>
<!-- Для не-Spring проекта используйте системное свойство -->
<property name="PROFILE" value="${PROFILE:-default}"/>
<!-- Консоль: INFO и выше -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<!-- Файл ошибок: ERROR и выше -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/errors.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/errors.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n%ex</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<!-- Файл отладки: DEBUG и выше, только при профиле dev -->
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/debug.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} [%X{operation}] - %msg%n</pattern>
</encoder>
</appender>
<!-- Корневой логгер -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="ERROR_FILE"/>
</root>
<!-- Логгер приложения -->
<logger name="library" level="INFO">
<!-- DEBUG-файл подключается условно -->
</logger>
<!-- Условное включение DEBUG-файла через профиль -->
<if condition='property("PROFILE").contains("dev")'>
<then>
<root level="DEBUG">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="ERROR_FILE"/>
<appender-ref ref="DEBUG_FILE"/>
</root>
<logger name="library" level="DEBUG"/>
</then>
</if>
</configuration>
Ключевые моменты:
ThresholdFilter отсекает уровни ниже заданногоRollingFileAppender с TimeBasedRollingPolicy — ротация по дате и размеруУсловное включение через
<if> требует janino в зависимостях:<<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>3.1.11</version>
</dependency>
#Java #для_новичков #beginner #logging #Log4j2 #Logback #SLF4J #практика
👍4
Часть 2. Логирование операций в Library
Добавление книги: INFO
Удаление книги: WARN
Ошибка парсинга JSON: ERROR
#Java #для_новичков #beginner #logging #Log4j2 #Logback #SLF4J #практика
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;
public class Library {
private static final Logger log = LoggerFactory.getLogger(Library.class);
private static final Marker SECURITY = MarkerFactory.getMarker("SECURITY");
private final List<<Book> books = new ArrayList<>();
// ...
}
Добавление книги: INFO
public void addBook(Book book) {
MDC.put("operation", "addBook");
MDC.put("bookId", book.getId());
try {
Objects.requireNonNull(book, "Книга не может быть null");
if (findById(book.getId()).isPresent()) {
log.warn("Попытка добавить дубликат книги: id={}", book.getId());
throw new DuplicateBookException(book.getId());
}
books.add(book);
log.info("Книга добавлена: {} автор={} год={}",
book.getTitle(), book.getAuthor(), book.getYear());
} finally {
MDC.clear();
}
}Удаление книги: WARN
public void removeBook(String bookId) {
MDC.put("operation", "removeBook");
MDC.put("bookId", bookId);
try {
Book removed = findById(bookId)
.orElseThrow(() -> new BookNotFoundException(bookId));
books.remove(removed);
log.warn("Книга удалена: {} (автор={})",
removed.getTitle(), removed.getAuthor());
} finally {
MDC.clear();
}
}Ошибка парсинга JSON: ERROR
private List<<Book> parseBooks(String json) {
try {
return objectMapper.readValue(json, new TypeReference<List<<Book>>() {});
} catch (JsonProcessingException e) {
MDC.put("operation", "parseJson");
log.error("Ошибка парсинга JSON: длина={}, причина={}",
json.length(), e.getOriginalMessage(), e);
throw new LibraryException("Невалидный JSON", e);
} finally {
MDC.clear();
}
}#Java #для_новичков #beginner #logging #Log4j2 #Logback #SLF4J #практика
👍4
Часть 3. MDC для контекста операций
MDC (Mapped Diagnostic Context) — потоколокальное хранилище ключ-значение. Данные доступны в layout через
Обёртка для автоматической очистки
Использование:
Часть 4. Маркер SECURITY для критических операций
Удаление всех книг
Конфигурация обработки маркера
Добавьте в
Часть 5. Защита паролей и чувствительных данных
Проблема
Решение 1: маскирование в toString()
Решение 2: специальный метод для логирования
#Java #для_новичков #beginner #logging #Log4j2 #Logback #SLF4J #практика
MDC (Mapped Diagnostic Context) — потоколокальное хранилище ключ-значение. Данные доступны в layout через
%X{key}.Обёртка для автоматической очистки
public class MdcOperation implements AutoCloseable {
private final String operation;
public MdcOperation(String operation, String userId) {
this.operation = operation;
MDC.put("operation", operation);
MDC.put("userId", userId);
MDC.put("timestamp", Instant.now().toString());
}
@Override
public void close() {
MDC.remove("operation");
MDC.remove("userId");
MDC.remove("timestamp");
}
}Использование:
public void processBatch(List<<Book> newBooks, String userId) {
try (MdcOperation op = new MdcOperation("batchImport", userId)) {
log.info("Начало пакетного импорта: {} книг", newBooks.size());
for (Book book : newBooks) {
try {
addBook(book);
} catch (DuplicateBookException e) {
log.warn("Пропущен дубликат в пакете: {}", book.getId());
}
}
log.info("Завершён пакетный импорт: добавлено {} из {}",
newBooks.size(), newBooks.size());
}
}Часть 4. Маркер SECURITY для критических операций
Удаление всех книг
public void clearAllBooks(String userId, String reason) {
try (MdcOperation op = new MdcOperation("clearAll", userId)) {
int count = books.size();
log.info(SECURITY, "Запрос на удаление всех книг: причина='{}', пользователь={}",
reason, userId);
if (count == 0) {
log.warn("Попытка очистить пустую библиотеку");
return;
}
// Дополнительное подтверждение для критической операции
log.warn(SECURITY, "ВНИМАНИЕ: Удаление {} книг. Требуется подтверждение.", count);
books.clear();
log.error(SECURITY, "Библиотека полностью очищена: {} книг удалено пользователем {}",
count, userId);
}
}Конфигурация обработки маркера
Добавьте в
logback.xml отдельный appender для SECURITY:<<appender name="SECURITY_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/security.log</file>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [SECURITY] %X{userId} %X{operation} - %msg%n</pattern>
</encoder>
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator class="ch.qos.logback.classic.boo.JaninoEventEvaluator">
<expression>return marker != null && marker.contains("SECURITY");</expression>
</evaluator>
<OnMatch>ACCEPT</OnMatch>
<OnMismatch>DENY</OnMismatch>
</filter>
</appender>
<<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="ERROR_FILE"/>
<appender-ref ref="SECURITY_FILE"/>
</root>
Часть 5. Защита паролей и чувствительных данных
Проблема
// Опасно: пароль попадёт в лог
log.info("Авторизация: user={}, password={}", username, password);
Решение 1: маскирование в toString()
public class User {
private String login;
private String passwordHash; // храним хэш, не пароль
private String plainPassword; // только при создании, не логируем
@Override
public String toString() {
return "User[login=" + login + ", password=***]";
}
}Решение 2: специальный метод для логирования
public String toLogString() {
return "User[login=" + login + ", roles=" + roles + "]";
}#Java #для_новичков #beginner #logging #Log4j2 #Logback #SLF4J #практика
👍3
Решение 3: фильтр Logback для маскирования
Применение в
Решение 4: структурный подход — никогда не передавать пароль в лог
Практические задания
Задача 1: настройка окружений
Создайте три конфигурации:
Переключение через системное свойство:
Задача 2: метрики через логи
Добавьте логирование времени выполнения операций:
Соберите статистику по лог-файлу: среднее время, 95-й перцентиль.
Задача 3: аудит изменений
Реализуйте
Все операции
Задача 4: защита от случайного логирования пароля (звёздочка)
Напишите unit-test, который:
- перехватывает лог-вывод через
- проверяет, что при передаче
- падает, если пароль попал в лог чистым текстом
#Java #для_новичков #beginner #logging #Log4j2 #Logback #SLF4J #практика
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
public class PasswordMaskingFilter extends Filter<<ILoggingEvent> {
private static final Pattern PASSWORD_PATTERN =
Pattern.compile("(?i)(password|passwd|pwd)\\s*=\\s*[^\\s,}]+");
@Override
public FilterReply decide(ILoggingEvent event) {
String message = event.getFormattedMessage();
if (PASSWORD_PATTERN.matcher(message).find()) {
// Можно: заменить, отклонить, или передать с предупреждением
return FilterReply.DENY; // Полностью блокируем сообщение с паролем
}
return FilterReply.NEUTRAL;
}
}
Применение в
logback.xml:<<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="library.logging.PasswordMaskingFilter"/>
<!-- ... -->
</appender>
Решение 4: структурный подход — никогда не передавать пароль в лог
public void authenticate(String login, char[] password) {
// password — массив символов, не строка
log.info("Попытка авторизации: login={}", login);
boolean success = checkPassword(login, password);
if (success) {
log.info("Успешная авторизация: login={}", login);
} else {
log.warn("Неудачная авторизация: login={}", login);
}
// Очистка массива
Arrays.fill(password, '\0');
}Практические задания
Задача 1: настройка окружений
Создайте три конфигурации:
logback.xml — production (INFO в консоль, ERROR в файл, без DEBUG)logback-dev.xml — development (DEBUG в файл, подробный вывод)logback-test.xml — тесты (WARN и выше, минимальный вывод)Переключение через системное свойство:
-Dlogback.configurationFile=logback-dev.xmlЗадача 2: метрики через логи
Добавьте логирование времени выполнения операций:
public void addBookWithMetrics(Book book) {
long start = System.currentTimeMillis();
// ... операция ...
long duration = System.currentTimeMillis() - start;
log.info("Метрика: operation=addBook, durationMs={}", duration);
}Соберите статистику по лог-файлу: среднее время, 95-й перцентиль.
Задача 3: аудит изменений
Реализуйте
AuditLogger — отдельный логгер, записывающий все изменения в неизменяемый лог:<<appender name="AUDIT" class="ch.qos.logback.core.FileAppender">
<file>logs/audit.log</file>
<append>true</append>
<encoder>
<pattern>%d{ISO8601} %X{userId} %X{operation} %msg%n</pattern>
</encoder>
</appender>
Все операции
add, remove, clearAll должны дублироваться в audit-лог.Задача 4: защита от случайного логирования пароля (звёздочка)
Напишите unit-test, который:
- перехватывает лог-вывод через
ListAppender- проверяет, что при передаче
User с паролем в log.info пароль заменён на ***- падает, если пароль попал в лог чистым текстом
#Java #для_новичков #beginner #logging #Log4j2 #Logback #SLF4J #практика
👍4
Что выведет код?
#Tasks
import java.util.Arrays;
import java.util.List;
public class Task280526 {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(-5, -3, -1);
int max = numbers.stream().reduce(0, Integer::max);
System.out.println(max);
}
}
#Tasks
👍2
👍2🆒1
Как объявить константу в Java?🤓
Ответ:
Константа в Java — это переменная, значение которой нельзя изменить.
Объявляется с ключевыми словами static final. Принято имя писать заглавными буквами с подчеркиваниями: public static final double PI = 3.14159;. final означает, что ссылку нельзя переназначить (для примитивов — значение, для объектов — ссылку, но сам объект может быть изменяем).
Для неизменяемых объектов (например, String, LocalDate) final вместе с неизменяемостью даёт полную константу.
#собеседование
Ответ:
Константа в Java
Объявляется с ключевыми словами static final. Принято имя писать заглавными буквами с подчеркиваниями: public static final double PI = 3.14159;. final означает, что ссылку нельзя переназначить (для примитивов — значение, для объектов — ссылку, но сам объект может быть изменяем).
Для неизменяемых объектов (например, String, LocalDate) final вместе с неизменяемостью даёт полную константу.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
История технологии сегодня — 29 мая
ℹ️ Кто родился в этот день
Никола́й Серге́евич Бахва́лов (29 мая 1934, Москва — 29 августа 2005, Москва) — советский и российский математик, специалист по вычислительной математике. Академик РАН (1991), заслуженный деятель науки Российской Федерации (1994). Вычислительная и прикладная математика, численные методы, оптимизация алгоритмов, теория функций, математические проблемы механики неоднородных сред, в частности композитных материалов, задачи волновой физики, теория осреднения процессов в периодических средах (Государственная премия 1985 г.), многосеточные методы решения уравнений эллиптического типа (Государственная премия 2003 г.).
Пи́тер Уэр Хиггс (англ. Peter Ware Higgs; 29 мая 1929, Ньюкасл-апон-Тайн, Нортамберленд — 8 апреля 2024, Эдинбург) — британский физик-теоретик, профессор Эдинбургского университета. Лауреат Нобелевской премии по физике (2013) за предсказание бозона Хиггса. Прославился благодаря предложенному им в 1960-х годах механизму спонтанного нарушения электрослабой симметрии, объясняющему происхождение массы элементарных частиц и, в частности, масс векторных W- и Z-бозонов. Это открытие он сделал во время горной прогулки в районе Эдинбурга; вернувшись после неё в лабораторию, Хиггс заявил, что у него возникла «грандиозная идея». Механизм, носящий его фамилию, предсказывает существование новой частицы, хиггсовского бозона. Об открытии частицы было объявлено 4 июля 2012 года на пресс-конференции ЦЕРНа (сам Хиггс заявил по этому поводу, что не ожидал экспериментального подтверждения собственной теории при своей жизни). Открытие бозона Хиггса признано научным прорывом 2012 года. Ныне механизм Хиггса считается одним из основных компонентов Стандартной модели.
Алексе́й Миха́йлович Черёмухин (1895—1958) — советский авиационный конструктор, создатель первого советского вертолёта. Доктор технических наук (1937), профессор (1934). Заслуженный деятель науки и техники РСФСР. Лауреат Ленинской премии.
🌐 Знаковые события
1802 — физик и основоположник электрометаллургии академик В. В. Петров открыл явление электрической дуги.
1975 — на Белорусском автозаводе начато производство крупнейшего в СССР грузовика — «БелАЗ-7520».
#Biography #Birth_Date #Events #29мая
Никола́й Серге́евич Бахва́лов (29 мая 1934, Москва — 29 августа 2005, Москва) — советский и российский математик, специалист по вычислительной математике. Академик РАН (1991), заслуженный деятель науки Российской Федерации (1994). Вычислительная и прикладная математика, численные методы, оптимизация алгоритмов, теория функций, математические проблемы механики неоднородных сред, в частности композитных материалов, задачи волновой физики, теория осреднения процессов в периодических средах (Государственная премия 1985 г.), многосеточные методы решения уравнений эллиптического типа (Государственная премия 2003 г.).
Пи́тер Уэр Хиггс (англ. Peter Ware Higgs; 29 мая 1929, Ньюкасл-апон-Тайн, Нортамберленд — 8 апреля 2024, Эдинбург) — британский физик-теоретик, профессор Эдинбургского университета. Лауреат Нобелевской премии по физике (2013) за предсказание бозона Хиггса. Прославился благодаря предложенному им в 1960-х годах механизму спонтанного нарушения электрослабой симметрии, объясняющему происхождение массы элементарных частиц и, в частности, масс векторных W- и Z-бозонов. Это открытие он сделал во время горной прогулки в районе Эдинбурга; вернувшись после неё в лабораторию, Хиггс заявил, что у него возникла «грандиозная идея». Механизм, носящий его фамилию, предсказывает существование новой частицы, хиггсовского бозона. Об открытии частицы было объявлено 4 июля 2012 года на пресс-конференции ЦЕРНа (сам Хиггс заявил по этому поводу, что не ожидал экспериментального подтверждения собственной теории при своей жизни). Открытие бозона Хиггса признано научным прорывом 2012 года. Ныне механизм Хиггса считается одним из основных компонентов Стандартной модели.
Алексе́й Миха́йлович Черёмухин (1895—1958) — советский авиационный конструктор, создатель первого советского вертолёта. Доктор технических наук (1937), профессор (1934). Заслуженный деятель науки и техники РСФСР. Лауреат Ленинской премии.
1802 — физик и основоположник электрометаллургии академик В. В. Петров открыл явление электрической дуги.
1975 — на Белорусском автозаводе начато производство крупнейшего в СССР грузовика — «БелАЗ-7520».
#Biography #Birth_Date #Events #29мая
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
[Совет по Java #043]
Тема:
Проблема: Некоторые разработчики ошибочно полагают, что раз
Другие, наоборот, пытаются создать экземпляр
Решение: Используйте
Для работы с неизвестным числовым типом используйте
Объяснение:
Он объявляет абстрактные методы
#Java #советы
Тема:
java.lang.Number — абстрактный класс, нельзя создать экземпляр.Проблема: Некоторые разработчики ошибочно полагают, что раз
Number является абстрактным, то нельзя использовать его в полиморфном контексте или что методы вроде doubleValue() не будут работать для конкретных типов. Другие, наоборот, пытаются создать экземпляр
new Number() (что приводит к ошибке компиляции) или ожидают, что Number можно использовать как универсальный контейнер для любых чисел без потери точности. Также существует непонимание того, что Number не является супертипом для примитивов (int не является Number), а только для их оберток.Решение: Используйте
Number как полиморфный тип для методов, которые должны принимать любые числовые обертки (Integer, Double, Long, Float, Short, Byte, BigInteger, BigDecimal). Для получения числового значения вызывайте соответствующий метод: doubleValue(), intValue(), longValue() и т.д. Помните, что эти методы могут привести к потере точности (например, Double -> intValue()). Для работы с неизвестным числовым типом используйте
doubleValue() как наиболее универсальный (самый широкий диапазон). Если нужна точность, проверяйте тип через instanceof. Не создавайте Number напрямую.public class NumberPolymorphism {
//Полиморфный метод, принимающий любой числовой тип
public static double square(Number num) {
double d = num.doubleValue();
return d * d;
}
//С проверкой типа для сохранения точности
public static Number add(Number a, Number b) {
// Для точных вычислений нужно знать тип
if (a instanceof Integer && b instanceof Integer) {
return a.intValue() + b.intValue();
}
if (a instanceof Double || b instanceof Double) {
return a.doubleValue() + b.doubleValue();
}
if (a instanceof BigDecimal || b instanceof BigDecimal) {
return toBigDecimal(a).add(toBigDecimal(b));
}
return a.doubleValue() + b.doubleValue();
}
private static BigDecimal toBigDecimal(Number n) {
if (n instanceof BigDecimal) return (BigDecimal) n;
return BigDecimal.valueOf(n.doubleValue());
}
//Ошибка: Number абстрактный
// Number n = new Number(); // не компилируется
//Правильно: создаем конкретные типы
Number intNum = 42; // autoboxing -> Integer
Number doubleNum = 3.14; // autoboxing -> Double
Number longNum = 100L; // autoboxing -> Long
Number bigDec = new BigDecimal("123.45");
//Демонстрация полиморфизма
public static void main(String[] args) {
List<Number> numbers = Arrays.asList(10, 3.14, 100L, new BigDecimal("99.99"));
// Полиморфная обработка
for (Number n : numbers) {
System.out.println("Value: " + n);
System.out.println(" int: " + n.intValue());
System.out.println(" double: " + n.doubleValue());
System.out.println(" square: " + square(n));
}
//Потеря точности при преобразовании
Double precise = 123.456;
Number asNumber = precise;
int truncated = asNumber.intValue(); // 123 — потеряна дробная часть
System.out.println("Truncated: " + truncated);
}
}Объяснение:
Number — абстрактный класс, являющийся супертипом для всех числовых оберток в Java. Он объявляет абстрактные методы
intValue(), longValue(), floatValue(), doubleValue(), которые реализуются в каждом конкретном классе-наследнике. Полиморфизм работает стандартным образом: переменная типа Number может ссылаться на любой объект подкласса. При вызове, например, doubleValue() JVM динамически выбирает реализацию в соответствии с фактическим типом объекта. Важно помнить, что примитивные типы (int, double) не являются подтипами Number, но при автоупаковке они преобразуются в соответствующие обертки (Integer, Double).#Java #советы
👍5
Что выведет код?
#Tasks
import java.util.ArrayList;
import java.util.List;
public class Task290526 {
public static void main(String[] args) {
List<Number> numbers = new ArrayList<>();
numbers.add(10);
numbers.add(5.5);
numbers.add(3);
numbers.add(2L);
Number sum = numbers.get(0).intValue() + numbers.get(1).doubleValue();
System.out.println(sum.getClass().getSimpleName());
Number product = numbers.get(2).longValue() * numbers.get(3).longValue();
System.out.println(product.getClass().getSimpleName());
}
}
#Tasks
👍4
Варианты ответа:
Anonymous Quiz
20%
Integer / Long
67%
Double / Long
7%
Integer / Integer
7%
Double / Double
👍4
Что такое transient? Где применяется?🤓
Ответ:
transient — модификатор поля, указывающий, что это поле не должно участвовать в сериализации.
При десериализации такое поле получает значение по умолчанию (для объектов — null, для примитивов — 0, false, '\u0000').
Применяется для полей, которые:
1) являются производными (можно вычислить из других полей).
2) содержат конфиденциальную информацию (пароли, ключи).
3) не сериализуемы (например, Thread, Socket, FileInputStream).
Используется для уменьшения размера сериализованных данных и повышения безопасности.
#собеседование
Ответ:
transient
При десериализации такое поле получает значение по умолчанию (для объектов — null, для примитивов — 0, false, '\u0000').
Применяется для полей, которые:
1) являются производными (можно вычислить из других полей).
2) содержат конфиденциальную информацию (пароли, ключи).
3) не сериализуемы (например, Thread, Socket, FileInputStream).
Используется для уменьшения размера сериализованных данных и повышения безопасности.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
История технологии сегодня — 30 мая
ℹ️ Кто родился в этот день
Алексе́й Архи́пович Лео́нов (30 мая 1934, Листвянка, Западно-Сибирский край — 11 октября 2019, Басманный район, Москва) — лётчик-космонавт СССР № 11, первый человек в мире, вышедший в открытый космос. 18—19 марта 1965 года совместно с Павлом Беляевым совершил полёт в космос в качестве второго пилота на космическом корабле «Восход-2». В ходе полёта осуществил первый в истории космонавтики выход в открытый космос, проявив при этом исключительное мужество, особенно в нештатной ситуации, когда раздувшийся космический скафандр препятствовал его возвращению в космический корабль.
(от меня - великий человек, я встречался с ним лично, здоровался за руку).
Ха́ннес У́лоф Йёста Альве́н (Альфвен) (швед. Hannes Olof Gösta Alfvén; 30 мая 1908, Норрчёпинг — 2 апреля 1995, Юрсхольм) — шведский физик, специалист по физике плазмы, лауреат Нобелевской премии по физике в 1970 году за работы в области теории магнитогидродинамики. Внёс существенный вклад в физику плазмы, включая такие направления, как теории северного сияния, радиационных поясов Ван Аллена, эффект геомагнитных бурь на магнитное поле Земли, магнитосферы, в проблемы формирования хвостов комет и солнечной системы, динамики плазмы в галактике (плазменная космология).
🌐 Знаковые события
1900 — на Всемирной выставке в Париже датский инженер Вальдемар Поульсен представил изобретённый им прибор — телеграфон. По сути, это была магнитная лента для звукозаписи.
#Biography #Birth_Date #Events #30мая
Алексе́й Архи́пович Лео́нов (30 мая 1934, Листвянка, Западно-Сибирский край — 11 октября 2019, Басманный район, Москва) — лётчик-космонавт СССР № 11, первый человек в мире, вышедший в открытый космос. 18—19 марта 1965 года совместно с Павлом Беляевым совершил полёт в космос в качестве второго пилота на космическом корабле «Восход-2». В ходе полёта осуществил первый в истории космонавтики выход в открытый космос, проявив при этом исключительное мужество, особенно в нештатной ситуации, когда раздувшийся космический скафандр препятствовал его возвращению в космический корабль.
(от меня - великий человек, я встречался с ним лично, здоровался за руку).
Ха́ннес У́лоф Йёста Альве́н (Альфвен) (швед. Hannes Olof Gösta Alfvén; 30 мая 1908, Норрчёпинг — 2 апреля 1995, Юрсхольм) — шведский физик, специалист по физике плазмы, лауреат Нобелевской премии по физике в 1970 году за работы в области теории магнитогидродинамики. Внёс существенный вклад в физику плазмы, включая такие направления, как теории северного сияния, радиационных поясов Ван Аллена, эффект геомагнитных бурь на магнитное поле Земли, магнитосферы, в проблемы формирования хвостов комет и солнечной системы, динамики плазмы в галактике (плазменная космология).
1900 — на Всемирной выставке в Париже датский инженер Вальдемар Поульсен представил изобретённый им прибор — телеграфон. По сути, это была магнитная лента для звукозаписи.
#Biography #Birth_Date #Events #30мая
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2