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

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

Сотрудничество @offercraft_support
Download Telegram
Паттерны проектирования. Структурные паттерны. Facade (Фасад).

Паттерн проектирования "Фасад" (Facade) предоставляет упрощенный интерфейс к сложной системе классов, библиотек или фреймворков. Он помогает скрыть сложность системы и облегчить взаимодействие с ней, предоставляя клиентам более простой способ использования функциональности.
interface Car {
void start();
void stop();
}
class Key implements Car {
public void start() {
System.out.println("Вставить ключи");
}
public void stop() {
System.out.println("Вытянуть ключи");
}
}
class Engine implements Car {
public void start() {
System.out.println("Запустить двигатель");
}
public void stop() {
System.out.println("Остановить двигатель");
}
}
class Facade {
private Key key;
private Engine engine;
public Facade() {
key = new Key();
engine = new Engine();
}
public void startCar() {
key.start();
engine.start();
}
public void stoptCar() {
key.stop();
engine.stop();
}
}

public class FacadeTest {
public static void main(String[] args) {
Facade facade = new Facade();
facade.startCar();
System.out.println();
facade.stoptCar();
}
}

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

1⃣ Упрощение интерфейса: Клиенты взаимодействуют с системой через простой интерфейс.

2⃣Снижение зависимости: Клиенты меньше зависят от сложной структуры системы и могут легко ее менять.

3⃣ Упрощение кода: Упрощает код клиента, так как ему не нужно знать о всех деталях реализации подсистем.

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

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

2⃣Дополнительный уровень абстракции: Может добавить дополнительный уровень сложности в архитектуру приложения.

Таким образом, паттерн "Фасад" является полезным инструментом для упрощения работы с комплексными системами и улучшения их удобства для пользователей.

🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2👏2
Когда единственный на созвоне включил камеру:

🖥 Java Developer | Backend | #⃣#мемы #java
Please open Telegram to view this post
VIEW IN TELEGRAM
😁6🔥5👍1
🔤 Test-Driven Development: как полюбить модульное тестирование

Мы разберём страхи, останавливающие разработчика перед тем, чтобы начать, наконец, писать тесты. Выявим очевидные преимущества. Рассмотрим основные правила разработки через тестирование. И подкрепим всё это реальными примерами.

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

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

Паттерн проектирования "Мост" (Bridge) используется для разделения абстракции и реализации, что позволяет изменять их независимо друг от друга. Этот паттерн особенно полезен, когда у вас есть множество возможных реализаций и абстракций, которые могут изменяться независимо, что делает систему более гибкой и расширяемой.
interface Engine {
void setEngine();
}
abstract class Car {
protected Engine engine;
public Car(Engine engine){
this.engine = engine;
}
abstract public void setEngine();
}
class SportCar extends Car {
public SportCar(Engine engine) {
super(engine);
}
public void setEngine() {
System.out.print("SportCar engine: ");
engine.setEngine();
}
}
class UnknownCar extends Car {
public UnknownCar(Engine engine) {
super(engine);
}
public void setEngine() {
System.out.print("UnknownCar engine: ");
engine.setEngine();
}
}
class SportEngine implements Engine {
public void setEngine(){
System.out.println("sport");
}
}
class UnknownEngine implements Engine {
public void setEngine(){
System.out.println("unknown");
}
}
public class BridgeTest {
public static void main(String[] args) {
Car sportCar = new SportCar(new SportEngine());
sportCar.setEngine();
System.out.println();
Car unknownCar = new UnknownCar(new UnknownEngine());
unknownCar.setEngine();
}
}

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

1⃣ Гибкость: Позволяет изменять реализацию и абстракцию независимо друг от друга.

2⃣Упрощение кода: Избегает создания множества подклассов для каждой комбинации абстракции и реализации.

3⃣ Легкость в расширении: Новые реализации и абстракции могут быть добавлены без изменения существующего кода.

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

1⃣Сложность: Увеличивает количество классов в системе.

2⃣Потенциальная путаница: Понимание структуры может быть сложнее из-за разделения на абстракцию и реализацию.

Таким образом, паттерн "Мост" является мощным инструментом для создания гибких и расширяемых систем с четким разделением ответственности между абстракцией и реализацией.

🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32🔥2
В чем разница между апплетом и приложением Java?
Ответ -
Апплеты выполняются в браузере с поддержкой Java, но приложение Java — это отдельная программа Java, которая может быть выполнена вне браузера. Однако им обоим требуется наличие виртуальной машины Java (JVM). Кроме того, приложению Java требуется метод main с определенной сигнатурой, чтобы начать его выполнение. Апплетам Java такой метод не нужен, чтобы начать их выполнение. Наконец, апплеты Java обычно используют ограничительную политику безопасности, в то время как приложения Java обычно используют более мягкие политики безопасности.

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

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

Паттерн проектирования "Декоратор" (Decorator) используется для динамического добавления новых обязанностей объектам, не изменяя их структуру. Этот паттерн позволяет расширять функциональность объектов, оборачивая их в класс-декоратор. Это особенно полезно, когда нужно добавить функциональность к объектам на лету, не создавая при этом большое количество подклассов.
interface Car {
void draw();
}
class SportCar implements Car {
public void draw() {
System.out.println("SportCar");
}
}
class UnknownCar implements Car {
public void draw() {
System.out.println("UnknownCar");
}
}
abstract class CarDecorator implements Car {
protected Car decorated;
public CarDecorator(Car decorated){
this.decorated = decorated;
}
public void draw(){
decorated.draw();
}
}
class BlueCarDecorator extends CarDecorator {
public BlueCarDecorator(Car decorated) {
super(decorated);
}
public void draw() {
decorated.draw();
setColor();
}
private void setColor(){
System.out.println("Color: red");
}
}

public class DecoratorTest {
public static void main(String[] args) {
Car sportCar = new SportCar();
Car blueUnknownCar = new BlueCarDecorator(new UnknownCar());
sportCar.draw();
System.out.println();
blueUnknownCar.draw();
}
}

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

1⃣ Гибкость: Можно легко комбинировать различные декораторы.

2⃣Расширяемость: Новые декораторы могут быть добавлены без изменения существующего кода.

3⃣ Соблюдение принципа единственной ответственности: Каждый класс отвечает за свою часть функциональности.

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

1⃣Сложность: Может привести к большому количеству классов.

2⃣Трудности с отладкой: Из-за оберток может быть сложнее отследить поведение программы.

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

🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥2
🔤 Сериализация в Java. Давайте разбираться

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

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

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9👏3🔥2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁4👏2👍1
Leetcode. Задача 135. Candy. (hard)

В очереди стоят n детей. Каждому ребенку присвоено значение рейтинга, указанное в массиве целых чисел ratings.

Вы раздаете конфеты этим детям с соблюдением следующих требований:

Каждый ребенок должен получить как минимум одну конфету.
Дети с более высоким рейтингом должны получать больше конфет, чем их соседи.
Верните минимальное количество конфет, которое вам нужно иметь, чтобы распределить их среди детей.

Пример:
Input: ratings = [1,0,2]
Output: 5
Explanation: You can allocate to the first, second and third child with 2, 1, 2 candies respectively.


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

1⃣Мы начинаем с создания массива конфет той же длины, что и массив оценок, и инициализируем все его значения значением 1;

2⃣Проход слева-направо. Мы проходим по массиву оценок от начала до конца. Для каждого ребенка (кроме первого) мы сравниваем его рейтинг с рейтингом слева. Если он выше, мы обновляем массив конфет, чтобы этот ребенок был на единицу больше, чем ребенок слева. Это учитывает второе условие, но учитывает только левого соседа ребенка;

3⃣Проход справа-налево. После прямого прохода мы снова проходим по массиву, но в обратном направлении. На этот раз мы сравниваем рейтинг каждого ребенка с рейтингом ребенка справа. Если рейтинг выше, нам нужно убедиться, что у ребенка больше конфет, чем у правого соседа. Итак, мы обновляем массив конфет для этого потомка, чтобы он был максимальным между его текущим количеством конфет и на одну конфету больше, чем конфеты правого соседа. Это гарантирует, что оба соседних условия проверены и выполнены;

4️⃣В конце считаем сумму конфет.

😎 Решение:
class Solution {
public int candy(int[] ratings) {
int n = ratings.length;
int[] candies = new int[n];
Arrays.fill(candies, 1);

for (int i = 1; i < n; i++) {
if (ratings[i] > ratings[i - 1]) {
candies[i] = candies[i - 1] + 1;
}
}
for (int i = n - 2; i >= 0; i--) {
if (ratings[i] > ratings[i + 1]) {
candies[i] = Math.max(candies[i], candies[i + 1] + 1);
}
}
int totalCandies = 0;
for (int candy : candies) {
totalCandies += candy;
}
return totalCandies;
}
}


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

🖥 Java Developer | Backend | #⃣#вопрос #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍2👏1
🔤 Оптимистические и пессимистические блокировки на примере Hibernate (JPA)

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

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

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32🔥2
Честно, ещё один баг и я скажу «Я согласна!»

🖥 Java Developer | Backend | #⃣#мемы #java
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5👍4🔥2
Основы Java Collection Framework. Списки (List)

Java Collection Framework (JCF) — это архитектура, которая предоставляет набор интерфейсов и классов для работы с группами объектов. Основные реализации коллекций в Java включают:

😎Списки (List):

1️⃣ArrayList: динамический массив, который позволяет хранить элементы и обеспечивает быстрый доступ по индексу.

2️⃣ LinkedList: реализация списка, основанная на двусвязном списке, обеспечивает быструю вставку и удаление элементов.

Пример:

   import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class ListExample {
public static void main(String[] args) {
// Использование ArrayList
List<String> arrayList = new ArrayList<>();
arrayList.add("Apple");
arrayList.add("Banana");
System.out.println("ArrayList: " + arrayList);

// Использование LinkedList
List<String> linkedList = new LinkedList<>();
linkedList.add("Orange");
linkedList.add("Grape");
System.out.println("LinkedList: " + linkedList);
}
}


Java Collection Framework предлагает множество классов и интерфейсов для работы с данными. Выбор конкретной реализации зависит от требований к производительности и функциональности, таких как необходимость в сохранении порядка элементов или быстром доступе к элементам по индексу.

🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁4🔥2👍1
🔤 Кэширование с FeignClient: как ускорить микросервисы и стать героем проекта

FeignClient — это такая магия в мире Spring, которая позволяет взаимодействовать с другими сервисами так, будто вы вызываете локальный метод. Никакой головной боли с HTTP-запросами, сериализацией и прочими мелочами.

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

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2👏2
Основы Java Collection Framework. Множества (Set).

Java Collection Framework (JCF) — это архитектура, которая предоставляет набор интерфейсов и классов для работы с группами объектов. Основные реализации коллекций в Java включают:

😎Множества (Set):

1️⃣ HashSet: реализация множества, которая не сохраняет порядок элементов и не допускает дубликатов.

2️⃣ LinkedHashSet: сохраняет порядок добавления элементов.

3️⃣ TreeSet: реализует интерфейс NavigableSet и хранит элементы в отсортированном порядке.

Пример:

   import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.TreeSet;
import java.util.Set;

public class SetExample {
public static void main(String[] args) {
// Использование HashSet
Set<String> hashSet = new HashSet<>();
hashSet.add("Apple");
hashSet.add("Banana");
hashSet.add("Apple"); // Дубликат не будет добавлен
System.out.println("HashSet: " + hashSet);

// Использование LinkedHashSet
Set<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("Orange");
linkedHashSet.add("Grape");
System.out.println("LinkedHashSet: " + linkedHashSet);

// Использование TreeSet
Set<String> treeSet = new TreeSet<>();
treeSet.add("Banana");
treeSet.add("Apple");
treeSet.add("Grape");
System.out.println("TreeSet: " + treeSet);
}
}


Java Collection Framework предлагает множество классов и интерфейсов для работы с данными. Выбор конкретной реализации зависит от требований к производительности и функциональности, таких как необходимость в сохранении порядка элементов или быстром доступе к элементам по индексу.

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

🖥 Java Developer | Backend | #⃣#вопрос #java
Please open Telegram to view this post
VIEW IN TELEGRAM
4👏2🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7🤩3👍2
Объясните роль драйвера в JDBC.
Ответ -
Драйвер JDBC предоставляет специфичные для поставщика реализации абстрактных классов, предоставляемых API JDBC. Каждый драйвер должен предоставлять реализации для следующих классов пакета java.sql: Connection, Statement, PreparedStatement, CallableStatement, ResultSet и Driver.

🖥 Java Developer | Backend | #⃣#вопрос #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥1👏1