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

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

✍️По всем вопросам: @Pascal4eg
Download Telegram
Кажется пора поработать
😁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
⌨️ Switch Expressions

В Java 12 появился новый синтаксис для switch, который позволяет возвращать значение используя стрелки ->, что делает код более компактным и удобным. Теперь switch может использоваться как выражение, а не только как оператор, что упрощает его применение в логике.

Ранее switch использовался как оператор, и код мог выглядеть громоздко:

String day = "MONDAY";
int numLetters;
switch (day) {
case "MONDAY":
case "FRIDAY":
case "SUNDAY":
numLetters = 6;
break;
case "TUESDAY":
numLetters = 7;
break;
default:
numLetters = 8;
}
System.out.println(numLetters); // Вывод: 6


Со Switch Expressions можно переписать этот код более лаконично:

String day = "MONDAY";
int numLetters = switch (day) {
case "MONDAY", "FRIDAY", "SUNDAY" -> 6;
case "TUESDAY" -> 7;
default -> 8;
};
System.out.println(numLetters); // Вывод: 6


Теперь switch может вернуть значение, и нет необходимости в break.

#java #switch
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25😨31🔥1
Рано сдался)
😁38🤡7🤣3🗿2🔥1👏1💯1
ВЕБ-СКРАПИНГ

Веб-скрапинг — это процесс автоматизированного извлечения данных с веб-сайтов. Этот подход позволяет собирать информацию с различных источников, включая новости, отзывы, цены и другие публичные данные. Такого рода практики помогают исследователям, аналитикам и разработчикам анализировать большие объемы информации и использовать ее для разных целей.

Зачем нужен веб-скрапинг?

✔️ Сбор данных: Автоматизированный процесс помогает избежать рутинной работы и значительно экономит время.

✔️ Анализ конкурентов: С помощью скрапа можно отслеживать изменения на сайте конкурентов, выяснять стратегии ценообразования и проводить анализ тенденций.

✔️ Полезные приложения: Создание приложений для мониторинга цен, агрегаторов новостей и других сервисов, использующих живую информацию.

И, главное, помните про соблюдение правил: перед скрапингом сайта обязательно ознакомьтесь с его robots.txt — файлом, который указывает, какие страницы можно скрапить, а какие — нет.
👍92
⌨️ Создание веб-скрапера с помощью Jsoup

Теперь давайте рассмотрим, как создать простой веб-скрапер, используя библиотеку Jsoup. Это мощный инструмент для работы с HTML, который позволяет удобно извлекать нужные данные.

Чтобы начать, добавьте зависимость Jsoup в ваш проект. Если вы используете Maven, добавьте следующий фрагмент в ваш pom.xml:

<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.14.3</version> <!-- Убедитесь, что используете последнюю версию -->
</dependency>


Мы создадим простой веб-скрапер, который будет извлекать заголовки с сайта новостей.

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;

public class NewsScraper {
public static void main(String[] args) {
String url = "https://example-news-site.com"; // Замените на реальный URL
try {
// Загружаем документ
Document doc = Jsoup.connect(url).get();

// Извлекаем элементы (например, заголовки новостей)
Elements newsHeadlines = doc.select(".headline"); // CSS-селектор для заголовков

// Обрабатываем и выводим заголовки
for (Element headline : newsHeadlines) {
System.out.println(headline.text()); // Выводим текст заголовка
}
} catch (IOException e) {
e.printStackTrace();
}
}
}


Что происходит в коде?

1️⃣ Подключение к веб-странице: Метод Jsoup.connect(url).get() позволяет загрузить HTML-код страницы.

2️⃣ Извлечение данных: Метод select() позволяет отобрать элементы, соответствующие заданному CSS-селектору (в нашем случае заголовкам новостей с классом .headline).

3️⃣ Вывод результатов: Перебирая элементы, выводим текст заголовков в консоль.

#java #Jsoup
Please open Telegram to view this post
VIEW IN TELEGRAM
👍113
😁21😱13👍3💯1🍌1
⌨️ Паттерн проектирования: Singleton

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

Реализации паттерна Singleton:

public class Singleton {
private static volatile Singleton instance;

private Singleton() {
// Приватный конструктор
}

public static Singleton getInstance() {
if (instance == null) { // Проверка на null для улучшения производительности
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}


Использование:

public class Main {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
}
}


#java #Singleton
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍2
⌨️ Что такое CI/CD?

Непрерывная интеграция (Continuous Integration, CI) - процесс, при котором разработчики регулярно интегрируют изменения в код, что позволяет автоматически проверять, компилировать и тестировать его.

Непрерывная доставка (Continuous Delivery, CD) - автоматизация процесса развертывания, которая позволяет разработчикам выпускать новое программное обеспечение в продакшн быстро и надежно.

Инструменты для CI/CD

Для Java-проектов существует множество инструментов для настройки CI/CD. Вот несколько популярных:

✔️ Jenkins: Один из самых популярных инструментов для автоматизации сборки и развертывания.

✔️ GitLab CI/CD: Встроенный CI/CD инструмент в GitLab, удобный для использования.

✔️ Travis CI: Простой в использовании CI-сервис, интегрируемый с GitHub.

✔️ CircleCI: Облачный CI/CD сервис, который позволяет легко автоматизировать тестирование и развертывание.

#java #ci #cd
Please open Telegram to view this post
VIEW IN TELEGRAM
👍71
Надо было по Java брать, такой #&@ни бы не было!
🤣38👍1😁1
Java-приложение в Docker

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

Docker — это платформа для создания, развертывания и управления контейнерами. Контейнеры изолируют приложения и все их зависимости, что делает возможным запуск кода в любом окружении без конфликта с другими приложениями.

Шаг 1: Установка Docker

Перед тем как начать, убедитесь, что Docker установлен на вашем компьютере. Вы можете следовать [официальной документации](https://docs.docker.com/get-docker/) для установки на вашу операционную систему.

Шаг 2: Создание Java-приложения

Для примера создадим простое приложение. Предположим, у вас есть простая программа, которая выводит "Hello, World!".

Создайте файл HelloWorld.java:


public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}

Скомпилируйте её с помощью:


javac HelloWorld.java


Шаг 3: Создание Dockerfile

Dockerfile — это текстовый файл, позволяющий автоматически собирать образ Docker. Создайте файл с именем Dockerfile в каталоге вашего проекта:


# Используем официальный образ OpenJDK
FROM openjdk:17-jdk-slim

# Устанавливаем рабочий каталог
WORKDIR /app

# Копируем скомпилированный класс в контейнер
COPY HelloWorld.class ./

# Определяем команду запуска
CMD ["java", "HelloWorld"]


Шаг 4: Сборка Docker-образа

Теперь создайте Docker-образ, используя следующую команду в каталоге вашего проекта:


docker build -t helloworld .

Эта команда соберет образ и назовет его helloworld.

Шаг 5: Запуск контейнера

Чтобы запустить контейнер, выполните команду:


docker run --rm helloworld


Вы должны увидеть вывод:

Hello, World!

Флаг --rm автоматически удаляет контейнер после его остановки.

#java #docker
👍144🔥2
🔧 Maven vs Gradle: Как выбрать систему сборки для вашего проекта?

В мире Java-разработки выбор системы сборки может стать настоящим камнем преткновения. Maven и Gradle — две самые популярные системы, каждая из которых имеет свои сильные и слабые стороны. Давайте рассмотрим их подробнее!

Maven: Стандарт и стабильность

Maven — это зрелая система сборки, основанная на концепции "конвенций над конфигурацией". Она использует XML для описания проекта и его зависимостей.

Плюсы:
- Простота: Понятный и распространенный подход к конфигурации.
- Сообщество: Огромная база плагинов и поддержка сообщества.
- Лучшие практики: Сразу настраивает структуру проекта, следуя лучшим практикам.

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

Пример pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.8</version>
</dependency>
</dependencies>
</project>


Gradle: Гибкость и скорость

Gradle — современная система сборки, которая позволяет использовать Groovy или Kotlin DSL для определения конфигураций. Она обеспечивает большую гибкость и возможность настройки.

Плюсы:
- Производительность: Инкрементальная сборка и кеширование значительно ускоряют процесс.
- Гибкость: Легкость в настройке и использование скриптового языка для кастомизации.
- Модульность: Удобно работать с многоуровневыми проектами.

Минусы:
- Крутая кривая обучения: Меньше "из коробки", чем Maven; требуется больше усилий для освоения.
- Младше: Меньшая база плагинов по сравнению с Maven (хотя ситуация улучшается).

Пример build.gradle:

plugins {
id 'java'
}

group 'com.example'
version '1.0-SNAPSHOT'

repositories {
mavenCentral()
}

dependencies {
implementation 'org.springframework:spring-context:5.3.8'
}


🤔 Как выбрать?

1️⃣ Масштаб проекта: Для небольших и средних проектов может быть достаточно Maven. Для крупных и сложных проектов Gradle предложит больше возможностей.

2️⃣ Командные предпочтения: Если ваша команда знакома с одной из систем, лучше следовать этому пути.

3️⃣ Будущее проекта: Gradle, как современная система, может предложить более высокую производительность и гибкость для долгосрочных проектов.

🔥 Итог: Оба инструмента могут быть мощными союзниками. Выбор зависит от ваших потребностей и предпочтений команды. Удачи в разработке! 🚀

#Java #Maven #Gradle #BuildSystems
👍115🔥2🗿1
🔒 Spring Security: Обеспечение безопасности веб-приложений

В современном мире веб-разработки безопасность приложений стоит на первом плане, и именно здесь на сцену выходит Spring Security. Это мощный механизм аутентификации и авторизации, который не только защищает ваше приложение, но и делает его более гибким и устойчивым к угрозам. Давайте разберемся, что именно он предлагает и почему стоит его использовать!

🌟 Что такое Spring Security?

Spring Security — это фреймворк, интегрированный в экосистему Spring, который обеспечивает защиту ваших приложений на всех уровнях. Это не просто защита от несанкционированного доступа; это полноценное решение, включающее аутентификацию, авторизацию, защиту от CSRF-атак и многое другое.

🔑 Ключевые особенности:

1. Аутентификация и авторизация: Легко настраивайте различные механизмы аутентификации (Basic Auth, JWT, OAuth2) и определяйте права доступа для разных ролей пользователя!

2. Защита от CSRF и XSS атак: Spring Security автоматически включает защиту от этих распространенных уязвимостей, позволяя вам сосредоточиться на разработке.

3. Интеграция с различными API: Работает с OAuth2 и OpenID Connect, что позволяет интегрироваться с внешними провайдерами аутентификации, такими как Google или Facebook.

4. Настраиваемая конфигурация: Вы имеете полный контроль над механизмами аутентификации и авторизации, создавая настраиваемые правила доступа.

🛠 Как начать?

- Добавьте Spring Security в ваш проект через Maven или Gradle.
- Настройте механизм аутентификации, указав его в конфигурационных файлах.
- Определите правила доступа для различных URL в вашем приложении.

#Java #SpringSecurity #Security
👍53
Паттерн Bridge (Мост)

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

Давайте посмотрим на пример, который иллюстрирует паттерн Bridge в контексте рисования фигур:

// Реализация интерфейса для рисования
interface DrawingAPI {
void drawCircle(double x, double y, double radius);
}

// Конкретная реализация для рисования на графическом окне
class DrawingAPI1 implements DrawingAPI {
public void drawCircle(double x, double y, double radius) {
System.out.println("API1.circle at {" + x + ", " + y + "} radius " + radius);
}
}

// Конкретная реализация для рисования в ASCII
class DrawingAPI2 implements DrawingAPI {
public void drawCircle(double x, double y, double radius) {
System.out.println("API2.circle at {" + x + ", " + y + "} radius " + radius);
}
}

// Абстракция
abstract class Circle {
protected DrawingAPI drawingAPI; // Ссылка на реализацию

protected Circle(DrawingAPI drawingAPI) {
this.drawingAPI = drawingAPI;
}

public abstract void draw(); // Метод для рисования
public abstract void resizeByPercentage(double pct); // Метод для изменения размера
}

// Конкретная абстракция
class CircleWithABorder extends Circle {
private double x, y, radius; // Параметры круга

public CircleWithABorder(double x, double y, double radius, DrawingAPI drawingAPI) {
super(drawingAPI); // Передаем реализацию в абстракцию
this.x = x;
this.y = y;
this.radius = radius;
}

public void draw() {
drawingAPI.drawCircle(x, y, radius); // Используем реализацию для рисования
}

public void resizeByPercentage(double pct) {
radius *= (1 + pct / 100); // Меняем размер круга
}
}


#java #bridge #pattern
👍83
⌨️ Java Concurrency API: Основные классы

Современные приложения все чаще требуют выполнения нескольких задач одновременно, и для этого Java предоставляет мощный инструмент — Concurrency API (набор классов и интерфейсов). Этот API позволяет разработчикам легко реализовывать многопоточность, управлять потоками и синхронизировать действия между ними, что значительно увеличивает производительность и отзывчивость приложений.

Основные классы:

1. Thread
- Класс для создания и управления потоками. Вы можете создать новый поток, реализовав интерфейс Runnable или расширив класс Thread.

2. Executor
- Интерфейс для управления потоками и выполнения задач. Позволяет абстрагироваться от управления потоками, сосредоточившись на логике приложения.
- ExecutorService: расширение Executor, управляющее жизненным циклом потоков.

3. Future
- Позволяет получать результаты из асинхронных задач. Используется в связке с ExecutorService для выполнения задач в фоновом режиме.

4. CountDownLatch
- Синхронизирует потоки, позволяя одному или нескольким потокам ждать завершения других потоков перед продолжением работы.

5. CyclicBarrier
- Используется для синхронизации группы потоков. Позволяет потоку ждать, пока все другие не достигнут определенной точки.

6. Semaphore
- Контролирует доступ к ресурсу, предоставляя определенное количество разрешений для потоков.

7. BlockingQueue
- Интерфейс, предоставляющий безопасный способ обмена данными между потоками при помощи очередей. Реализации включают ArrayBlockingQueue, LinkedBlockingQueue и другие.

#java #ConcurrencyAPI #Thread
Please open Telegram to view this post
VIEW IN TELEGRAM
👍142🔥2