Секреты Java
前往频道在 Telegram
Обсуждаем Java, архитектуру, фреймворки и всё, о чем должны говорить разработчики. Владелец: @Alexey_Morl Реклама на бирже: https://telega.in/c/java_secrets
显示更多7 991
订阅者
无数据24 小时
无数据7 天
无数据30 天
帖子存档
7 991
Как разобраться в вышмате за 1 вечер? 😨
Да никак. Но можно научиться понимать математику. И сэкономить месяцы жизни, килограмм нервов и сил.
И поможет вам в этом единственный канал в телеграме о высшей математике. Его автор - выпускник СПБГУ, а ныне — преподаватель предмета.
На простом языке разбирает сложные вещи, даёт шпаргалки и проводит эфиры с решением задач 📈
Находка для студентов и тех, кому нужен вышмат по работе. От полезных материалов и книг до ответов на вопросы и уроков.
Посмотрите сами 👉 @lav_math
7 991
✅ Вызов конструктора из другого конструктора
После одного из тестов были вопросы по поводу вызова одного конструктора из другого. Давайте пройдемся по этой теме.
Для чего нам вообще вызывать один конструктор из другого? Это позволяет нам избежать дублирования кода, когда несколько конструкторов имеют общую инициализацию.
При вызове одного конструктора из другого используется ключевое слово this и за ним следует список аргументов, передаваемых в вызываемый конструктор. Вы можете использовать вызов только одного конструктора и это должно быть первым оператором в теле вашего конструктора!
Рассмотрим пример:
public class MyClass {
private int x;
// Конструктор по умолчанию
public MyClass() {
this(0); // Вызов конструктора с одним аргументом
}
// Конструктор с одним аргументом
public MyClass(int x) {
this.x = x;
//может быть еще какая-то логика
}
}
В примере выше MyClass имеет два конструктора:
1. Конструктор по умолчанию вызывает конструктор с одним аргументом, передавая ему значение по умолчанию.
2. Конструктор с одним аргументом инициализирует поле класса значением, переданным в аргументе.
Если у нас есть дочерний класс:
class ChildClass extends MyClass {
public ChildClass() {
super(1);
}
}
Мы точно так же можем вызвать конструктор родительского класса, но с помощью ключевого слова super. Правила все те же, что и для ключевого слова this!
Обратите внимание, что можно записать и таким образом:
class ChildClass extends MyClass {
public ChildClass() {
}
}
Тогда неявно вызовется конструктор родительского класса по умолчанию. Помните правило - конструктор родительского класса вызывается всегда! Если его не вызвали вы явно, его вызовет компилятор (при наличии конструктора по умолчанию родительского класса) или он же сообщит, что нужно вызвать явно (при отсутствии конструктора по умолчанию родительского класса).
🫡 Секреты Java
#constructor7 991
✅ Map.merge()
Java 8 в своей время подарила нам много интересных полезностей, одна из который - это метод
merge() у Map.
Метод merge() позволяет нам "объединить" (или "сделать слияние" от англ. "merge") значения с указанным ключом.
Если ключ присутствует в Map, метод использует принимаемую функцию для вычисления нового значения. Если ключ отсутствует, новое значение просто вставляется в Map.
Сигнатура метода merge():
V merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction)
▫️key: ключ, к которому применяется операция объединения.
▫️value: новое значение, которое нужно объединить с существующим значением.
▫️remappingFunction: функция, которая принимает старое и новое значения и возвращает результат объединения.
Так же если remappingFunction возвращает null - ключ удаляется из мапы.
Пример использования метода merge():
Map<String, Integer> scores = new HashMap<>();
scores.put("John", 10);
scores.put("Jane", 20);
// Объединение значений существующего ключа "John" с новым значением 5
scores.merge("John", 5, Integer::sum); // Результат: {"John"=15, "Jane"=20}
// Вставка новой записи, так как ключ "Alice" отсутствует
scores.merge("Alice", 30, Integer::sum); // Результат: {"John"=15, "Jane"=20, "Alice"=30}
В этом примере, сначала мы объединяем значение существующего ключа "John" (10) с новым значением 5 при помощи функции Integer::sum, что дает результат 15. Затем мы вставляем новую запись с ключом "Alice" и значением 30, так как ключ "Alice" отсутствует в Map.
До Java 8 вам пришлось бы делать, что то вроде:
if (scores.containsKey("John")) {
scores.put("John", Integer.sum(scores.get("John"), 5));
} else {
scores.put("John", 5);
}
Не очень красиво, верно?
Метод merge() является полезным инструментом для работы с Map, позволяя эффективно обрабатывать ситуации, когда необходимо объединить или обновить значения существующих ключей в Map.
🫡 Секреты Java
#map #java87 991
Хочешь практиковать Java на реальных задачах? В поисках оригинального контента, а не копипаста из других источников?
👉 Заходи на новый канал 👈
Топовые задачи:
— Много вопросов по concurrency и jvm
— Разбираем стандартные ошибки и их решения
— Оптимизируем код
— Best practices
— Задачи с реальных собеседований
— Разный уровень сложности
— Подробный разбор каждого решения
Достойный материал для подготовки к собеседованиям, а также сложные и интересные задачи из реальной практики.
Автор канала – Java-эксперт, более 10 лет в разработке. Опытный Lead dev и тимлид группы девелоперов. Работал с различными базами данных – Relational databases, NoSQL databases, Caching systems, Full-Text Search engines, Big Data systems
👉 Подписывайся и попробуй решить последнюю задачу! https://t.me/java_interview_tasks
7 991
✅ Thread.join()
Метод
join() в классе Thread используется для ожидания одним потоком завершения выполнения другого потока.
Как он работает:
▫️Поток вызывает метод join() на другом потоке, который нужно дождаться.
▫️Поток, который вызвал метод join(), переходит в состояние ожидания до тех пор, пока целевой поток не завершит свое выполнение.
▫️После того, как целевой поток завершает свое выполнение, поток, вызвавший метод join(), продолжает свое выполнение.
Давайте на примере:
public class Main {
@SneakyThrows
public static void main(String[] args) {
var thread = new Thread(() -> {
System.out.println("Thread started");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {}
System.out.println("Thread finished");
});
thread.start();
thread.join(); // Ожидание завершения потока thread
System.out.println("Main thread finished");
}
}
Этот пример создает поток (thread), который выполняется параллельно. После запуска этого потока, для него вызывается метод join(), что заставляет главный поток ожидать завершения их выполнения. Когда потока thread завершает свое выполнение, главный поток продолжает свое выполнение.
Вывод будет:
Thread started
Thread finished
Main thread finished
А можно подождать только определенное время:
public class Main {
@SneakyThrows
public static void main(String[] args) {
var thread = new Thread(() -> {
System.out.println("Thread started");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {}
System.out.println("Thread finished");
});
thread.start();
thread.join(1000);
System.out.println("Can not wait anymore");
}
}
Вывод:
Thread started
Can not wait anymore
Thread finished
В этом примере главный поток подождет только 1 секунду, и не дождавшись продолжит свое выполнение.
🫡 Секреты Java
#multithreading #thread7 991
В мае стартует новая программа «Java разработчик. Уровень Специалист».
Обучение проходит в мини-группе с преподавателем и живой практикой. Часть материалов — для самообучения.
Программа включает в себя:
📌 Применение ООП и функциональной парадигмы,
📌 Spring Framework,
📌 работу с БД,
📌 архитектуру REST,
📌 вспомогательные инструменты Java-разработчика,
📌 продвинутые аспекты применения Java,
📌 стандартную библиотеку Java II.
👉 Узнать подробнее 👈
Бонусы:
✔️ всем, кто запишется на программу до 17 мая, предоставляем бесплатный доступ к первым 5 урокам на 3 дня
✔️ подготовка к сдаче Java-сертификации и скидка 50% на ее прохождение
✔️ бесплатный курс «Разработка на Java и Spring с помощью Chat GPT: от составления ТЗ до модульного тестирования»
Реклама. АНО ДПО "УЦ ИБС". ИНН 7713388004. erid: LjN8K5hw8
7 991
✅ URL, URI и URN: чем они отличаются? часть 2
Продолжение поста.
▫️URI (Uniform Resource Identifier/Уникальный Идентификатор Ресурса)
Из стандарта URI:
URI может классифицироваться как указатель, имя или и то, и другое. Термин URL относится к подмножеству URI, которое, помимо идентификации ресурса, предоставляет средства определения местоположения ресурса (например, его «расположение» в сети).Таким образом URI может указывать на расположение ресурса, а может быть именем ресурса, а может быть и тем и другим. Чтобы было понятнее, представим человека, которого зовут, например, Шерлок Холмс и живет он по адресу Лондон, Бейкер-стрит, 221b. Чтобы найти этого человека мы можем искать его по адресу проживания либо позвать его по имени (громко на весь Лондон). И если вернуться к терминологии, то его URN - это его имя, которое является и уникальным идентификатором (при условии, что нет, не было и не будет кроме него человека с таким именем), URL - его адрес проживания, по которому его так же можно уникально идентифицировать (при условии, что он живет там один). Его имя и его адрес уникально идентифицируют его и являются URI. 🫡 Секреты Java #urn #url #uri
7 991
✅ URL, URI и URN: чем они отличаются? часть 1
URL, URI и URN - это основные термины для идентификации ресурсов в интернете и мы часто их встречали (особенно первые два).
Давайте попробуем разобраться в них.
▫️URL (Uniform Resource Locator/Унифицированный указатель местоположения ресурса)
Указывает расположение ресурса и схему доступа к нему. Из стандарта URL:
URL-адреса используются для «определения расположения» ресурсов путем предоставления абстрактной идентификации расположения ресурса. Обнаружив ресурс, система может выполнять с ним различные операции, которые можно охарактеризовать такими словами, как «доступ», «обновление», «замена», «поиск атрибутов».Любой URL можно представить в виде
<scheme>:<scheme-specific-part>
Где <scheme> - это схема обращения к ресурсу (чаще всего это сетевой протокол), a <scheme-specific-part> - часть URL специфичная для этой схемы.
Например для протокола http, URL будет вида:
http://<host>:<port>/<path>?<searchpart>
а для Telnet:
telnet://<user>:<password>@<host>:<port>/
▫️URN (Uniform Resource Name/Унифицированное имя ресурса)
Из стандарта URN:
Унифицированные имена ресурсов (URN) предназначены для использования в качестве постоянных, независимых от местоположения, идентификаторов ресурсов и предназначены для облегчения сопоставления других пространств имен (которые разделяют свойства URN) с URN-пространством.URN определяет уникальное имя ресурса, и в отличии от URL, не содержит данных о местоположении ресурса и способе доступа к нему. URN появилась, чтобы закрыть недостатки URL - ресурсы перемещаются по сети, а URL остаются, указывая на уже отсутствующие ресурсы. А URN постоянны и не зависят от систем и протоколов. Пример URN:
urn:isbn:9785389049949
Этот URN идентифицирует книгу по ее ISBN номеру, где isbn - идентификатор пространства имён, а 9785389049949 - строка из данного пространства имен(как идентификатор в пространстве).
🫡 Секреты Java
#urn #url #uri7 991
Программы должны писаться для людей, которые будут их читать, а машины, которые будут эти программы исполнять — второстепенны.© Гарольд Абельсон 🫡 Секреты Java #quotes
7 991
Майские скидки!
Профессия «Java-разработчик»
🎁 Получите скидку до 80 900 р. Успейте получить специальное предложение до 14 мая!
Освойте язык крупного бизнеса и финансовых технологий и научитесь разрабатывать веб-приложения на фреймворке Spring.
Уже во время обучения вы вступите в программу «Карьерный трек», чтобы найти свою первую работу в IT.
Вы научитесь подбирать правильные структуры для хранения и обработки данных, познакомитесь с автоматизированным тестированием и напишите свои первые модульные тесты.
📌 Пройдите 5 бесплатных уроков и поймите, подходит ли вам профессия!
7 991
✅ Аннотация @Value в Spring
Аннотация
@Value в Spring Framework позволяет внедрять значения свойств прямо в поля, конструкторы или параметры методов Spring-компонентов. Это удобный способ управлять настройками приложения из внешних файлов конфигурации или переменных окружения.
Примеры использования
Допустим, у нас есть файл application.properties:
app.server.value=My value
И поле в нужном нам классе:
@Value("${app.server.value}")
private String value;
По умолчанию Spring будет искать это свойство в application.properties(yml), но можно указать другой файл с помощью аннотации @PropertySource:
@Configuration
@PropertySource("classpath:another.properties")
public class Config {
@Value("${app.server.value}")
private String value;
...
}
Причем интересно, что Spring сначала все таки попробует найти значение в application.properties и если не найдет, пойдет искать в указанный файл.
И это только начало!
Внедряйте значение прямо из аннотации:
@Value("My valyue")
private String value;
Или установите дефолтное значение:
@Value("${app.server.value:some default value}")
private String value;
@Value может быть использована для внедрения значений переменных окружения или системных свойств. Если вы зададите системное свойство, то у него будет приоритет перед файлами свойств.
Можно внедрять и массив значений:
app.server.value=first, second, third
Свойство выше будет установлено в массив:
@Value("${app.server.values}")
private String[] values;
Значения, внедряемые с помощью @Value, могут содержать выражения SpEL (Spring Expression Language), что позволяет проводить сложные преобразования и комбинировать значения в различных контекстах, но это тема отдельного поста.
Напомню еще раз - все вышеуказанные варианты можно применять и для параметров конструкторов и методов.
Аннотация @Value предоставляет удобный способ внедрять значения из внешних источников в Spring-компоненты, что делает конфигурацию приложения более гибкой и управляемой.
🫡 Секреты Java
#spring #value