Разработчику на Java часто приходится сталкиваться с различными структурами данных. Это могут быть массивы, всевозможные коллекции или реализации Map. Казалось бы, всё с ними ясно и понятно, но существует несколько мелочей, о которые легко споткнуться.
🔗 Ссылка на статью
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥2❤1👏1
Паттерн проектирования "Прокси" (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();
}
}Таким образом, паттерн Прокси позволяет эффективно управлять доступом к объектам и добавлять дополнительные функции, не изменяя их реализацию.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤4🔥1
Ответ -
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
Ответ -
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥4👏4
Паттерн проектирования "Летучий вес" (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);
}
}
}
Таким образом, паттерн Прокси позволяет эффективно управлять доступом к объектам и добавлять дополнительные функции, не изменяя их реализацию.
Таким образом, паттерн "Летучий вес" помогает эффективно управлять памятью и производительностью при работе с большим количеством объектов с общими свойствами.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥2
Java Collection Framework — иерархия интерфейсов и их реализаций, которая является частью JDK и позволяет разработчику пользоваться большим количесвом структур данных из «коробки».
Данная статья поможет начинающим разработчикам понять ключевые отличия одних коллекций от других, а более опытным разработчикам просто освежить материал в памяти.
🔗 Ссылка на статью
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2👏2❤1
Leetcode. Задача 55. Jump Game. (medium)
Вам дан массив целых чисел nums. Изначально вы находитесь на первом индексе массива, и каждый элемент массива представляет вашу максимальную длину прыжка в этой позиции.
Верните true, если вы можете достичь последнего индекса, или false в противном случае.
Пример:
👨💻 Алгоритм:
1⃣ Начиная с последнего элемента начинаем проверять достижимость каждого элемента
2⃣ Если элемент достижим, то меняем значение goal на индекс достижимого элемента
3⃣ В конце проверяем условие, что мы пришли к начальной позиции
😎 Решение:
🖥 Java Developer | Backend | #⃣ #задача #java
Вам дан массив целых чисел nums. Изначально вы находитесь на первом индексе массива, и каждый элемент массива представляет вашу максимальную длину прыжка в этой позиции.
Верните true, если вы можете достичь последнего индекса, или false в противном случае.
Пример:
Input: nums = [2,3,1,1,4]
Output: true
Explanation: Jump 1 step from index 0 to 1, then 3 steps to the last index.
class Solution {
public boolean canJump(int[] nums) {
int goal = nums.length - 1;
for (int i = nums.length - 2; i >= 0; i--) {
if (i + nums[i] >= goal) {
goal = i;
}
}
return goal == 0;
}
}Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥4🤩2
Ответ -
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥3
В данной статье автор рассматривает популярные best-practice для применения коллекций.
Из опыта code-review и ответов на StackOverflow набралось немало моментов, касающихся Java Collections API, которые мне казались очевидными, но другие разработчики о них почему-то не знали или знали, но не чувствовали уверенности их применять. В этой статье я собираю в общую кучу всё, что накопилось.
🔗 Ссылка на статью
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥3👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁7🔥5
Паттерн проектирования "Фасад" (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();
}
}Таким образом, паттерн "Фасад" является полезным инструментом для упрощения работы с комплексными системами и улучшения их удобства для пользователей.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2👏2
Мы разберём страхи, останавливающие разработчика перед тем, чтобы начать, наконец, писать тесты. Выявим очевидные преимущества. Рассмотрим основные правила разработки через тестирование. И подкрепим всё это реальными примерами.
🔗 Ссылка на статью
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2👏2
Паттерн проектирования "Мост" (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();
}
}Таким образом, паттерн "Мост" является мощным инструментом для создания гибких и расширяемых систем с четким разделением ответственности между абстракцией и реализацией.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2🔥2
Ответ -
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
Ответ -
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7👏2🔥1
Паттерн проектирования "Декоратор" (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();
}
}Таким образом, паттерн "Декоратор" позволяет динамически добавлять новые функциональности к объектам, сохраняя при этом гибкость и расширяемость системы.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥2
Java предоставляет разработчикам удобные инструменты для сериализации объектов. Несмотря на то, что они кажутся донельзя примитивными, их внутренняя реализация содержит много интересных моментов. В этой статье мы рассмотрим основы сериализации и некоторые нюансы, связанные с ней. И, конечно, посмотрим, как она работает изнутри.
🔗 Ссылка на статью
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9👏3🔥2