Java | Фишки и трюки
7.21K subscribers
182 photos
29 videos
6 files
40 links
Java: примеры кода, интересные фишки и полезные трюки

Купить рекламу: https://telega.in/c/java_tips_and_tricks

✍️По всем вопросам: @Pascal4eg
Download Telegram
public class Quest {
private final String name;

Quest(String name) {
this.name = name;
}

private String name() {
return name;
}

private void reproduce() {
new Quest("reproduce") {
void printName() {
System.out.println(name());
}
}.printName();
}

public static void main(String[] args) {
new Quest("main").reproduce();
}
}


#java #quest
3
Что выведет код?
Anonymous Quiz
28%
reproduce
19%
main
53%
<Ошибка компиляции>
🤯81🎉1
⌨️ Optional это полезная фишка языка, которая помогает работать с возможными null значениями, избегая проблем с NullPointerException.

Optional оборачивает значение, которое может быть либо пустым, либо присутствующим, и предоставляет методы для работы с этим значением безопасным способом.

Пример использования:

Optional<String> name = Optional.ofNullable(getUserName());
name.ifPresent(n -> System.out.println("Имя пользователя: " + n));


Если значение есть, оно выводится на экран. Если значение null, программа просто пропустит это место, и не возникнет исключения. Также можно задать значение по умолчанию:

String defaultName = name.orElse("Гость");
System.out.println(defaultName);


Это делает код более устойчивым к ошибкам и улучшает его читаемость.

#java #Optional
Please open Telegram to view this post
VIEW IN TELEGRAM
👍123
⌨️ Ещё одна мощная фишка Java — это try-with-resources, которая значительно упрощает работу с ресурсами (например, файлами или сетевыми соединениями) и автоматически закрывает их после использования.

Обычно ресурсы, такие как файлы или потоки, нужно явно закрывать, чтобы избежать утечек. Но с помощью конструкции try-with-resources Java автоматически закроет ресурсы, когда они больше не нужны, даже если возникнет исключение.

Пример работы с файлом:

try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}


В этом коде BufferedReader автоматически закроется после выполнения блока try, что исключает риск утечки ресурсов. Эта конструкция делает код более чистым и безопасным.

#java #tryWithResources
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63👏1
⌨️ Pattern Matching для instanceof

Начиная с Java 16, проверка типов с помощью instanceof стала гораздо удобнее благодаря Pattern Matching. Раньше, после проверки объекта на принадлежность к определённому классу, нужно было выполнять явное приведение типа. Теперь это можно сделать в одной строке.

Пример до Java 16:

if (obj instanceof String) {
String str = (String) obj;
System.out.println(str.length());
}


Пример с Pattern Matching:

if (obj instanceof String str) {
System.out.println(str.length());
}


Теперь после instanceof можно сразу же использовать объект нужного типа в коде, что делает программу более читабельной и компактной.

#java #PatternMatching #instanceof
Please open Telegram to view this post
VIEW IN TELEGRAM
👍261
⌨️ Immutable Collections (неизменяемые коллекции)

Неизменяемые коллекции обеспечивают безопасность от случайных изменений данных, что особенно полезно в многопоточных приложениях или когда нужно гарантировать, что данные не будут изменены.

Вместо того чтобы создавать обычные коллекции и вручную делать их неизменяемыми с помощью метода Collections.unmodifiableList(), теперь можно легко создать неизменяемую коллекцию с помощью новых фабричных методов.

Пример создания неизменяемого списка:

List<String> names = List.of("Иван", "Мария", "Анна");


Пример создания неизменяемого множества:

Set<String> items = Set.of("Яблоко", "Груша", "Банан");


Попытка изменить такую коллекцию (например, names.add("Петр")) приведёт к исключению UnsupportedOperationException.

Использование неизменяемых коллекций помогает избежать ошибок, связанных с нежелательными изменениями, и улучшает безопасность данных.

#java #Immutable #Unmodifiable
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81
⌨️ Lambda-выражения

Лямбда-выражения появились в Java 8 и предоставили простой способ описывать анонимные функции, что позволяет писать более лаконичный и читабельный код. Лямбды активно используются при работе с коллекциями, потоками данных и функциональными интерфейсами.

Раньше для создания анонимного класса нужно было писать много кода:

List<String> names = Arrays.asList("John", "Alice", "Bob");
names.forEach(new Consumer<String>() {
@Override
public void accept(String name) {
System.out.println(name);
}
});


С лямбда-выражениями:

List<String> names = Arrays.asList("John", "Alice", "Bob");
names.forEach(name -> System.out.println(name));


Лямбды позволяют сократить код и сделать его более читабельным, особенно когда нужно передавать поведение как параметр (например, для фильтрации, сортировки и других операций).

#java #lambda
Please open Telegram to view this post
VIEW IN TELEGRAM
👍162🔥1
⌨️ Functional Interfaces (Функциональные интерфейсы)

Функциональные интерфейсы — это интерфейсы, которые содержат только один абстрактный метод. Они используются как целевые типы для лямбда-выражений и позволяют передавать функциональность в виде параметров. В Java 8 было добавлено несколько встроенных функциональных интерфейсов, таких как Predicate, Consumer, Supplier, и Function.

Пример функционального интерфейса:

@FunctionalInterface
interface MyFunctionalInterface {
void printMessage(String message);
}


Теперь, используя лямбда-выражение, мы можем легко реализовать этот интерфейс:

MyFunctionalInterface printer = message -> System.out.println(message);
printer.printMessage("Hello, World!"); // Hello, World!


Java включает несколько предопределенных функциональных интерфейсов, например:

✔️ Predicate<T> — принимает объект типа T и возвращает boolean.

✔️ Consumer<T> — принимает объект типа T и ничего не возвращает.

✔️ Supplier<T> — ничего не принимает, но возвращает объект типа T.

✔️ Function<T, R> — принимает объект типа T и возвращает объект типа R.

Использование функциональных интерфейсов позволяет создавать гибкий и лаконичный код.

#java #FunctionalInterface
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍1
public class Null {
public static void greet() {
System.out.println("HI!");
}

public static void main(String[] args) {
((Null) null).greet();
}
}


#java #quest
3
🤪14👏6👍3🎉2💊2
⌨️ Maven. Фазы и команды

Maven использует жизненный цикл сборки, который делится на несколько фаз. Фазы определяют последовательность задач, которые Maven выполняет для сборки и управления проектом.

Основные фазы жизненного цикла Maven включают:

1️⃣ validate – Проверяет, что проект правильный и вся необходимая информация указана.

2️⃣ compile – Компилирует исходный код проекта.

3️⃣ test – Запускает тесты (обычно с использованием JUnit или TestNG) и проверяет, что они проходят успешно.

4️⃣ package – Собирает скомпилированный код и пакует его, например, в JAR или WAR-файл.

5️⃣ verify – Проверяет собранные артефакты и результаты тестов.

6️⃣ install – Устанавливает пакет в локальный репозиторий для использования как зависимость в других проектах.

7️⃣ deploy – Отправляет финальный пакет в удаленный репозиторий для использования в других проектах или на сервере.

Основные команды Maven:

✔️ mvn clean – Удаляет папку target, очищая проект от предыдущих сборок.

✔️ mvn compile – Компилирует исходный код проекта.

✔️ mvn test – Запускает тесты.

✔️ mvn package – Пакует скомпилированный код в конечный артефакт (обычно JAR или WAR).

✔️ mvn install – Устанавливает артефакт в локальный репозиторий.

✔️ mvn deploy – Деплоит артефакт в удаленный репозиторий.

✔️ mvn site – Генерирует документацию проекта на основе кода и зависимостей.


Фазы выполняются последовательно, то есть если вы запускаете команду mvn install, Maven автоматически пройдет через все предыдущие фазы – от validate до install.

Примеры команд:

✔️ mvn clean install – очищает проект, компилирует, тестирует и устанавливает артефакт в локальный репозиторий.

✔️ mvn package -DskipTests – собирает проект в артефакт, пропуская тесты.

#java #Maven
Please open Telegram to view this post
VIEW IN TELEGRAM
👍173🔥1
⌨️ Desktop

Класс Desktop используется для взаимодействия с приложениями операционной системы, такими как веб-браузер, почтовый клиент, просмотрщик изображений и т.д. Этот класс входит в пакет java.awt и позволяет, например, открыть веб-ссылку в браузере или отправить письмо через почтовый клиент.

Основные возможности класса Desktop:

✔️ browse(URI uri) – открывает URI (например, веб-страницу) в браузере.

✔️ open(File file) – открывает файл в приложении, ассоциированном с его типом (например, текстовый файл в текстовом редакторе).

✔️ edit(File file) – открывает файл в режиме редактирования (если доступно).

✔️ mail(URI mailtoURI) – открывает почтовое приложение с указанным URI.

✔️ print(File file) – отправляет файл на печать.

Пример:

import java.awt.*;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class DesktopExample {
public static void main(String[] args) throws IOException, URISyntaxException {
// Проверяем, поддерживает ли система класс Desktop
if (Desktop.isDesktopSupported()) {
Desktop desktop = Desktop.getDesktop();
// Пример: Открытие веб-страницы
URI uri = new URI("http://www.google.com");
desktop.browse(uri);
} else {
System.out.println("Класс Desktop не поддерживается на этой системе.");
}
}
}


Проверка Desktop.isDesktopSupported() обязательна, так как класс может не поддерживаться на некоторых системах.

#java #Desktop
Please open Telegram to view this post
VIEW IN TELEGRAM
👍141🔥1
⌨️ Java AWT vs Swing vs JavaFX

Java AWT, Swing и JavaFX – библиотеки Java для создания графических интерфейсов (GUI), каждая со своими особенностями.

✔️ Java AWT (Abstract Window Toolkit)

Описание: Первая библиотека GUI (JDK 1.0), использует нативные компоненты ОС.

Особенности: Низкая гибкость, простой набор компонентов, ограниченные возможности стилизации.

Применение: Простые приложения с базовым интерфейсом.

✔️ Java Swing

Описание: Расширение AWT, платформа-независимая (JDK 1.2).

Особенности: Большой набор компонентов, поддержка Look and Feel, настройка и стилизация.

Применение: Более сложные десктопные приложения с гибким интерфейсом.

✔️ JavaFX

Описание: Современная библиотека (2008), поддержка мультимедиа и анимации.

Особенности: Стилизация через CSS, разделение логики и интерфейса (FXML), поддержка 3D.

Применение: Современные, интерактивные приложения с мультимедиа.

JavaFX – предпочтительный выбор для новых проектов благодаря современным функциям и поддержке мультимедиа, в то время как AWT и Swing остаются популярными для легких и совместимых приложений.

#java #AWT #Swing #JavaFX
Please open Telegram to view this post
VIEW IN TELEGRAM
👍93
public class Quest {
static {
main(new String[] { "Hello" });
}

public static void main(String[] args) {
System.out.print("Hi");
}
}


#java #quest
4
⌨️ Какими значениями инициализируются переменные по умолчанию?


byte — (byte)0;
short — (short)0;
int — 0;
long — 0L;
float — 0f;
double — 0d;
char — \u0000;
boolean — false;
Объекты (в том числе String) — null.


#java #initialization
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👍7
⌨️ Какие существуют модификаторы доступа?

В Java модификаторы доступа определяют, из каких частей программы можно получить доступ к классу, методу или переменной. Всего их четыре:

public – предоставляет полный доступ к классу или его членам из любого другого класса в любом пакете. Применяется для методов, полей и классов, которые должны быть доступны всем.

protected – доступ к члену класса разрешен в пределах того же пакета и для подклассов, даже если они находятся в других пакетах. Используется для полей и методов, которые могут быть полезны в наследовании.

default (пакетный доступ) – если модификатор не указан явно, доступ к члену класса разрешен только внутри того же пакета. Этот доступ используется для внутренних структур, не предназначенных для использования в других пакетах.

private – доступен только внутри того же класса. Поля и методы, помеченные как private, невидимы для других классов, включая подклассы.

Эти модификаторы помогают контролировать видимость и инкапсуляцию данных в программе.

#java #public #protected #default #private
Please open Telegram to view this post
VIEW IN TELEGRAM
👍101
⌨️ О чем говорит ключевое слово final?

Модификатор final может применяться к переменным, параметрам методов, полям и методам класса или самим классам.

✔️ Класс не может иметь наследников;

✔️ Метод не может быть переопределен в классах наследниках;

✔️ Поле не может изменить свое значение после инициализации;

✔️ Параметры методов не могут изменять своё значение внутри метода;

✔️ Локальные переменные не могут быть изменены после присвоения им значения.

#java #final
Please open Telegram to view this post
VIEW IN TELEGRAM
👍192
Паттерны проектирования

Шаблон (паттерн) проектирования (design pattern) — это проверенное и готовое к использованию решение. Это не класс и не библиотека, которую можно подключить к проекту, это нечто большее - он не зависит от языка программирования, не является законченным образцом, который может быть прямо преобразован в код и может быть реализован по-разному в разных языках программирования.

ПОРОЖДАЮЩИЕ ПАТТЕРНЫ

✔️ Абстрактная фабрика (Abstract factory) - Класс, который представляет собой интерфейс для создания других классов.

✔️ Строитель (Builder) - Класс, который представляет собой интерфейс для создания сложного объекта.

✔️ Фабричный метод (Factory method) - Делегирует создание объектов наследникам родительского класса. Это позволяет использовать в коде программы не специфические классы, а манипулировать абстрактными объектами на более высоком уровне.

✔️ Прототип (Prototype) - Определяет интерфейс создания объекта через клонирование другого объекта вместо создания через конструктор.

✔️ Одиночка (Singleton) - Класс, который может иметь только один экземпляр.


СТРУКТУРНЫЕ ПАТТЕРНЫ

✔️ Адаптер (Adapter) - Объект, обеспечивающий взаимодействие двух других объектов, один из которых использует, а другой предоставляет несовместимый с первым интерфейс.

✔️ Мост (Bridge) - Структура, позволяющая изменять интерфейс обращения и интерфейс реализации класса независимо.

✔️ Компоновщик (Composite) - Объект, который объединяет в себе объекты, подобные ему самому.

✔️ Декоратор (Decorator) - Класс, расширяющий функциональность другого класса без использования наследования.

✔️ Фасад (Facade) - Объект, который абстрагирует работу с несколькими классами, объединяя их в единое целое.

✔️ Приспособленец (Flyweight) - Это объект, представляющий себя как уникальный экземпляр в разных местах программы, но по факту не являющийся таковым.

✔️ Заместитель (Proxy) - Объект, который является посредником между двумя другими объектами, и который реализует/ограничивает доступ к объекту, к которому обращаются через него.


ПОВЕДЕНЧЕСКИЕ ПАТТЕРНЫ

✔️ Цепочка обязанностей (Chain of responsibility) - Предназначен для организации в системе уровней ответственности.

✔️ Команда (Command) - Представляет действие. Объект команды заключает в себе само действие и его параметры.

✔️ Интерпретатор (Interpreter) - Решает часто встречающуюся, но подверженную изменениям, задачу.

✔️ Итератор (Iterator) - Представляет собой объект, позволяющий получить последовательный доступ к элементам объекта-агрегата без использования описаний каждого из объектов, входящих в состав агрегации.

✔️ Посредник (Mediator) - Обеспечивает взаимодействие множества объектов, формируя при этом слабую связанность и избавляя объекты от необходимости явно ссылаться друг на друга.

✔️ Хранитель (Memento) - Позволяет, не нарушая инкапсуляцию зафиксировать и сохранить внутренние состояния объекта так, чтобы позднее восстановить его в этих состояниях.

✔️ Наблюдатель (Observer) - Определяет зависимость типа «один ко многим» между объектами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются об этом событии.

✔️ Состояние (State) - Используется в тех случаях, когда во время выполнения программы объект должен менять своё поведение в зависимости от своего состояния.

✔️ Стратегия (Strategy) - Предназначен для определения семейства алгоритмов, инкапсуляции каждого из них и обеспечения их взаимозаменяемости.

✔️ Шаблонный метод (Template method) - Определяет основу алгоритма и позволяет наследникам переопределять некоторые шаги алгоритма, не изменяя его структуру в целом.

✔️ Посетитель (Visitor) - Описывает операцию, которая выполняется над объектами других классов. При изменении класса Visitor нет необходимости изменять обслуживаемые классы.

#DesignPattern
👍255
Меня терзают смутные сомнения
😁40🤣10