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

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

✍️По всем вопросам: @Pascal4eg
Download Telegram
☕️Использование библиотеки Quartz

Quartz - это мощный планировщик задач для языка программирования Java, который позволяет создавать и управлять задачами, выполняемыми по определенному расписанию. Quartz позволяет создавать различные типы задач, такие как одноразовые, повторяющиеся, параллельные и многие другие.

Основные методы библиотеки Quartz:

1. SchedulerFactory - фабрика создания планировщика задач.
Пример кода:

SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();


2. Job - интерфейс, представляющий выполняемую задачу.
Пример кода:

public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) {
System.out.println("Hello, Quartz!");
}
}


3. JobDetail - содержит информацию о задаче, такую как класс задачи, идентификатор задачи и другие свойства.
Пример кода:

JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
.withIdentity("myJob")
.build();


4. Trigger - позволяет указать расписание выполнения задачи, такое как время запуска, повторяемость и другие параметры.
Пример кода:

Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("myTrigger")
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(10)
.repeatForever())
.build();


5. Scheduler - основной класс для управления планированием задач.
Пример кода:

scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1👏1
⌨️ В какой момент происходит статическая инициализация класса?

В Java статическая инициализация класса происходит во время загрузки класса в JVM (Java Virtual Machine), которая происходит перед созданием объектов этого класса или вызовом статических методов или статических полей этого класса.

Статическая инициализация выполняется при помощи статических блоков кода или статических переменных класса.

Статическая инициализация выполняется единожды при загрузке класса в JVM, вне зависимости от того, сколько раз этот класс будет использоваться в программе.


public class MyClass {
static {
// Код статической инициализации
System.out.println("Статическая инициализация MyClass");
}

public MyClass() {
System.out.println("Конструктор MyClass");
}
}

public class Start {
public static void main(String[] args) {
System.out.println("start");
new MyClass();
System.out.println("stop");
}
}


Вывод в консоль:

start
Статическая инициализация MyClass
Конструктор MyClass
stop
Please open Telegram to view this post
VIEW IN TELEGRAM
👍131🔥1
public class ShadesOfGray {
public static void main(String[] args) {
System.out.println(X.Y.Z);
}
}

class X {
static class Y {
static String Z = "BLACK";
}
static C Y = new C();
}

class C {
String Z = "WHITE";
}
Что выведет код?
Anonymous Quiz
24%
BLACK
17%
WHITE
58%
ошибка компиляции
😱5🎉1🤩1
☕️Использование классов Pattern и Matcher

Pattern и Matcher - это классы, предоставляемые Java для работы с регулярными выражениями. Pattern используется для компиляции регулярного выражения, а Matcher используется для сравнения этого выражения с определенной последовательностью символов.

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


import java.util.regex.*;

public class RegexExample {
public static void main(String[] args) {
String text = "The cat in the hat";

// Компилируем регулярное выражение
Pattern pattern = Pattern.compile("\\bcat\\b");

// Создаем Matcher, сравниваем его с текстом и выводим результат
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
System.out.println("Найдено совпадение!");
} else {
System.out.println("Совпадений не найдено");
}
}
}


🔹В данном примере мы создаем регулярное выражение, которое ищет слово "cat" как отдельное слово. Затем мы создаем Matcher, который сравнивает это выражение с текстом "The cat in the hat". Результатом выполнения программы будет сообщение "Найдено совпадение!", так как слово "cat" есть в тексте.

📌Pattern и Matcher позволяют удобно работать с регулярными выражениями и обрабатывать текстовые данные. Они широко используются в поиске и замене текста, валидации ввода и других задачах, связанных с обработкой строк.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍91🔥1👏1
☕️Использование JavaFX

JavaFX - это библиотека для создания графических пользовательских интерфейсов (GUI) на языке программирования Java. Она предоставляет инструменты для создания различных элементов интерфейса, анимаций, эффектов и многих других возможностей.

🔔Одной из ключевых особенностей JavaFX является использование XML-подобного языка разметки FXML для описания интерфейса приложения. FXML позволяет создавать интерфейс без необходимости писать большое количество кода, что делает разработку проще и более удобной.

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

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class HelloWorld extends Application {

@Override
public void start(Stage primaryStage) {
Button btn = new Button();
btn.setText("Hello World");

StackPane root = new StackPane();
root.getChildren().add(btn);

Scene scene = new Scene(root, 300, 250);

primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}

public static void main(String[] args) {
launch(args);
}
}


➡️В данном примере создается простое окно с кнопкой "Hello World", которая выводится на экран.

JavaFX также полностью интегрируется с языком Java, что позволяет программистам легко работать с различными Java библиотеками и функциональными возможностями.

🔖JavaFX предоставляет множество возможностей для создания современных и красивых пользовательских интерфейсов, что делает ее отличным выбором для разработки приложений с графическим интерфейсом на языке Java.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥3👏2👨‍💻2
final String pig = "length: 10";
final String dog = "length: " + pig.length();
System.out.println(pig == dog);
Что выведет код?
Anonymous Quiz
24%
true
57%
false
19%
ошибка компиляции
👍6🎉2🔥1👏1
😁29🙈3🤣2💯1🤪1
☕️Использование Java Cryptography Architecture (JCA)

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

➡️Одной из ключевых особенностей JCA является возможность подключения различных провайдеров криптографических служб (Cryptography Service Providers - CSP), которые реализуют алгоритмы шифрования и хэширования. Это позволяет программистам легко заменять или дополнять стандартные алгоритмы криптографии.

Ниже приведен пример использования JCA для шифрования и дешифрования данных с использованием алгоритма AES:

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

public class JCAExample {

public static void main(String[] args) throws Exception {
// Генерируем секретный ключ
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
SecretKey secretKey = keyGenerator.generateKey();

// Шифруем данные
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedData = cipher.doFinal("Hello, World!".getBytes());

// Дешифруем данные
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedData = cipher.doFinal(encryptedData);

System.out.println("Original data: " + new String(decryptedData));
}
}


В этом примере мы сначала генерируем секретный ключ для алгоритма AES, затем шифруем строку "Hello, World!" и дешифруем ее обратно. Это простой пример использования JCA для криптографии.

⚙️Java Cryptography Architecture предоставляет широкий выбор криптографических алгоритмов и возможность использования криптографии в безопасных Java приложениях. Использование JCA помогает программистам обеспечить безопасность и конфиденциальность данных в их приложениях.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍92🔥1
☕️Использование SonarQube

SonarQube – это инструмент статического анализа кода, который помогает программистам выявлять и исправлять ошибки, обнаруживать потенциальные уязвимости и улучшать качество кода. Он поддерживает множество языков программирования, включая Java.

🔔Один из основных методов SonarQube для анализа кода - это использование правил (rules). Правила определяют набор проверок, которые применяются к коду для выявления потенциальных проблем. SonarQube поставляется с большим количеством предустановленных правил, которые можно настраивать и расширять под конкретные нужды проекта.

➡️Еще один важный метод SonarQube - это использование метрик (metrics) для измерения качества кода. Метрики позволяют оценить различные аспекты кода, такие как сложность, размер, покрытие тестами и др. SonarQube предоставляет отчеты на основе метрик, которые помогают программистам понять, где можно улучшить свой код.

🔖В целом, SonarQube является мощным инструментом для улучшения качества и безопасности вашего кода на Java. Правильное использование его методов поможет вам избежать многих ошибок и повысить производительность вашего проекта.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥21👏1
⌨️ Effectively final - это термин, который используется для описания переменной в Java, которая фактически ведет себя как final, хотя она не объявлена с ключевым словом final. То есть, хотя вы можете изменять значение этой переменной, вы это не делаете. Компилятор Java позволяет использовать такие переменные в лямбда-выражениях и анонимных классах, даже если они не объявлены как final.

В примере переменная x объявлена с ключевым словом final, поэтому ее значение не может быть изменено. Переменная y не объявлена как final, но внутри метода она не изменяется после инициализации, поэтому она считается "effectively final" и может быть использована в анонимных классах и лямбда-выражениях.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5👏31🔥1
public class Counter {

public static void main(String[] args) {
int counter = 0;
counter = counter++;
System.out.println(counter);
}

}
Что выведет код?
Anonymous Quiz
32%
0
58%
1
10%
ошибка компиляции
🗿10🎉2👎1🤩1😍1
☕️Использование прикладных шаблонов проектирования - для улучшения качества кода

Применение шаблонов проектирования позволяет повысить читаемость, расширяемость и поддерживаемость кода, а также уменьшить количество дублирующегося кода и повысить его стабильность. Одним из распространенных шаблонов проектирования является "Singleton", который гарантирует, что у класса есть только один экземпляр, и обеспечивает глобальную точку доступа к этому экземпляру.

Пример кода для реализации шаблона Singleton:


public class SingletonExample {
private static SingletonExample instance;

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

public static SingletonExample getInstance() {
if (instance == null) {
instance = new SingletonExample();
}
return instance;
}
}

Объяснение:
- Приватный конструктор предотвращает создание экземпляров класса извне.
- Статическое поле "instance" хранит единственный экземпляр класса.
- Метод "getInstance()" проверяет, существует ли уже экземпляр класса, и возвращает его. Если экземпляр не создан, то он создается и затем возвращается.

⚙️Использование шаблона Singleton в данном случае обеспечивает гарантированный единственный экземпляр класса в рамках приложения, что является полезным для создания объектов, представляющих синглтоны, такие как логгеры или конфигурационные объекты.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍144🔥2👏1
Java | Фишки и трюки
Чистый код: создание, анализ и рефакторинг Автор: Роберт Мартин Эту книгу должен прочитать каждый разработчик. А затем перечитывать каждый год! 😁 Плюс для джавистов в том что в книге все примеры написаны на Java. "Чистый код" Роберта Мартина – это практическое…
⌨️📚 Чистый код. Классы

Классы должны быть компактными.

Классы должны быть еще компактнее.

Имя класса должно описывать его ответственности. Отсюда можно и вычислить размер класса.

Функционал класса должен четко соответствовать и вписываться в название класса.

Разделяй связанность на маленькие классы. Жесткой и обильной связанности не должно быть — это усложняет поддержку и развитие проекта.

Помни о Single Responsibility. Сущность должна иметь одну и только одну причину для изменения.

Соблюдай инкапсуляцию. Ослабление инкапсуляции всегда должно быть последней мерой.

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

Если группа функций относится к определенному функционалу, то эту группу функций можно и нужно выделить в отдельный класс и использовать его экземпляр.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥21👏1
🌱 Аннотация @Transactional в Spring Framework используется для указания, что метод должен быть выполнен в рамках транзакции базы данных. Транзакция - это логическая единица работы с базой данных, которая обеспечивает атомарность, согласованность, изолированность и устойчивость (ACID) операций.

Когда метод помечается аннотацией @Transactional, Spring создает транзакцию перед выполнением метода, и завершает ее после выполнения метода. Если метод выполняется успешно, транзакция фиксируется (commit). Если возникает исключение, транзакция откатывается (rollback), и изменения, сделанные в рамках транзакции, отменяются.

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

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

private final UserRepository userRepository;

public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}

@Transactional
public void updateUser(User user) {
// Логика обновления пользователя в базе данных
userRepository.save(user);
}

@Transactional(readOnly = true)
public User getUserById(Long userId) {
// Логика получения пользователя из базы данных
return userRepository.findById(userId).orElse(null);
}
}


В этом примере метод updateUser() помечен как @Transactional, поэтому все операции базы данных, выполняемые внутри этого метода, будут выполнены в рамках одной транзакции. То же самое относится и к методу getUserById(), который также помечен аннотацией @Transactional, но с параметром readOnly = true, что указывает, что этот метод только читает данные из базы данных и не делает изменений.

Использование @Transactional позволяет управлять транзакциями на уровне методов, что делает код более чистым и поддерживаемым, а также обеспечивает надежность взаимодействия с базой данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍193👎1🔥1👏1👨‍💻1
☕️Использование ORM фреймворков

ORM (Object-Relational Mapping) фреймворки в Java позволяют программистам работать с базами данных, представляя данные в виде объектов, что упрощает процесс взаимодействия с БД. Несколько популярных технологий:

1. JPA (Java Persistence API): Стандартная спецификация для работы с объектно-реляционным отображением в Java. Пример использования JPA с Hibernate провайдером:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPU");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
Employee employee = new Employee("Jane", "Smith", 1200);
em.persist(employee);
em.getTransaction().commit();
em.close();


2. Hibernate: Один из наиболее широко используемых ORM-фреймворков в Java. Пример кода для сохранения объекта в базе данных с использованием Hibernate:

Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Employee employee = new Employee("John", "Doe", 1000);
session.save(employee);
session.getTransaction().commit();
session.close();


3. Spring Data JPA: Часть Spring Data, облегчающая работу с JPA. Пример использования Spring Data JPA для поиска сущности по идентификатору:

Employee employee = employeeRepository.findById(1L).orElse(null);


4. MyBatis: Фреймворк, который предоставляет более SQL-центричный подход к ORM. Пример маппинга объекта на SQL запрос с помощью MyBatis:

<select id="selectEmployeeById" resultType="Employee">
SELECT * FROM employees WHERE id = #{id}
</select>


ORM фреймворки упрощают работу с базами данных в Java, позволяя разработчикам оперировать объектами вместо SQL запросов, что улучшает производительность и поддерживаемость кода. Каждый из перечисленных фреймворков имеет свои особенности и преимущества, поэтому выбор зависит от конкретных потребностей проекта.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍133🔥1👏1
public class Quest {
public static void main(String[] args) {
System.out.println(calc());
}

static int calc() {
try {
if (1 == 1)
throw new RuntimeException();
return 1;
} catch (Exception e) {
return 2;
} finally {
return 3;
}
}
}
👍5
Что выведет код?
Anonymous Quiz
14%
1
17%
2
41%
3
27%
ошибка компиляции
3🔥1🎉1