🖕6👍5🎉1
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
🤯8❤1🎉1
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
👍12❤3
Обычно ресурсы, такие как файлы или потоки, нужно явно закрывать, чтобы избежать утечек. Но с помощью конструкции 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
👍6❤3👏1
Начиная с 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
👍26❤1
Неизменяемые коллекции обеспечивают безопасность от случайных изменений данных, что особенно полезно в многопоточных приложениях или когда нужно гарантировать, что данные не будут изменены.
Вместо того чтобы создавать обычные коллекции и вручную делать их неизменяемыми с помощью метода
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