Java for Beginner
870 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
История технологии сегодня — 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]

Тема: 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.comparingIntcomparingLongcomparingDouble для примитивных типов, которые не требуют 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
Что выведет код?

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
Что такое instance initializer (нестатический блок)? Как он работает? 🤓

Ответ:

Нестатический блок инициализации — это { ... } внутри класса, без ключевого слова 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мая
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Раздел 10. Логирование и мониторинг в Java

Глава 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

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 через %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 &amp;&amp; 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 для маскирования

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
Что выведет код?

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
Варианты ответа:
Anonymous Quiz
7%
-1
64%
0
7%
-5
21%
Ошибка компиляции
👍2🆒1
Как объявить константу в Java?🤓

Ответ:

Константа в 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мая
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
[Совет по Java #043]

Тема: java.lang.Number — абстрактный класс, нельзя создать экземпляр.

Проблема: Некоторые разработчики ошибочно полагают, что раз Number является абстрактным, то нельзя использовать его в полиморфном контексте или что методы вроде doubleValue() не будут работать для конкретных типов.

Другие, наоборот, пытаются создать экземпляр new Number() (что приводит к ошибке компиляции) или ожидают, что Number можно использовать как универсальный контейнер для любых чисел без потери точности. Также существует непонимание того, что Number не является супертипом для примитивов (int не является Number), а только для их оберток.

Решение: Используйте Number как полиморфный тип для методов, которые должны принимать любые числовые обертки (IntegerDoubleLongFloatShortByteBigIntegerBigDecimal). Для получения числового значения вызывайте соответствующий метод: 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 динамически выбирает реализацию в соответствии с фактическим типом объекта. Важно помнить, что примитивные типы (intdouble) не являются подтипами Number, но при автоупаковке они преобразуются в соответствующие обертки (IntegerDouble).


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

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
👍4
Что такое transient? Где применяется?🤓

Ответ:

transient
 — модификатор поля, указывающий, что это поле не должно участвовать в сериализации.

При десериализации такое поле получает значение по умолчанию (для объектов — null, для примитивов — 0, false, '\u0000').

Применяется для полей, которые:
1) являются производными (можно вычислить из других полей).
2) содержат конфиденциальную информацию (пароли, ключи).
3) не сериализуемы (например, Thread, Socket, FileInputStream).

Используется для уменьшения размера сериализованных данных и повышения безопасности.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Всем доброго утра! 🏃

Не забываем заботиться о здоровье, ударники сидячего труда💪🫡🤣
👍5
История технологии сегодня — 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