С наступающим новым годом, друзья! Пусть всё получается, всё удается, ничего не зависает и не стоит на месте. Желаю, чтобы жизнь была интересной и захватывающей, чтоб не было времени на грусть и тоску, обиды и разочарования!
Пусть любое дело увенчается успехом, а твои достижения помогут достичь карьерного роста и технического прогресса!
Свежих идей и ярких воплощений нам всем!🎉 🍾🥂🎁
Пусть любое дело увенчается успехом, а твои достижения помогут достичь карьерного роста и технического прогресса!
Свежих идей и ярких воплощений нам всем!
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉45☃10🍾6🎄3🤩2🤝1🎅1
Метод Arrays.fill() для инициализации массива
Класс
Класс
java.util.Arrays имеет несколько методов с именем fill(), которые принимают разные типы аргументов и заполняют весь массив одним и тем же значением:long array[] = new long[5];У метода также есть несколько альтернатив, которые устанавливают диапазон массива в определенное значение:
Arrays.fill(array, 30);
int array[] = new int[5];Обратите внимание, что метод принимает массив, индекс первого элемента, индекс последнего элемента (не включительно) и значение.
Arrays.fill(array, 0, 3, -50);
🔥9🍾5💘2☃1❤1
Spring Framework предоставляет множество способов взаимодействия с базой данных, и одним из основных инструментов для этого являются Query Methods. Query Methods предоставляют простой способ создания запросов к базе данных на основе именованных методов в интерфейсах репозиториев.
Пример репозитория, если у нас ес
ть сущность User с полями username и email:
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByUsername(String username);
List<User> findByUsernameAndEmail(String username, String email);
}
В данном примере метод
findByUsername создает запрос, который извлекает всех пользователей с указанным именем пользователя из базы данных. Spring Data автоматически анализирует сигнатуру метода и создает SQL-запрос.Также, можно добавлять условия к запросам, используя ключевые слова, такие как
And, Or, Is, Equals, и т.д. в именах методов.Please open Telegram to view this post
VIEW IN TELEGRAM
👍14☃3❤2🎄1
Некоторые особенности:
👉 Пользовательский значок приложения с несколькими разрешениями и глубиной цвета.
👉 Собственный экран-заставка до JRE, отображаемый до запуска приложения Java.
👉 Открывает страницу загрузки Java, если не удается найти подходящую версию Java, или веб-сайт поддержки в случае ошибки.
👉 Поддерживает графический интерфейс и консольные приложения.
👉 Передаёт аргументы командной строки
👉 Легкий вес: 62 КБ.
👉 Это бесплатно и может использоваться в коммерческих целях.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12🔥4❤🔥1👍1🎄1💘1
JDBC основан на концепции драйверов, которые позволяют получать соединение с базой данных по специально описанному URL. При загрузке драйвер регистрирует себя в системе и в дальнейшем автоматически вызывается, когда программа требует URL, содержащий протокол, за который этот драйвер отвечает.
Преимущества JDBC:
👉 Лёгкость разработки: разработчик может не знать специфики базы данных, с которой работает;
👉 Код практически не меняется, если компания переходит на другую базу данных (количество изменений зависит исключительно от различий между диалектами SQL);
👉 Не нужно дополнительно устанавливать клиентскую программу;
👉 К любой базе данных можно подсоединиться через легко описываемый URL.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤🔥3🔥1🆒1
🤯12🙈9😱4🔥2👾1
Принцип программирования YAGNI — «Вам это не понадобится»
Cледование данному принципу заключается в том, что возможности, которые не описаны в требованиях к системе, просто не должны реализовываться. Это позволяет вести разработку, руководствуясь экономическими критериями: Заказчик не должен оплачивать ненужные ему функции, а разработчики не должны тратить своё оплачиваемое время на реализацию того, что не требуется.
Основная проблема, которую решает принцип YAGNI — это устранение тяги программистов к излишней абстракции, к экспериментам «из интереса» и к реализации функционала, который сейчас не нужен, но, по мнению разработчика, может вскоре понадобиться или просто будет полезен, хотя в реальности такого часто не происходит.
«Бесплатных» функций в программных продуктах просто не бывает. Если рассматривать материальную сторону, то любые ненужные, но фактически реализованные «фичи» оплачиваются либо заказчиком (в бюджет закладываются расходы на те функции, которые не нужны), либо исполнителем из прибыли по проекту. И тот, и другой варианты с точки зрения бизнеса неверны. Если же говорить о нематериальных затратах, то любые «бонусные» возможности усложняют сопровождение, увеличивают вероятность ошибок и усложняют взаимодействие с продуктом, — между объёмом кодовой базы и описанными характеристиками есть прямая зависимость. Больше написанного кода — труднее сопровождать и выше вероятность появления «багов», тут очень уместна поговорка: «лучший код — это ненаписанный код».
Принципы YAGNI и KISS очень похожи, если KISS нацелен на упрощение и полезен в плане работы с теми требованиями, которые имеют место быть, то YAGNI более категоричен и применяется для ограждения проектов по разработке ПО от «размывания» их рамок.
Подход к реализации проектов строго по ТЗ бывает верен с нескольких ракурсов: заказчик не должен платить за то, что ему не надо, а продукт должен быть максимально сопровождаем и его качество не должно страдать от реализации ненужных функций.
Cледование данному принципу заключается в том, что возможности, которые не описаны в требованиях к системе, просто не должны реализовываться. Это позволяет вести разработку, руководствуясь экономическими критериями: Заказчик не должен оплачивать ненужные ему функции, а разработчики не должны тратить своё оплачиваемое время на реализацию того, что не требуется.
Основная проблема, которую решает принцип YAGNI — это устранение тяги программистов к излишней абстракции, к экспериментам «из интереса» и к реализации функционала, который сейчас не нужен, но, по мнению разработчика, может вскоре понадобиться или просто будет полезен, хотя в реальности такого часто не происходит.
«Бесплатных» функций в программных продуктах просто не бывает. Если рассматривать материальную сторону, то любые ненужные, но фактически реализованные «фичи» оплачиваются либо заказчиком (в бюджет закладываются расходы на те функции, которые не нужны), либо исполнителем из прибыли по проекту. И тот, и другой варианты с точки зрения бизнеса неверны. Если же говорить о нематериальных затратах, то любые «бонусные» возможности усложняют сопровождение, увеличивают вероятность ошибок и усложняют взаимодействие с продуктом, — между объёмом кодовой базы и описанными характеристиками есть прямая зависимость. Больше написанного кода — труднее сопровождать и выше вероятность появления «багов», тут очень уместна поговорка: «лучший код — это ненаписанный код».
Принципы YAGNI и KISS очень похожи, если KISS нацелен на упрощение и полезен в плане работы с теми требованиями, которые имеют место быть, то YAGNI более категоричен и применяется для ограждения проектов по разработке ПО от «размывания» их рамок.
Подход к реализации проектов строго по ТЗ бывает верен с нескольких ракурсов: заказчик не должен платить за то, что ему не надо, а продукт должен быть максимально сопровождаем и его качество не должно страдать от реализации ненужных функций.
🔥10👍3💯2❤1🤝1
👍6😱4🥰1🤗1
Реализация стека с помощью интерфейса Deque
Deque (Double-ended queue) представляет собой интерфейс, который расши
Так же, Deque содержит методы для работы со стеком:
Deque (Double-ended queue) представляет собой интерфейс, который расши
ряет функциональность обычной очереди (Queue). Он позволяет добавлять и удалять элементы как в начале, так и в конце очереди. Deque является частью Java Collections Framework и введен в Java 6.Так же, Deque содержит методы для работы со стеком:
// помещает элемент в стек.
void push(E e);
// извлекает элемент из стека.
E pop();
Deque реализуется различными классами, такими как LinkedList и ArrayDeque. Выбор конкретной реализации зависит от требований к производительности и использования памяти.👍9❤3🔥2👏1
Присоединение вызова метода к телу метода называется связыванием. Если связывание проводится компилятором (компоновщиком) перед запуском программы, то оно называется статическим или ранним связыванием (early binding).
В свою очередь, позднее связывание (late binding) это связывание, проводимое непосредственно во время выполнения программы, в зависимости от типа объекта. Позднее связывание также называют динамическим (dynamic) или связыванием на стадии выполнения (runtime binding). В языках, реализующих позднее связывание, должен существовать механизм определения фактического типа объекта во время работы программы, для вызова подходящего метода. Иначе говоря, компилятор не знает тип объекта, но механизм вызова методов определяет его и вызывает соответствующее тело метода. Механизм позднего связывания зависит от конкретного языка, но нетрудно предположить, что для его реализации в объекты должна включаться какая-то дополнительная информация.
Для всех методов Java используется механизм позднего (динамического) связывания, если только метод не был объявлен как
final, static или private (приватные методы являются final по умолчанию).Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥2❤1
JSON Web Token (JWT) — это открытый стандарт (RFC 7519) для создания токенов доступа, основанный на формате JSON. Как правило, используется для передачи данных для аутентификации в клиент-серверных приложениях. Токены создаются сервером, подписываются секретным ключем и передаются клиенту, который в дальнейшем использует данный токен для подтверждения подлинности аккаунта.
JWT состоит из трех частей, разделенных точкой: заголовок (Header), полезная нагрузка (Payload), и подпись (Signature). Каждая часть представлена в кодировке Base64.
Header содержит два элемента - тип токена (typ) и алгоритм хеширования (alg). Тип токена обычно установлен в "JWT", а алгоритм хеширования указывает, как будет создана подпись.
Payload содержит данные о пользователе, например идентификатор, имя и прочие.
Signature создается с использованием алгоритма хеширования и секретного ключа. Подпись обеспечивает проверку целостности токена и подтверждает, что токен был создан доверенной стороной.
В клиент-серверных приложениях используются два вида токена:
Access-токен — это токен, который предоставляет доступ его владельцу к защищённым ресурсам сервера. Обычно он имеет короткий срок жизни и может нести в себе дополнительную информацию, такую как IP-адрес стороны, запрашивающей данный токен.
Refresh-токен — это токен, позволяющий клиентам запрашивать новые access-токены по истечении их времени жизни. Данные токены обычно выдаются на длительный срок.
Как правило, при использовании JSON-токенов в клиент-серверных приложениях реализована следующая схема:
1️⃣ Клиент проходит аутентификацию в приложении (к примеру, с использованием логина и пароля).
2️⃣ В случае успешной аутентификации сервер отправляет клиенту access- и refresh-токены.
3️⃣ При дальнейшем обращении к серверу клиент использует access-токен. Сервер проверяет токен на валидность и предоставляет клиенту доступ к ресурсам.
4️⃣ В случае, если access-токен становится невалидным, клиент отправляет refresh-токен, в ответ на который сервер предоставляет два обновлённых токена.
5️⃣ В случае, если refresh-токен становится невалидным, клиент опять должен пройти процесс аутентификации.
JWT позволяет создавать безопасные механизмы аутентификации и авторизации без необходимости сохранения состояния сессии на сервере. Он также широко используется в распределенных системах и при создании микросервисов для передачи данных о субъекте (пользователе) между различными компонентами системы.
JWT состоит из трех частей, разделенных точкой: заголовок (Header), полезная нагрузка (Payload), и подпись (Signature). Каждая часть представлена в кодировке Base64.
Header содержит два элемента - тип токена (typ) и алгоритм хеширования (alg). Тип токена обычно установлен в "JWT", а алгоритм хеширования указывает, как будет создана подпись.
Payload содержит данные о пользователе, например идентификатор, имя и прочие.
Signature создается с использованием алгоритма хеширования и секретного ключа. Подпись обеспечивает проверку целостности токена и подтверждает, что токен был создан доверенной стороной.
В клиент-серверных приложениях используются два вида токена:
Access-токен — это токен, который предоставляет доступ его владельцу к защищённым ресурсам сервера. Обычно он имеет короткий срок жизни и может нести в себе дополнительную информацию, такую как IP-адрес стороны, запрашивающей данный токен.
Refresh-токен — это токен, позволяющий клиентам запрашивать новые access-токены по истечении их времени жизни. Данные токены обычно выдаются на длительный срок.
Как правило, при использовании JSON-токенов в клиент-серверных приложениях реализована следующая схема:
1️⃣ Клиент проходит аутентификацию в приложении (к примеру, с использованием логина и пароля).
2️⃣ В случае успешной аутентификации сервер отправляет клиенту access- и refresh-токены.
3️⃣ При дальнейшем обращении к серверу клиент использует access-токен. Сервер проверяет токен на валидность и предоставляет клиенту доступ к ресурсам.
4️⃣ В случае, если access-токен становится невалидным, клиент отправляет refresh-токен, в ответ на который сервер предоставляет два обновлённых токена.
5️⃣ В случае, если refresh-токен становится невалидным, клиент опять должен пройти процесс аутентификации.
JWT позволяет создавать безопасные механизмы аутентификации и авторизации без необходимости сохранения состояния сессии на сервере. Он также широко используется в распределенных системах и при создании микросервисов для передачи данных о субъекте (пользователе) между различными компонентами системы.
👍16❤1🔥1🏆1👨💻1
Проще говоря, это способ взаимодействия какого-то программного кода с набором каких-то программных компонентов, с помощью которых одна компьютерная программа (например, бот или сайт) может использовать другую программу.
Если программу (модуль, библиотеку) рассматривать как чёрный ящик, то API — это набор «ручек», которые доступны пользователю данного ящика и которые он может вертеть и переключать.
Примеры API: Windows API, DirectX (DirectDraw/Direct3D), Vulkan.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤1🔥1👏1🤝1
Можно и так и так. Если посмотреть
реализацию equals() в Enum, то мы там увидим сравнение через ==
public final boolean equals(Object other) {
return this==other;
}
При сравнении через
==, мы застрахуем себя от NullPointerException.Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥3❤1
В Java абстрактный класс и интерфейс представляют два различных механизма для достижения абстракции и обеспечения множественного наследования. Вот основные различия между ними:
1️⃣ Абстрактный класс (Abstract Class):
👉 Может содержать как абстрактные методы (методы без тела), так и обычные методы с реализацией.
👉 Может иметь переменные экземпляра (поля).
👉 Может содержать конструкторы.
👉 Поддерживает одиночное наследование: подкласс можно наследовать только от одного абстрактного класса.
abstract class Animal {
String name;
abstract void makeSound();
void eat() {
System.out.println(name + " is eating.");
}
}
2️⃣ Интерфейс (Interface):
👉 Содержит только абстрактные методы (в Java 8 и выше может содержать методы с реализацией, помеченные ключевым сло
вом default).👉 Не может иметь переменных экземпляра, кроме переменных, объявленных
как static final.👉 Не содержит конструкторов.
👉 Поддерживает множественное наследование: класс может реализовывать несколько интерфейсов.
interface Animal {
void makeSound();
void eat();
}
Когда использовать:
👉 Используйте абстрактные классы, когда у вас есть общая реализация для нескольких классов и вы хотите предоставить базовый функционал.
👉 Используйте интерфейсы, когда вам нужна поддержка множественного наследования, или когда классы, возможно, уже наследуют от других классов.
Обычно считается хорошей практикой использовать интерфейсы для определения контракта и абстрактные классы для предоставления базовой реализации. В Java 8 и более новых версиях с появлением интерфейсов с методами по умолчанию (default methods), различия стали менее явными, и выбор может зависеть от конкретной ситуации.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤2👎1🔥1🤡1🥴1🏆1👨💻1
Считывание файла из стандартного потока ввода
Перенаправление ввода-вывода — возможность командной оболочки ряда операционных систем перенаправлять стандартные потоки в определённое пользователем место, например, в файл. Характерна для Unix-подобных операционных систем, но в разной степени реализована и в операционных системах других семейств.
Перенаправление обычно осуществляется вставкой специального символа > или < после команды.
Обычно синтаксис выглядит так:
команда1 > файл1 — выполняет команду1, помещая стандартный вывод в файл1;
команда1 < файл1 — выполняет команду1, используя в качестве источника ввода файл1 (вместо клавиатуры).
Для перенаправления содержимого файла в поток ввода нашего приложения воспользуемся командой:
Перенаправление ввода-вывода — возможность командной оболочки ряда операционных систем перенаправлять стандартные потоки в определённое пользователем место, например, в файл. Характерна для Unix-подобных операционных систем, но в разной степени реализована и в операционных системах других семейств.
Перенаправление обычно осуществляется вставкой специального символа > или < после команды.
Обычно синтаксис выглядит так:
команда1 > файл1 — выполняет команду1, помещая стандартный вывод в файл1;
команда1 < файл1 — выполняет команду1, используя в качестве источника ввода файл1 (вместо клавиатуры).
Для перенаправления содержимого файла в поток ввода нашего приложения воспользуемся командой:
java -jar app.jar < file.txt
❤5❤🔥2👍2💘1
import java.lang.annotation.*;
// Создание аннотации
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface MethodInfo {
String author() default "unknown";
String date();
int revision() default 1;
String comments();
}
public class Example {
// Использование аннотации
@MethodInfo(author = "John Doe", date = "2022-08-15", comments = "Example method")
public void performAction() {
// Реализация метода
}
}
В этом примере создается аннотация
MethodInfo с параметрами author, date, revision и comments. Затем аннотация применяется к методу performAction. Таким образом, аннотации могут использоваться для предоставления дополнительной информации о вашем коде, что может быть полезно при разработке, тестировании и поддержке проекта.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍3❤1💯1