Java Developer | Backend
1.7K subscribers
136 photos
1 video
231 links
Авторский канал действующего java разработчика

Платформа: https://offercraft.ru

Сотрудничество @offercraft_support
Download Telegram
🔤 «Научиться Spring — бессмысленное занятие» — Джош Лонг, главный евангелист Spring о внутренней кухне проекта

Именно его докладами открываются Java-конференции по всему миру. Именно он отвечает на вопросы сообщества, делает Spring Tips на YouTube, именно его «This week in Spring» мы читаем каждую неделю и многое другое.

🔗 Ссылка на статью

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2🔥1
Паттерны проектирования. Порождающие паттерны. Prototype (Прототип).

Паттерн проектирования Prototype (Прототип) используется для создания новых объектов путем копирования существующих. Этот паттерн полезен, когда создание нового экземпляра объекта является более затратным по времени или ресурсам, чем его копирование. Прототип позволяет избежать сложного процесса инициализации объектов, предоставляя возможность клонировать уже существующие экземпляры.
// Интерфейс прототипа
interface Prototype {
Prototype clone();
}

// Конкретный прототип
class Book implements Prototype {
private String title;
private String author;

public Book(String title, String author) {
this.title = title;
this.author = author;
}

@Override
public Prototype clone() {
return new Book(this.title, this.author); // Клонируем объект
}
}

public class Main {
public static void main(String[] args) {
// Создаем оригинальный объект Book
Book originalBook = new Book("1984", "George Orwell");

// Клонируем оригинальный объект
Book clonedBook = (Book) originalBook.clone();

// Изменяем заголовок клонированной книги
// Это не повлияет на оригинальный объект
System.out.println("Original: " + originalBook);
System.out.println("Cloned: " + clonedBook);
}
}

😎 Преимущества паттерна Prototype

1️⃣ Производительность: Позволяет создавать новые объекты быстрее, чем через вызов конструктора.

2️⃣ Гибкость: Легко добавлять новые типы объектов без изменения кода клиента.

3️⃣ Изоляция: Логика создания объектов отделена от их использования.

🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2👏2🔥1
Вопрос: Когда объект становится доступным для сборки мусора в Java?
Ответ -
Объект Java подлежит сборке мусора, когда он становится недоступным для программы, в которой он в данный момент используется.

🖥 Java Developer | Backend | #⃣#вопрос #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5👏3🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
🤩31🔥1👏1
Leetcode. Задача 46. Permutations. (medium)

Дан массив уникальных чисел, необходимо вернуть все возможные перестановки. Ответ можно сформировать в любом порядке.

Пример:
Input: [1,2,3]
Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]


👨‍💻 Алгоритм:

1⃣Объявим функцию для рекурсии и не забудем добавить условие для выхода из нее;

2⃣В цикле начинаем формировать возможные перестановки, добавляя в массив по одному элементу;

3⃣Затем вызываем этот же метод, передавая получившийся массив;

4️⃣Далее убираем добавленный элемент для добавления следующих элементов из начального массива.

😎 Решение:
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
backtrack(list, new ArrayList<>(), nums);
return list;
}

private void backtrack(List<List<Integer>> list, List<Integer> tempList, int[] nums) {
if (tempList.size() == nums.length) {
list.add(new ArrayList<>(tempList));
} else {
for (int i = 0; i < nums.length; i++) {
if (tempList.contains(nums[i])) continue;
tempList.add(nums[i]);
backtrack(list, tempList, nums);
tempList.remove(tempList.size() - 1);
}
}
}
}

🖥 Java Developer | Backend | #⃣#задача #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2🤩2
Вопрос: В чем разница между Exception и Error в Java?
Ответ -
Классы Exception и Error являются подклассами класса Throwable. Класс Exception используется для исключительных условий, которые должна перехватывать пользовательская программа. Класс Error определяет исключения, которые не могут быть перехвачены пользовательской программой.

🖥 Java Developer | Backend | #⃣#вопрос #java
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍1🔥1
Паттерны проектирования. Структурные паттерны. Adapter (Адаптер).

Паттерн проектирования Adapter (Адаптер) используется для приведения интерфейса одного класса в соответствие с интерфейсом, ожидаемым клиентом. Этот паттерн позволяет несовместимым интерфейсам работать вместе, обеспечивая возможность интеграции старых и новых компонентов.
// Целевой интерфейс
interface Target {
void request();
}
// Адаптируемый класс
class Adaptee {
public void specificRequest() {
System.out.println("Called specificRequest() from Adaptee.");
}
}
// Адаптер
class Adapter implements Target {
private Adaptee adaptee;

public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}

@Override
public void request() {
// Перенаправляем вызов на метод адаптируемого класса
adaptee.specificRequest();
}
}
public class Main {
public static void main(String[] args) {
// Создаем адаптируемый класс
Adaptee adaptee = new Adaptee();

// Создаем адаптер, передавая адаптируемый объект
Target target = new Adapter(adaptee);

// Теперь клиент может использовать адаптер как целевой интерфейс
target.request();
}
}

😎 Преимущества паттерна Adapter

1️⃣ Совместимость: Позволяет интегрировать старые классы с новыми системами без изменения их кода.

2️⃣Гибкость: Упрощает замену компонентов в системе.

3️⃣ Чистота кода: Поддерживает принцип единственной ответственности, отделяя логику адаптации от бизнес-логики.

Паттерн Adapter является полезным инструментом для обеспечения совместимости между различными компонентами системы. Он позволяет эффективно интегрировать устаревшие или несовместимые классы, что делает его важным паттерном в разработке программного обеспечения.

🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2👏1
🔤 Трассировка сервисов, OpenTracing и Jaeger

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

🔗 Ссылка на статью

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥1👏1
Please open Telegram to view this post
VIEW IN TELEGRAM
👏7😁2🔥1
Leetcode. Задача 169. Majority Element. (easy)

Дан массив nums размера n, верните элемент большинства.

Элемент большинства — это элемент, который встречается более чем ⌊n / 2⌋ раз. Можно предположить, что элемент большинства всегда существует в массиве.

Пример:
Input: nums = [1,1,2,2,1]
Output: 1


👨‍💻 Алгоритм:

1⃣Использование HashMap для подсчета:
Создайте HashMap для отслеживания количества каждого элемента в массиве.

2⃣Подсчет вхождений элементов:
Пройдите по массиву nums, увеличивая счетчик в HashMap для каждого элемента.

3⃣Поиск элемента большинства:
Определите элемент большинства, просмотрев HashMap и найдя ключ с максимальным значением, которое должно быть больше ⌊n / 2⌋

😎 Решение:
class Solution {
public int majorityElement(int[] nums) {
HashMap<Integer, Integer> hash = new HashMap<>();
int res = 0;
int majority = 0;

for (int n : nums) {
hash.put(n, 1 + hash.getOrDefault(n, 0));
if (hash.get(n) > majority) {
res = n;
majority = hash.get(n);
}
}
return res;
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2👏1
Вопрос: Что такое Servlet Chaining?
Ответ -
Servlet Chaining — это метод, при котором вывод одного сервлета отправляется второму сервлету. Вывод второго сервлета может быть отправлен третьему сервлету и т. д. Последний сервлет в цепочке отвечает за отправку ответа клиенту.

🖥 Java Developer | Backend | #⃣#вопрос #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2👏2
🔤 Пришел, увидел, обобщил: погружаемся в Java Generics

Java Generics — это одно из самых значительных изменений за всю историю языка Java. «Дженерики», доступные с Java 5, сделали использование Java Collection Framework проще, удобнее и безопаснее. Ошибки, связанные с некорректным использованием типов, теперь обнаруживаются на этапе компиляции. Да и сам язык Java стал еще безопаснее. Несмотря на кажущуюся простоту обобщенных типов, многие разработчики сталкиваются с трудностями при их использовании. В этом посте я расскажу об особенностях работы с Java Generics, чтобы этих трудностей у вас было поменьше. Пригодится, если вы не гуру в дженериках, и поможет избежать много трудностей при погружении в тему.

🔗 Ссылка на статью

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥1😁1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2😁1
Паттерны проектирования. Структурные паттерны. Composite (Компоновщик).

Паттерн проектирования "Компоновщик" (Composite) позволяет объединять объекты в древовидную структуру для представления иерархий "часть-целое". Он помогает клиентам работать с отдельными объектами и группами объектов единообразно.
interface Car {
void draw(String color);
}
class SportCar implements Car {
public void draw(String color) {
System.out.println("SportCar color: " + color);
}
}
class UnknownCar implements Car {
public void draw(String color) {
System.out.println("UnknownCar color: " + color);
}
}
class Drawing implements Car {
private List<Car> cars = new ArrayList<Car>();
public void draw(String color) {
for(Car car : cars) {
car.draw(color);
}
}
public void add(Car s){
this.cars.add(s);
}
}

public class CompositeTest {
public static void main(String[] args) {
Car sportCar = new SportCar();
Car unknownCar = new UnknownCar();
Drawing drawing = new Drawing();
drawing.add(sportCar);
drawing.add(unknownCar);
drawing.draw("green");
}
}

😎 Преимущества паттерна Composite

1⃣ Упрощение кода клиента: Клиентский код может работать с объектами без необходимости знать, являются ли они листьями или компоновщиками.

2⃣Гибкость: Легко добавлять новые виды графических элементов без изменения существующего кода.

3⃣ Иерархическая структура: Позволяет создавать сложные структуры из простых элементов.

Таким образом, паттерн Компоновщик помогает организовать иерархии объектов и упрощает работу с ними в клиентском коде.

🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍61🔥1👏1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁6👏2🔥1
🔤 Структуры данных в Java. Полезные методы вспомогательных классов

Разработчику на Java часто приходится сталкиваться с различными структурами данных. Это могут быть массивы, всевозможные коллекции или реализации Map. Казалось бы, всё с ними ясно и понятно, но существует несколько мелочей, о которые легко споткнуться.

🔗 Ссылка на статью

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥21👏1
Паттерны проектирования. Структурные паттерны. Proxy (Прокси).

Паттерн проектирования "Прокси" (Proxy) предоставляет суррогатный или заместительный объект, который управляет доступом к другому объекту. Этот паттерн используется для контроля доступа к объекту, добавления дополнительной логики перед или после вызова метода реального объекта, а также для ленивой инициализации.
interface Image {
void display();
}
class RealImage implements Image {
private String file;
public RealImage(String file){
this.file = file;
load(file);
}
private void load(String file){
System.out.println("Загрузка " + file);
}
public void display() {
System.out.println("Просмотр " + file);
}
}
class ProxyImage implements Image {
private String file;
private RealImage image;
public ProxyImage(String file){
this.file = file;
}
public void display() {
if(image == null){
image = new RealImage(file);
}
image.display();
}
}

public class ProxyTest {
public static void main(String[] args) {
Image image = new ProxyImage("test.jpg");
image.display();
image.display();
}
}

😎 Преимущества паттерна Proxy

1⃣ Контроль доступа: Позволяет ограничить доступ к реальному объекту.

2⃣Оптимизация ресурсов: Реальный объект создается только при необходимости, что экономит память и время.

3⃣ Дополнительная логика: Можно добавлять дополнительную функциональность (например, логирование, кэширование) без изменения реального объекта.

Таким образом, паттерн Прокси позволяет эффективно управлять доступом к объектам и добавлять дополнительные функции, не изменяя их реализацию.

🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍94🔥1
Вопрос: В чем разница между throw и throws?
Ответ -
Ключевое слово throw используется для явного вызова исключения в программе. Напротив, предложение throws используется для указания тех исключений, которые не обрабатываются методом. Каждый метод должен явно указывать, какие исключения не обрабатываются, чтобы вызывающие этот метод могли защититься от возможных исключений. Наконец, несколько исключений разделяются запятой.

🖥 Java Developer | Backend | #⃣#вопрос #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👏3
Please open Telegram to view this post
VIEW IN TELEGRAM
😁8🔥5👍2
Вопрос: Какова важность блока finally в обработке исключений?
Ответ -
Блок finally всегда будет выполняться, независимо от того, выброшено ли исключение. Даже в случае, если оператор catch отсутствует и выброшено исключение, блок finally все равно будет выполняться. Последнее, что следует упомянуть, — блок finally используется для освобождения ресурсов, таких как буферы ввода-вывода, соединения с базой данных и т. д.

🖥 Java Developer | Backend | #⃣#вопрос #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥4👏4
Паттерны проектирования. Структурные паттерны. Flyweight (Легковес).

Паттерн проектирования "Летучий вес" (Flyweight) используется для оптимизации памяти и повышения производительности, особенно когда необходимо создать множество объектов с одинаковыми или схожими свойствами. Этот паттерн позволяет разделять общее состояние объектов и хранить уникальные данные отдельно.
// Интерфейс для летучего веса
public interface MyCharacter {
void display(int position);
}
//Конкретный летучий вес
public class FlyweightCharacter implements MyCharacter {
private final char character;

public FlyweightCharacter(char character) {
this.character = character;
}

@Override
public void display(int position) {
System.out.println("Character: " + character + ", Position: " + position);
}
}
// Фабрика для создания и хранения летучих весов
public class CharacterFactory {
private final Map<Character, FlyweightCharacter> characters = new HashMap<>();

public FlyweightCharacter getCharacter(char character) {
// Если символ уже существует, вернуть его; иначе создать новый
if (!characters.containsKey(character)) {
characters.put(character, new FlyweightCharacter(character));
}
return characters.get(character);
}
}

public class Main {
public static void main(String[] args) {
CharacterFactory factory = new CharacterFactory();

// Создаем строку символов
String text = "HELLO FLYWEIGHT";

for (int i = 0; i < text.length(); i++) {
char currentChar = text.charAt(i);
FlyweightCharacter flyweightChar = factory.getCharacter(currentChar);
flyweightChar.display(i);
}
}
}

😎 Преимущества паттерна Flyweight

1⃣ Экономия памяти: Паттерн позволяет сократить количество создаваемых объектов за счет разделения общего состояния.

2⃣Улучшение производительности: Уменьшение количества объектов может привести к улучшению производительности приложения.

3⃣ Упрощение управления состоянием: Легче управлять общим состоянием между объектами.

Таким образом, паттерн Прокси позволяет эффективно управлять доступом к объектам и добавлять дополнительные функции, не изменяя их реализацию.

😌 Недостатки паттерна Flyweight

1️⃣Сложность кода: Введение дополнительного уровня абстракции может усложнить код.

2️⃣Управление состоянием: Необходимо тщательно управлять состоянием объектов для предотвращения ошибок.

Таким образом, паттерн "Летучий вес" помогает эффективно управлять памятью и производительностью при работе с большим количеством объектов с общими свойствами.

🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥2