Java | Фишки и трюки
Ir al canal en Telegram
Java: примеры кода, интересные фишки и полезные трюки Купить рекламу: https://telega.in/c/java_tips_and_tricks ✍️По всем вопросам: @Pascal4eg Менеджер по рекламе: @shmyzna
Mostrar más6 951
Suscriptores
+124 horas
-107 días
+1230 días
Archivo de publicaciones
6 951
Cамый простой способ изучить Java — залезть в голову профи
Один из лучших айтишников России учит базе кодинга в Telegram. Даже гуманитарий поймёт, как создавать приложения, сайты, игры и чат-боты.
Достаточно подписаться на «Секреты Java», где каждый день появляются гайды, готовые примеры кода и лучших практик.
И всё это бесплатно — вместо сотен тысяч рублей за курсы. Стартовать в прибыльной профессии с нуля вы сможете гораздо проще!
Теперь обучиться Java может каждый: @java_secrets
6 951
🖥 Оптимистичная и пессимистичная блокировка в базах данных
Оптимистичная блокировка предполагает, что конфликтов при параллельном доступе к данным будет мало. Изменения данных происходят без блокировки, но при попытке сохранения изменений проверяется, что данные не изменились с момента последнего чтения.
Алгоритм:
1️⃣ Чтение данных.
2️⃣ Обновление данных в памяти.
3️⃣ Попытка записи изменений с проверкой версии или временной метки.
4️⃣ Если данные были изменены другим процессом, транзакция откатывается и повторяется.
Например, можно использовать поле
version в таблице. При чтении данных запоминаем значения этого поля, а записываем данные с условием что поле version не изменилось. SQL-запрос может быть примерно таким:
update table set field1='data1', field2='data2', version=<version>+1 where id=<id> and version=<version>
После выполнения запроса нужно проверить сколько записей обновилось, если ни одной, то значит другой процесс изменил запись, и нужно начать с начала.
Пессимистичная блокировка предполагает, что конфликты будут частыми. Данные блокируются при чтении, чтобы предотвратить их изменение другими транзакциями до завершения текущей транзакции.
Алгоритм:
1️⃣ Чтение данных с блокировкой.
2️⃣ Обновление данных.
3️⃣ Запись изменений.
4️⃣ Снятие блокировки после завершения транзакции.
Как пример, может быть использован запрос SELECT ... FOR UPDATE для блокировки строк при чтении.
#java #database #optimistic #pessimistic #locking6 951
Изучи алгоритмы, чтобы работать в Яндекс или Google
Приходи на бесплатное обучение от FAANG School. Там ты узнаешь:
– Как использовать разные структуры данных
при решении задач
– Какие 20% усилий дают 80% результата
при подготовке к алгоритмам
– Prefix Sum и Sliding Window. 2 подхода, которые закрывают задачи на 200к$ во время собесов в Google
– Как научиться решать алгоритмы без матана
Спикер – Разработчик из BigTech. За 7 лет решил 500 задач на LeetCode, прошел 30 собеседований в компаниях уровня Google и Meta, а сейчас работает в одной из крупных IT-гигантов в мире.
Переходи и жми на кнопку «Принять участие», чтобы начать обучение.
6 951
⌨️ Где разрешена инициализация статических/нестатических полей?
✔️ Статические поля можно инициализировать при объявлении, в статическом или нестатическом блоке инициализации.
✔️ Нестатические поля можно инициализировать при объявлении, в нестатическом блоке инициализации или в конструкторе.
#java #initialization #static #nonstatic
6 951
⌨️ Функциональный интерфейс Supplier является частью пакета
java.util.function и предназначен для представления поставщика результатов. Этот интерфейс используется для работы с функциями, которые не принимают никаких аргументов и возвращают результат. Supplier часто используется в ленивой инициализации, генерации данных и других сценариях, где требуется получение значения без ввода.
Интерфейс Supplier аннотирован @FunctionalInterface, что означает, что он предназначен для использования с лямбда-выражениями и содержит ровно один абстрактный метод:
T get();
Возвращает результат типа T.
Пример:
Supplier<String> supplier = () -> "Hello, World!";
String message = supplier.get();
System.out.println(message); // Hello, World!
Еще один:
Supplier<Double> randomSupplier = Math::random;
Stream.generate(randomSupplier)
.limit(5)
.forEach(System.out::println);
// 5 дробных чисел от 0 до 1
#java #supplier6 951
Хочется попиарить один небольшой, но довольно активный и самое важное полезный телеграм канал Algorithmics. Канал сравнительно молодой, однако авторы не сбавляют темп своего повествования, а качество материала держится на достойном уровне от поста к посту.
На канале вы найдете множество материалов с решениями задач с Leetcode на Go и TypeScript и все то, что будет полезным для подготовки к собеседованиям, в частности, к алгосекции.
6 951
⌨️ В чем разница между членом экземпляра класса и статическим членом класса?
Модификатор
static говорит о том, что данный метод или поле принадлежат самому классу и доступ к ним возможен даже без создания экземпляра класса. Поля, помеченные static инициализируются при инициализации класса. На методы, объявленные как static, накладывается ряд ограничений:
✔️ Они могут вызывать только другие статические методы.
✔️ Они должны осуществлять доступ только к статическим переменным.
✔️ Они не могут ссылаться на члены типа this или super.
В отличии от статических, поля экземпляра класса принадлежат конкретному объекту и могут иметь разные значения для каждого. Вызов метода экземпляра возможен только после предварительного создания объекта класса.
Пример:
public class MainClass {
public static void main(String args[]) {
System.out.println(TestClass.v);
new TestClass().a();
System.out.println(TestClass.v);
}
}
public class TestClass {
public static String v = "Initial val";
{
System.out.println("!!! Non-static initializer");
v = "Val from non-static";
}
static {
System.out.println("!!! Static initializer");
v = "Some val";
}
public void a() {
System.out.println("!!! a() called");
}
}
Результат:
!!! Static initializer Some val !!! Non-static initializer !!! a() called Val from non-static#java #static
6 951
🚀 Готовься к переменам в мире IT с нашим практическим курсом по Domain Driven Design!
😰 Устал от запутанной инфраструктуры, вперемешку с бизнес логикой? Мы знаем, как это тяжело. Писать тесты становится неприятно и больно, приходится много мокать, тесты получаются огромными, хрупкими.. Но есть решение! Присоединяйся к нашему курсу, где мы разложим все по полочкам за 10 вебинаров, начиная с 17 июня.
🔝 Прими вызов и стань частью передовой волны технологического прогресса. Успей зарегистрироваться сейчас https://microarch.ru/courses/hexagonal-architecture?utm_source=posev&utm_medium=erid:2VtzqwL1BZQ&utm_campaign=11
🎓 На нашем курсе ты изучишь:
✅ Основы Domain-Driven Design и его важность для разработчиков.
✅ Создание эффективных и масштабируемых сервисов с использованием DDD.
✅ Применение шаблонов проектирования и принципов DDD для оптимизации кода и повышения производительности.
💡 Зачем тебе этот курс?
🌟 Плюс, ты получишь:
— Новые подходы к разработке, в том числе и использование подходов ядра и слоев в онион-архитектуре.
— Шанс быть первым внедрившим новые методы в отделе.
— Стань Senior Developer или Team Lead.
— Пиши код как профессионал, а не как в учебниках.
— Получи признание в компании и увеличь свою заработную плату.
🌟 Присоединяйся к нам прямо сейчас и стань экспертом в разработке успешных проектов: https://microarch.ru/courses/hexagonal-architecture?utm_source=posev&utm_medium=erid:2VtzqwL1BZQ&utm_campaign=11
Реклама. ИП Ветчинкин К.Е. ИНН: 773376451099 Erid: 2VtzqwL1BZQ
6 951
⌨️ Полезные стримы. Метод distinct()
Если у вас есть поток, который может содержать повторяющиеся элементы, используйте операцию
distinct(), чтобы удалить их.
var list = Arrays.asList(1, 2, 3, 3, 4, 5, 5);
var distinctList = list.stream()
.distinct()
.collect(Collectors.toList());
// distinctList: [1, 2, 3, 4, 5]
#java #stream #distinct6 951
Секрет IT-шников из Сбербанка
Видели эти требования в вакансиях? 30 лет опыта, диплом и еще куча опций, который совместит в себе только киборг-убийца.
На самом деле HR не ищут идеального биоробота и даже новичок сможет получить оффер в Сбер или Яндекс. Однако начинающие часто сомневаются:
– Да, важно знать Java, ООП, структуры данных… А вместо стандартных пет-проектов создать что-то более масштабное, использовать микросервисы и сложные фичи, но как именно это сделать?
– Как понять свой уровень знаний и готовность к работе?
– Как иметь уверенность, что со всем справитесь?
Чтобы помочь, в IT-школе FAANG School подготовили тест, где после ответов на 5 вопросов на бесплатной карьерной сессии вы узнаете, как именно вам получить позицию Java Junior в лучших IT-компаниях.
Для всех, кто пройдет его в течение 24 часов ребята дают бонус – гайд по поиску работы в IT.
Спойлер: с помощью знаний FAANG School 12 человек уже начали работу в штате Сбера, не считая других позиций и компаний 😏. Переходи, ты следующий.
6 951
⌨️ Функциональный интерфейс Function является частью пакета
java.util.function и предназначен для представления функций, принимающих один аргумент и возвращающих результат. Этот интерфейс широко используется в функциональном программировании и особенно полезен при работе с лямбда-выражениями и методами, которые принимают функции в качестве параметров.
Интерфейс Function аннотирован @FunctionalInterface, что означает, что он предназначен для использования с лямбда-выражениями и содержит ровно один абстрактный метод:
R apply(T t);
Принимает один аргумент типа T и возвращает результат типа R.
Пример:
Function<String, Integer> stringLength = String::length;
Integer length = stringLength.apply("Hello, World!");
System.out.println(length); // 13
Еще один:
Function<Double, Double> areaOfCircle = r -> Math.PI * r * r;
System.out.println(areaOfCircle.apply(5.0));
// 78.53981633974483
#java #function6 951
📌 Составили список лучших каналов для любого айтишника:
Java Developer — советы и практики от действующего Senior-разработчика
Python Developer — секреты и тонкости программирования на Python
Frontend Developer — готовый код и полезные ресурсы для любого фронтендера
6 951
Ссылки на методы — это способ упрощенного вызова методов или конструктора, который позволяет передавать их как аргументы в методы или сохранять в переменных. Ссылки на методы появились в Java 8 и являются частью улучшенной поддержки функционального программирования в языке.
Есть несколько видов ссылок на методы:
1️⃣ Ссылка на статический метод
Используется для вызова статических методов класса.
Синтаксис:
ContainingClass::staticMethodName
Пример:
import java.util.function.Function;
public class MethodReferenceExample {
public static void main(String[] args) {
Function<String, Integer> converter = Integer::parseInt;
Integer number = converter.apply("123");
System.out.println(number); // 123
}
}
2️⃣ Ссылка на метод экземпляра конкретного объекта
Используется для вызова методов экземпляра объекта.
Синтаксис:
containingObject::instanceMethodName
Пример:
import java.util.Arrays;
import java.util.List;
public class MethodReferenceExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(System.out::println);
}
}
3️⃣ Ссылка на метод экземпляра произвольного объекта определенного типа
Синтаксис:
ContainingType::methodName
Пример:
import java.util.function.Function;
public class FunctionExample {
public static void main(String[] args) {
Function<String, Integer> stringLength = String::length;
Integer length = stringLength.apply("Hello, World!");
System.out.println(length); // 13
}
}
Отличие от предыдущего вида в том, что в предыдущем ссылка на метод получается у конкретного объекта, стало быть вызовется метод этого объекта, а в нашем случае при получении ссылки на метод, мы знаем только метод, но объект у которого вызовется этот метод еще не известен, он будет предоставлен при вызове метода. Код выше будет означать "Hello, World!".length()
4️⃣ Ссылка на конструктор
Используется для вызова конструктора.
Синтаксис:
ClassName::new
Пример:
import java.util.function.Supplier;
public class MethodReferenceExample {
public static void main(String[] args) {
Supplier<MethodReferenceExample> exampleSupplier = MethodReferenceExample::new;
MethodReferenceExample example = exampleSupplier.get();
System.out.println(example); // MethodReferenceExample@<hashcode>
}
}
#java #MethodReference6 951
Git Разработчика - ваш надежный источник в мире IT!
Огромное количество исходников, книг и курсов, шпаргалок, мемов и много чего еще.
6 951
🌐 Bearer-токен — это тип авторизационного токена, который предоставляется пользователю после успешной аутентификации для доступа к защищенным ресурсам. Этот токен обычно представляет собой строку, которую пользователь должен передавать в заголовке HTTP-запроса для каждого запроса к защищенному сервису или приложению.
Bearer-токен используется для идентификации пользователя и предоставления доступа к его личным данным или другим защищенным ресурсам. Он должен храниться в безопасном месте и не передаваться третьим лицам.
Bearer-токен обеспечивает простой механизм аутентификации и авторизации пользователей без необходимости использования cookies или сессий. Он является частью стандарта аутентификации OAuth 2.0 и широко используется во многих современных веб-приложениях и API.
Пример запроса:
GET /api/resource HTTP/1.1 Host: example.com Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvZSBEb2UiLCJhZG1pbiI6dHJ1ZSwiaWF0IjoxNTE2MjM5MDIyfQ.SdUMMAsFFk83SHyqGjfQ1pt8v_8t4WZku5Ty3CLMaH4В данном примере Bearer token представлен в заголовке
Authorization. Вместо значения Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvZSBEb2UiLCJhZG1pbiI6dHJ1ZSwiaWF0IjoxNTE2MjM5MDIyfQ.SdUMMAsFFk83SHyqGjfQ1pt8v_8t4WZku5Ty3CLMaH4 должен быть ваш актуальный Bearer-токен для доступа к защищенным ресурсам.
Обычно, чтобы получить этот токен, нужно сделать запрос на авторизацию, и в ответе приходит этот токен.
Пример запроса:
POST /login HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: 52
{
"username": "admin",
"password": "admin"
}
Пример ответа:
{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvZSBEb2UiLCJhZG1pbiI6dHJ1ZSwiaWF0IjoxNTE2MjM5MDIyfQ.SdUMMAsFFk83SHyqGjfQ1pt8v_8t4WZku5Ty3CLMaH4","username":"admin"}
#java #OAuth #Bearer6 951
Стать айтишником №1 с доходом, как у Билла Гейтса? Есть один лёгкий способ
Держите под рукой нужные материалы. Код и дебаггинг станут в 2 раза проще:
— «Сайтодел» каждый день выкладывает готовые макеты, анимации, палитры и не только.
А бонусом вы освоите нейросеть, которая генерирует основу сайта за 1 минуту [смотрите, как её применяет Google]. Всё для веб-разработчика в одном месте.
— «Английский для прогера», если шарите за Python, а остальные языки обошли стороной.
Без духоты разберётесь в терминах и поедете на международный хакатон/в зарубежную командировку. [Первый результат увидите на этой неделе]
Когда знания в соседней вкладке, быстрее выбиться в сеньоры. Знаем по себе и рекомендуем сохранить:
→ Сайтодел;
→ Английский для прогера.
Первые 100 человек получат бонусные гайды бесплатно 🎁
6 951
⌨️ Можно ли объявить метод абстрактным и статическим одновременно?
Нет. В таком случае компилятор выдаст ошибку:
"Illegal combination of modifiers: ‘abstract’ and ‘static’".
Модификатор abstract говорит, что метод будет реализован в другом классе, а static наоборот указывает, что этот метод будет доступен по имени класса.
#java #abstract #static
¡Ya disponible! Investigación de Telegram 2025 — los principales insights del año 
