Неизменяемые коллекции обеспечивают безопасность от случайных изменений данных, что особенно полезно в многопоточных приложениях или когда нужно гарантировать, что данные не будут изменены.
Вместо того чтобы создавать обычные коллекции и вручную делать их неизменяемыми с помощью метода
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
👍8❤1
Лямбда-выражения появились в 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
👍16❤2🔥1
Функциональные интерфейсы — это интерфейсы, которые содержат только один абстрактный метод. Они используются как целевые типы для лямбда-выражений и позволяют передавать функциональность в виде параметров. В 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
🤪14👏6👍3🎉2💊2
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
👍17❤3🔥1
Класс
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
👍14❤1🔥1
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
👍9❤3
Что выведет код?
Anonymous Quiz
33%
HelloHi
26%
HiHi
9%
<StackOverflowError>
31%
<Ошибка компиляции>
🎉3
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
👍10❤1
Модификатор
final может применяться к переменным, параметрам методов, полям и методам класса или самим классам.✔️ Класс не может иметь наследников;
✔️ Метод не может быть переопределен в классах наследниках;
✔️ Поле не может изменить свое значение после инициализации;
✔️ Параметры методов не могут изменять своё значение внутри метода;
✔️ Локальные переменные не могут быть изменены после присвоения им значения.
#java #final
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19❤2
Паттерны проектирования
Шаблон (паттерн) проектирования (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
Шаблон (паттерн) проектирования (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
👍25❤5
Лямбда-выражения могут захватывать переменные из внешнего окружения, делая их доступными внутри лямбда-функции. При этом переменные могут быть:
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👍2❤1
Метод
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
👎6❤2🤝1
Класс, помеченный модификатором
abstract, называется абстрактным и может служить только в качестве родительского для других классов. Создавать объекты самого абстрактного класса нельзя. При этом наследовать абстрактный класс могут как другие абстрактные классы, так и обычные классы, допускающие создание экземпляров.Метод, обозначенный ключевым словом
abstract, называется абстрактным методом и не имеет реализации. Если в классе есть хотя бы один абстрактный метод, то весь класс должен быть объявлен абстрактным.Абстрактные классы и методы позволяют создать шаблон объекта, который необходимо реализовать в дочерних классах. В самих же абстрактных классах задаётся только общее поведение для всех наследников.
#java #abstract
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍3
Интерфейс (
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
👍14❤2🤯1
В 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