ru
Feedback
Java | Фишки и трюки

Java | Фишки и трюки

Открыть в Telegram

Java: примеры кода, интересные фишки и полезные трюки Купить рекламу: https://telega.in/c/java_tips_and_tricks ✍️По всем вопросам: @Pascal4eg Менеджер по рекламе: @shmyzna

Больше
6 952
Подписчики
+124 часа
-107 дней
+1230 день
Архив постов
⌨️ Литералы — это явно заданные значения в коде программы — константы определенного типа, которые находятся в коде в момент запуска.

class Test {
   int a = 0b1101010110;
   public static void main(String[] args) {
       System.out.println("Hello world!");       
   }
}
В этом классе “Hello world!” — литерал. Переменная a - тоже литерал. Литералы бывают разных типов, которые определяются их назначением и способом написания. #java #literals

🌱 Spring Boot Actuator — это подмножество библиотек Spring Boot, которое предоставляет функции мониторинга и управления работающим приложением. Он добавляет несколько полезных средств для разработки, диагностики и управления приложениями, включая метрики, проверку состояния, аудит и прочее. Метрики (Metrics) Actuator собирает информацию о работе приложения, такую как использование памяти, процессора, количество запросов и их время обработки. Метрики могут быть доступны через конечные точки или интегрированы с системами мониторинга, такими как Prometheus, Graphite и другие. Конечные точки (Endpoints) Actuator предоставляет несколько конечных точек, которые можно использовать для получения информации о состоянии приложения. Некоторые из них: /actuator/health - возвращает информацию о состоянии приложения. /actuator/info - предоставляет общую информацию о приложении. /actuator/metrics - возвращает метрики приложения. /actuator/env - показывает текущее состояние окружения, включая системные свойства и переменные окружения. Проверка состояния (Health Checks) Actuator может проверять состояние различных компонентов приложения (например, баз данных, внешних сервисов и т.д.) и предоставлять общую оценку состояния. Аудит (Auditing) Ведение журнала событий приложения, таких как аутентификация пользователей или изменение конфигураций. HTTP-трейс (HTTP Tracing) Возможность отслеживания всех входящих HTTP-запросов и ответов. Для подключения нужно добавить зависимость:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
и добавить в файл конфигурации:
management.endpoints.web.exposure.include=health,info,metrics
management.endpoint.health.show-details=always
#java #actuator #health

Портфолио, которое хотят видеть рекрутеры Не тратьте время на пет-проекты. Сделайте проект на микросервисной структуре на Kaf
Портфолио, которое хотят видеть рекрутеры Не тратьте время на пет-проекты. Сделайте проект на микросервисной структуре на Kafka и заберите свой оффер в крупную IT-компанию. Все потому что проект не должен быть стандартным crud-приложением, а иметь в основе то, чего ждет каждый работодатель – микросервисы. Ребята из FAANG School подготовили полезную лекцию, где расскажут, как собрать идеальный проект для портфолио: – что ждет работодатель и какие темы выбрать для проекта – какой стек технологий самый востребованный – как перейти от древнего монолита к современным микросервисам – когда и зачем добавлять Kafka в проект-портфолио Участников ждут подарки: классный мерч, полезные материалы, возможность пройти индивидуальную карьерную сессию и грант на обучение. Переходите и забирайте Большую Шпаргалку по Kafka с подробной информацией об основных концепциях, характеристиках и способах использования одной из самых популярных технологий в разработке.

Что выведет код?
Anonymous voting

public class Quest {
    public static void main(String[] args) {
        System.out.println(calc(10, 5));
    }

    private static int calc(int i, int j) {
        int result = i + j;
        return result;

        result = i - j;
        return result;
    }
}

#java #meme
#java #meme

⌨️ Автоупаковка (autoboxing). Правила упаковки примитивных типов в классы-обертки Автоупаковка - это механизм неявной инициализации объектов классов-оберток (Byte, Short, Integer, Long, Float, Double, Character, Boolean) значениями соответствующих им исходных примитивных типов (byte, short, int...), без явного использования конструктора класса. Автоупаковка происходит при прямом присваивании примитива классу-обертке (с помощью оператора =), либо при передаче примитива в параметры метода (типа класса-обертки). Автоупаковке в классы-обертки могут быть подвергнуты как переменные примитивных типов, так и константы времени компиляции (литералы и final-примитивы). При этом литералы должны быть синтаксически корректными для инициализации переменной исходного примитивного типа. Автоупаковка переменных примитивных типов требует точного соответствия типа исходного примитива типу класса-обертки. Например, попытка упаковать переменную типа byte в Short, без предварительного явного приведения byte в short вызовет ошибку компиляции. Автоупаковка констант примитивных типов допускает более широкие границы соответствия. В этом случае компилятор способен предварительно осуществлять неявное расширение/сужение типа примитивов: ✔️ неявное расширение/сужение исходного типа примитива до типа примитива, соответствующего классу-обертке (для преобразования int в Byte, сначала компилятор самостоятельно неявно сужает int к byte) ✔️ автоупаковку примитива в соответствующий класс-обертку. Однако, в этом случае существуют два дополнительных ограничения: a) присвоение примитива обертке может производится только оператором = (нельзя передать такой примитив в параметры метода без явного приведения типов) b) тип левого операнда не должен быть старше чем Character, тип правого не должен старше, чем int: допустимо расширение/сужение byte в/из short, byte в/из char, short в/из char и только сужение byte из int, short из int, char из int. Все остальные варианты требуют явного приведения типов). Дополнительной особенностью целочисленных классов-оберток, созданных автоупаковкой констант в диапазоне -128 ... +127 является то, что они кэшируются JVM. Поэтому такие обертки с одинаковыми значениями будут являться ссылками на один объект. #java #autoboxing

Использование брокера сообщений Apache Kafka в распределенных очередях Вебинар 24 июля в 20:00 мск.: https://otus.pw/Fxjms/ ❓
Использование брокера сообщений Apache Kafka в распределенных очередях Вебинар 24 июля в 20:00 мск.: https://otus.pw/Fxjms/ ❓Хотите узнать, как эффективно управлять сообщениями в масштабируемых распределенных системах? Тогда этот открытый вебинар для вас!  Мы разберем основы и архитектуру Apache Kafka, принципы работы с распределенными очередями, а также научимся настраивать и развертывать кластер Kafka в Docker. Вы увидите реальные примеры использования Kafka для обмена сообщениями между сервисами и узнаете о лучших практиках и рекомендациях по интеграции Kafka в ваши проекты. 💻 Урок будет полезен Fullstack и Backend-разработчикам, DevOps-инженерам, архитекторам ПО и администраторам систем, а также всем, кто хочет углубить свои знания об Apache Kafka и его применении. 🔴 Регистрация открыта: https://otus.pw/Fxjms/?erid=LjN8KaeKd

Что выведет код?
Anonymous voting

public class Quest {
    public static void main(String[] args) {
        System.out.println(concat1() < concat2());
    }
    private static long concat1() {
        long start = System.nanoTime();
        String s = "";
        for (int i = 0; i < 1000; i++) {
            s += "-" + i;
        }
        return System.nanoTime() - start;
    }

    private static long concat2() {
        long start = System.nanoTime();
        StringBuilder s = new StringBuilder();
        for (int i = 0; i < 1000; i++) {
            s.append("-" + i);
        }
        return System.nanoTime() - start;
    }
}
#java #quest

Привет! Меня зовут Саша Аксёнов, мне 28 лет, живу в Питере. Я — фаундер IT-компании Unistory и автор Телеграм-канала Unicorn
+1
Привет! Меня зовут Саша Аксёнов, мне 28 лет, живу в Питере. Я — фаундер IT-компании Unistory и автор Телеграм-канала Unicorn story. В своих проектах делаем нестандартные вещи на базе web3 и ML. Что-то по-настоящему новое вместо того, чтобы пилить сайты на Битриксе или обложки для Chat GPT. Подписывайся на мой Телеграм-канал — здесь я пощу мемы, рассказываю про децентрализованный AI, индусский код и синдром самозванца. А еще — публикую вакансии для разработчиков, менеджеров, дизайнеров и вообще любых талантливых чуваков.

⌨️ Приведение типов. Понижение и повышение типа Java является строго типизированным языком программирования, а это означает, то что каждое выражение и каждая переменная имеет строго определенный тип уже на момент компиляции. Однако определен механизм приведения типов (casting) - способ преобразования значения переменной одного типа в значение другого типа. В Java существуют несколько разновидностей приведения: ✔️ Тождественное (identity). Преобразование выражения любого типа к точно такому же типу всегда допустимо и происходит автоматически. ✔️ Расширение (повышение, upcasting) примитивного типа (widening primitive). Означает, что осуществляется переход от менее емкого типа к более ёмкому. Например, от типа byte (длина 1 байт) к типу int (длина 4 байта). Такие преобразование безопасны в том смысле, что новый тип всегда гарантировано вмещает в себя все данные, которые хранились в старом типе и таким образом не происходит потери данных. Этот тип приведения всегда допустим и происходит автоматически. ✔️ Сужение (понижение, downcasting) примитивного типа (narrowing primitive). Означает, что переход осуществляется от более емкого типа к менее емкому. При таком преобразовании есть риск потерять данные. Например, если число типа int было больше 127, то при приведении его к byte значения битов старше восьмого будут потеряны. В Java такое преобразование должно совершаться явным образом, при этом все старшие биты, не умещающиеся в новом типе, просто отбрасываются - никакого округления или других действий для получения более корректного результата не производится. ✔️ Расширение объектного типа (widening reference). Означает неявное восходящее приведение типов или переход от более конкретного типа к менее конкретному, т.е. переход от потомка к предку. Разрешено всегда и происходит автоматически. ✔️ Сужение объектного типа (narrowing reference). Означает нисходящее приведение, то есть приведение от предка к потомку (подтипу). Возможно только если исходная переменная является подтипом приводимого типа. При несоответствии типов в момент выполнения выбрасывается исключение ClassCastException. Требует явного указания типа. ✔️ Преобразование к строке (to String). Любой тип может быть приведен к строке, т.е. к экземпляру класса String. ✔️ Запрещенные преобразования (forbidden). Не все приведения между произвольными типами допустимы. Например, к запрещенным преобразованиям относятся приведения от любого ссылочного типа к примитивному и наоборот (кроме преобразования к строке). Кроме того, невозможно привести друг к другу классы, находящиеся на разных ветвях дерева наследования и т.п. При приведении ссылочных типов с самим объектом ничего не происходит, - меняется лишь тип ссылки, через которую происходит обращение к объекту. Для проверки возможности приведения нужно воспользоваться оператором instanceof:

Parent parent = new Child();
if (parent instanceof Child) {
    Child child = (Child) parent;
}
#java #casting #upcasting #downcasting

Большинство разработчиков стремится повысить свой грейд, но как и куда расти, если ты амбициозный мидл или уже синьор? Откуда
Большинство разработчиков стремится повысить свой грейд, но как и куда расти, если ты амбициозный мидл или уже синьор? Откуда брать насмотренность и опыт, если ты ограничен задачами своей компании, а одними статьями на Хабре проблему не решить? Чтобы расти в профессии и получать крутые офферы, разработчик может прокачать навык построения архитектуры. Он может собрать библиотеку из каналов, статей и видео или пройти полноценный курс. Курс «Архитектор ПО» от Практикума поможет развить навык решения архитектурных задач. Техлиды Яндекса и других компаний покажут противоположные архитектурные подходы. Благодаря этому разработчику не придётся учиться на своих ошибках — он научится на опыте коллег. За 6 месяцев курса он разработает и добавит в портфолио 5 архитектур. Курс подойдёт бэкенд-разработчикам, которые: — работают 2+ лет; — хотят развиваться на текущей позиции и повышать свой грейд; — хотят получить должность лида или архитектора ПО. Успейте записаться на близжайший поток по ссылке

⌨️ Класс Objects Этот класс состоит из статических служебных методов для работы с объектами или проверки определенных условий перед операцией. Класс финальный и создать его не получится, об этом позаботились разработчики:

public final class Objects {
    private Objects() {
        throw new AssertionError("No java.util.Objects instances for you!");
    }
    ...
}
Метод equals для NPE-безопасного сравнения объектов:

public static boolean equals(Object a, Object b) {
    return (a == b) || (a != null && a.equals(b));
}
Метод toString для NPE-безопасного преобразования объекта в строку:

public static String toString(Object o) {
    return String.valueOf(o);
}
Метод toString с дефолтным значением для случая если объект равен null:

public static String toString(Object o, String nullDefault) {
    return (o != null) ? o.toString() : nullDefault;
}
Метод requireNonNull позволяет чекнуть объект на null:

public static <T> T requireNonNull(T obj) {
    if (obj == null)
        throw new NullPointerException();
    return obj;
}
Забавные методы isNull и nonNull проверяют переменную на null и на не null:

public static boolean isNull(Object obj) {
    return obj == null;
}

public static boolean nonNull(Object obj) {
    return obj != null;
}
#java #Objects #NPE

Frontend теперь в телеграм! Собрали крупные русскоязычные каналы, где вы найдете всю информацию о последних трендах и лучших
Frontend теперь в телеграм! Собрали крупные русскоязычные каналы, где вы найдете всю информацию о последних трендах и лучших практиках: Логово Верстальщика научит верстать продающие сайты. Node.JS поможет узнать все тонкости и секреты JavaScript и его фреймворков. Frontender's notes советы и полезные приемы для каждого разработчика.

Что выведет код?
Anonymous voting

public class Quest {
    public static void main(String[] args) {
        Short b = 50;
        inc(b);
        System.out.println(b);
    }
    private static void inc(Short num) {
        num++;
    }
}

Java Джуниоры! Важное объявление FAANG School в течение 24 часов отдают бесплатно свою библиотеку знаний. Вы можете получить
Java Джуниоры! Важное объявление FAANG School в течение 24 часов отдают бесплатно свою библиотеку знаний. Вы можете получить доступ: – Подробный гайд, как найти работу в IT без опыта – Подборка платформ с вакансиями для java-разработчиков – Пошаговая RoadMap по Java – Мануал по Docker. Основные команды и концепции – Микросервисы. Вопросы с собеседований – Шпаргалка с горячими клавишами JetBrains IDE. Ускоришь работу в 10 раз – Desk setup. Подборка аксессуаров для комфортной работы Библиотека знаний постоянно пополняется, но бесплатный доступ длится всего сутки. Чтобы получить полезные материалы, переходи по ссылке и жми на оранжевую кнопку.

🖥 UPSERT (Update or Insert) в PostgreSQL Позволяет вставлять новые записи в таблицу или обновлять существующие, если они уже присутствуют. Это удобная операция для предотвращения дублирования данных и упрощения логики обработки записей. Есть две опции что должно происходить при конфликте при вставке: DO UPDATE и DO NOTHING. Тут все понятно из названия, или обновить запись или ни делать ничего.

INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...)
ON CONFLICT (conflict_target) 
DO UPDATE SET column1 = value1, column2 = value2, ...;
conflict_target это колонка или набор колонок, которые используются для определения конфликта, обычно это первичный ключ или уникальный индекс. conflict_target можно не указывать и тогда при любом конфликте (дублируется первичный ключ, нарушение уникального индекса и тд.) сработает UPDATE или ничего. Пример:

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username TEXT UNIQUE,
    email TEXT
);

INSERT INTO users (id, username, email)
VALUES (1, 'user1', 'user1@example.com')
ON CONFLICT
DO NOTHING;

INSERT INTO users (id, username, email)
VALUES (1, 'user1', 'user1@example.com')
ON CONFLICT
DO NOTHING;
Первый INSERT добавит запись, а второй ничего не сделает, так как произойдет дублирование первичного ключа. #java #PostgreSQL #upsert #update #insert

Что выведет код?
Anonymous voting