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

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

✍️По всем вопросам: @Pascal4eg
Download Telegram
🤪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
⌨️ Захват переменных в лямбда-выражениях

Лямбда-выражения могут захватывать переменные из внешнего окружения, делая их доступными внутри лямбда-функции. При этом переменные могут быть:

1️⃣ Неизменяемыми (effectively final) – Переменная из внешнего контекста, используемая в лямбде, должна быть объявлена как final или фактически быть неизменяемой (то есть не изменяться после первого присваивания). Например:

int x = 10;
Runnable r = () -> System.out.println(x); // x захвачен в лямбде


2️⃣ Свободными от изменения в лямбде – Лямбда не может изменять захваченные переменные. Это ограничение гарантирует, что нет неоднозначного состояния, когда переменная изменяется из нескольких мест (например, из основного потока и из лямбда-функции одновременно).

3️⃣ Статическими или полями класса – В отличие от локальных переменных, статические поля класса или поля экземпляра могут свободно изменяться внутри лямбда-выражений, поскольку их значения хранятся в куче (heap) и доступны по ссылке.

Пример:

public class Main {
private static int staticVar = 20;

public static void main(String[] args) {
int localVar = 10;
Runnable r = () -> System.out.println(localVar + staticVar);
r.run();
}
}


В этом примере localVar захватывается, так как он effectively final, а staticVar доступен, так как это статическое поле.

#java #lambda #capturing
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍21
⌨️ Метод Optional.or()

Метод Optional.or() используется для того, чтобы вернуть значение текущего Optional, если оно присутствует, или вернуть другой Optional, если текущее значение отсутствует. Это удобно, когда нужно подставить запасной вариант, если значение отсутствует (т.е. Optional пуст).

Сигнатура метода:

Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)


Если Optional содержит значение, or() вернет текущий Optional. Если Optional пуст, он выполнит supplier.get() и вернет результат этого вызова, т.е. другой Optional.

Пример:

import java.util.Optional;

public class OptionalOrExample {
public static void main(String[] args) {
Optional<String> optionalValue = Optional.of("Hello");

// Если optionalValue пуст, вернем запасное значение
String result = optionalValue
.or(() -> Optional.of("Default Value"))
.get();

System.out.println(result); // Выведет "Hello", так как optionalValue не пуст
}
}


Если заменить Optional.of("Hello") на Optional.empty(), тогда or() вернет запасное значение "Default Value".

#java #Optional #or
Please open Telegram to view this post
VIEW IN TELEGRAM
👎62🤝1
⌨️ Модификатор abstract

Класс, помеченный модификатором abstract, называется абстрактным и может служить только в качестве родительского для других классов. Создавать объекты самого абстрактного класса нельзя. При этом наследовать абстрактный класс могут как другие абстрактные классы, так и обычные классы, допускающие создание экземпляров.

Метод, обозначенный ключевым словом abstract, называется абстрактным методом и не имеет реализации. Если в классе есть хотя бы один абстрактный метод, то весь класс должен быть объявлен абстрактным.

Абстрактные классы и методы позволяют создать шаблон объекта, который необходимо реализовать в дочерних классах. В самих же абстрактных классах задаётся только общее поведение для всех наследников.

#java #abstract
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍3
Кажется пора поработать
😁34🤣14
⌨️ Интерфейс (interface)

Интерфейс (interface) — это специальный тип, который содержит только абстрактные методы (до Java 8) и константы. Интерфейсы служат для задания контракта, который классы обязаны реализовать, если они его используют. В интерфейсе нельзя создать реализацию методов (до Java 8), и все методы по умолчанию являются public и abstract.

С версии Java 8 в интерфейсах можно использовать методы с реализацией (default и static), а с версии Java 9 — private методы. Интерфейсы позволяют реализовать множественное наследование, поскольку класс может реализовать несколько интерфейсов.

#java #interface
Please open Telegram to view this post
VIEW IN TELEGRAM
👍142🤯1
⌨️ private методы в интерфейсах

В Java с версии 9 появилась возможность использовать private методы в интерфейсах. Эти методы предназначены для улучшения внутренней организации интерфейсов, позволяя избежать дублирования кода в default и static методах. private методы помогают реализовать общую логику, к которой могут обращаться другие методы интерфейса, но они остаются недоступными для классов, реализующих интерфейс.

private методы могут быть как экземплярными, так и static.

Пример:

public interface MyInterface {
default void showMessage() {
print("Default method calling private method");
}

static void showStaticMessage() {
print("Static method calling private method");
}

// Private method for reuse
private static void print(String message) {
System.out.println(message);
}
}


#java #interface #private
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍2🔥1
Метод equals() используется для сравнения двух объектов на равенство. Он определен в классе Object и, по умолчанию, выполняет сравнение ссылок на объекты (то есть проверяет, являются ли объекты одним и тем же объектом в памяти). Многие классы переопределяют этот метод, чтобы сравнивать содержимое объектов, а не только ссылки.

Контракт equals
При переопределении метода equals разработчик должен придерживаться основных правил, определенных в спецификации языка Java.

Рефлексивность
для любого заданного значения x, выражение x.equals(x) должно возвращать true.
Заданного — такого, что x != null

Симметричность
для любых заданных значений x и y, x.equals(y) должно возвращать true только в том случае, когда y.equals(x) возвращает true.

Транзитивность
для любых заданных значений x, y и z, если x.equals(y) возвращает true и y.equals(z) возвращает true, x.equals(z) должно вернуть значение true.

Согласованность
для любых заданных значений x и y повторный вызов x.equals(y) будет возвращать значение предыдущего вызова этого метода при условии, что поля, используемые для сравнения этих двух объектов, не изменялись между вызовами.

Сравнение null
для любого заданного значения x вызов x.equals(null) должен возвращать false.
8🤝2🔥1
public class Quest {
public static void main(String[] args) {
Boolean b;
System.out.println(Boolean.TRUE.equals(!b));
}
}


#java #quest
6👎1
Что выведет код?
Anonymous Quiz
31%
true
26%
false
43%
<Ошибка компиляции>
9🎉2
enum Month {
JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER
}

public class Quest {
public static void main(String[] args) {
Month m = Month.JANUARY;
String season = switch (m) {
case DECEMBER, JANUARY, FEBRUARY -> "Winter";
case MARCH, APRIL, MAY -> "Spring";
case JUNE, JULY, AUGUST -> "Summer";
case SEPTEMBER, OCTOBER -> "Autumn";
};
System.out.println(season);
}
}


#java #quest
8👎1