Что выведет код?
#Tasks
abstract class Shape {
abstract void draw();
}
class Circle extends Shape {
void draw() {
System.out.println("Drawing Circle");
}
}
class Square extends Shape {
void draw() {
System.out.println("Drawing Square");
}
}
public class Task070225 {
public static void main(String[] args) {
Shape shape = new Circle();
shape.draw();
shape = new Square();
shape.draw();
shape = null;
shape.draw();
}
}
#Tasks
👍1
Вопросы с собеседования 👩💻
Какой тип данных используется для хранения целых чисел?
Какой тип данных используется для хранения целых чисел?
Anonymous Quiz
4%
float
94%
int
0%
double
2%
char
🔥2
Получение информации о методах.
Работа с параметрами методов
getParameterTypes()
Возвращает массив Class объектов, представляющих типы параметров метода.
Пример:
getReturnType()
Возвращает Class объект, представляющий тип возвращаемого значения метода.
Пример:
Пример получения информации о параметрах и возвращаемом типе
Пример с приватным методом
#Java #Training #Medium #Reflection_API #Method
Работа с параметрами методов
getParameterTypes()
Возвращает массив Class объектов, представляющих типы параметров метода.
Пример:
Class<?> clazz = String.class;
Method method = clazz.getMethod("substring", int.class, int.class);
Class<?>[] parameterTypes = method.getParameterTypes();
for (Class<?> paramType : parameterTypes) {
System.out.println(paramType.getName()); // Вывод: int, int
}
getReturnType()
Возвращает Class объект, представляющий тип возвращаемого значения метода.
Пример:
Class<?> returnType = method.getReturnType();
System.out.println(returnType.getName()); // Вывод: java.lang.String
Пример получения информации о параметрах и возвращаемом типе
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) throws NoSuchMethodException {
Class<?> clazz = String.class;
// Получение метода substring(int, int)
Method method = clazz.getMethod("substring", int.class, int.class);
// Получение типов параметров
System.out.println("Parameter Types:");
Class<?>[] parameterTypes = method.getParameterTypes();
for (Class<?> paramType : parameterTypes) {
System.out.println(paramType.getName());
}
// Получение возвращаемого типа
System.out.println("\nReturn Type:");
Class<?> returnType = method.getReturnType();
System.out.println(returnType.getName());
}
}
Пример с приватным методом
import java.lang.reflect.Method;
class MyClass {
private void myPrivateMethod(int a, String b) {
System.out.println("Private Method: " + a + ", " + b);
}
}
public class Main {
public static void main(String[] args) throws NoSuchMethodException {
Class<?> clazz = MyClass.class;
// Получение приватного метода
Method method = clazz.getDeclaredMethod("myPrivateMethod", int.class, String.class);
// Получение типов параметров
System.out.println("Parameter Types:");
Class<?>[] parameterTypes = method.getParameterTypes();
for (Class<?> paramType : parameterTypes) {
System.out.println(paramType.getName()); // Вывод: int, java.lang.String
}
// Получение возвращаемого типа
System.out.println("\nReturn Type:");
Class<?> returnType = method.getReturnType();
System.out.println(returnType.getName()); // Вывод: void
}
}
#Java #Training #Medium #Reflection_API #Method
👍1🔥1
Всем добрейшего субботнего утра! 🔆
Ну как, настроены на выходные?
Очень хотел продолжить запись по созданию сервиса на неделе, но что-то много задач по работе навалилось и теперь только завтра😉
Так что жду😏
Ну как, настроены на выходные?
Очень хотел продолжить запись по созданию сервиса на неделе, но что-то много задач по работе навалилось и теперь только завтра
Так что жду
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣2😱1👀1
Всем привет! ✊
Сегодня в 16:00 по МСК вновь жду Вас на встречу, где мы продолжим писать сервис доставки товаров!)😮
Приходите!✌️
Сегодня в 16:00 по МСК вновь жду Вас на встречу, где мы продолжим писать сервис доставки товаров!)
Приходите!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Spring.
Пишем сервис доставки. Встречи от 02 и 09.01.2025
Запись встречи -
YOUTUBE
RUTUBE
В целях тренировки пальцев и сознания, начали писать тренировочный сервис доставки без подготовки. Долго, с гуглом и ошибками )))
Пригодится тем кто хочет написать что-то подобное сам и готов посидеть, посмотреть на процесс написания, построения логики и размышления))
Что можно немного изучить в процессе:
— Построение бизнес логики, намапливание ее на создание сущностей, репозиториев и сервисов.
— Простая работа со спрингом, простые аннотации и зависимости.
— Проверка работоспособности через Postman
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Всем хорошего настроения и терпения при просмотре!🍸
Пишем сервис доставки. Встречи от 02 и 09.01.2025
Запись встречи -
YOUTUBE
RUTUBE
В целях тренировки пальцев и сознания, начали писать тренировочный сервис доставки без подготовки. Долго, с гуглом и ошибками )))
Пригодится тем кто хочет написать что-то подобное сам и готов посидеть, посмотреть на процесс написания, построения логики и размышления))
Что можно немного изучить в процессе:
— Построение бизнес логики, намапливание ее на создание сущностей, репозиториев и сервисов.
— Простая работа со спрингом, простые аннотации и зависимости.
— Проверка работоспособности через Postman
Смотрите, комментируйте, задавайте вопросы! Обязательно подписывайтесь на ютуб и рутюб каналы!!!
Всем хорошего настроения и терпения при просмотре!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
"Мы находимся на заре новой эры, где данные — это новая нефть."
Эта фраза принадлежит Клайву Хамби, эксперту по данным. Ее суть — в том, что данные стали самым ценным ресурсом современности. Хамби использовал этот подход, чтобы подчеркнуть важность анализа данных в бизнесе и технологиях.
Почитать короткую биографию
#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
Wikipedia
Clive Humby
British mathematician
👍2
"А вы знали что первые программы для смартфонов были написаны на языке Basic?"
Первый коммерчески успешный смартфон IBM Simon, выпущенный в 1994 году, работал на языке Basic, и пользователи могли даже рисовать на экране. Прямо как в детстве!
#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Конструктор и как его получить
Конструктор — это специальный метод в Java, который вызывается при создании объекта класса. Он используется для инициализации объекта, установки начальных значений полей и выполнения других подготовительных действий. Конструктор имеет то же имя, что и класс, и не имеет возвращаемого типа.
Пример простого конструктора:
В Java можно получить информацию о конструкторах класса с помощью рефлексии. Рефлексия — это механизм, позволяющий анализировать и изменять структуру классов, методов, полей и конструкторов во время выполнения программы.
Для работы с конструкторами используется класс java.lang.reflect.Constructor. Мы можем получить все конструкторы класса или конкретный конструктор с определенными параметрами.
Методы для получения конструкторов
getConstructors()
Этот метод возвращает массив всех публичных конструкторов класса. Конструкторы, объявленные с модификатором доступа private, protected или без модификатора (package-private), не будут включены в результат.
Пример:
Вывод:
Плюсы:
Простота использования.
Возвращает только публичные конструкторы, что может быть полезно для безопасности.
Минусы:
Не возвращает приватные или защищенные конструкторы.
getDeclaredConstructors()
Этот метод возвращает массив всех конструкторов класса, включая приватные, защищенные и package-private. В отличие от getConstructors(), этот метод позволяет получить доступ ко всем конструкторам, независимо от их модификатора доступа.
Пример:
Вывод:
Плюсы:
Возвращает все конструкторы, включая приватные.
Полезен для глубокого анализа класса.
Минусы:
Может потребовать дополнительных действий для работы с приватными конструкторами (например, вызов setAccessible(true)).
Нюансы использования
Доступ к приватным конструкторам: Если вы хотите использовать приватный конструктор, вам нужно вызвать метод setAccessible(true) на объекте Constructor, чтобы обойти проверку доступа.
Безопасность: Использование рефлексии может нарушить инкапсуляцию, поэтому будьте осторожны при работе с приватными конструкторами.
#Java #Training #Medium #Reflection_API #Constructor
Конструктор — это специальный метод в Java, который вызывается при создании объекта класса. Он используется для инициализации объекта, установки начальных значений полей и выполнения других подготовительных действий. Конструктор имеет то же имя, что и класс, и не имеет возвращаемого типа.
Пример простого конструктора:
public class Person {
private String name;
private int age;
// Конструктор
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
В Java можно получить информацию о конструкторах класса с помощью рефлексии. Рефлексия — это механизм, позволяющий анализировать и изменять структуру классов, методов, полей и конструкторов во время выполнения программы.
Для работы с конструкторами используется класс java.lang.reflect.Constructor. Мы можем получить все конструкторы класса или конкретный конструктор с определенными параметрами.
Методы для получения конструкторов
getConstructors()
Этот метод возвращает массив всех публичных конструкторов класса. Конструкторы, объявленные с модификатором доступа private, protected или без модификатора (package-private), не будут включены в результат.
Пример:
import java.lang.reflect.Constructor;
public class Main {
public static void main(String[] args) {
try {
// Получаем класс Person
Class<?> personClass = Class.forName("Person");
// Получаем все публичные конструкторы
Constructor<?>[] publicConstructors = personClass.getConstructors();
// Выводим информацию о конструкторах
for (Constructor<?> constructor : publicConstructors) {
System.out.println("Constructor: " + constructor);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Вывод:
Constructor: public Person(java.lang.String,int)
Плюсы:
Простота использования.
Возвращает только публичные конструкторы, что может быть полезно для безопасности.
Минусы:
Не возвращает приватные или защищенные конструкторы.
getDeclaredConstructors()
Этот метод возвращает массив всех конструкторов класса, включая приватные, защищенные и package-private. В отличие от getConstructors(), этот метод позволяет получить доступ ко всем конструкторам, независимо от их модификатора доступа.
Пример:
import java.lang.reflect.Constructor;
public class Main {
public static void main(String[] args) {
try {
// Получаем класс Person
Class<?> personClass = Class.forName("Person");
// Получаем все конструкторы (включая приватные)
Constructor<?>[] allConstructors = personClass.getDeclaredConstructors();
// Выводим информацию о конструкторах
for (Constructor<?> constructor : allConstructors) {
System.out.println("Constructor: " + constructor);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Вывод:
Constructor: public Person(java.lang.String,int)
Constructor: private Person()
Плюсы:
Возвращает все конструкторы, включая приватные.
Полезен для глубокого анализа класса.
Минусы:
Может потребовать дополнительных действий для работы с приватными конструкторами (например, вызов setAccessible(true)).
Нюансы использования
Доступ к приватным конструкторам: Если вы хотите использовать приватный конструктор, вам нужно вызвать метод setAccessible(true) на объекте Constructor, чтобы обойти проверку доступа.
Безопасность: Использование рефлексии может нарушить инкапсуляцию, поэтому будьте осторожны при работе с приватными конструкторами.
#Java #Training #Medium #Reflection_API #Constructor
👍1
Что выведет код?
#Tasks
public class Task100225 {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
if (i == 6) {
continue;
}
System.out.print(i + " ");
}
}
}
#Tasks
👍1
👍1
Вопросы с собеседования 👩💻
Какой модификатор доступа делает метод доступным только внутри пакета?
Какой модификатор доступа делает метод доступным только внутри пакета?
Anonymous Quiz
11%
public
23%
private
35%
default
32%
protected
👍2🔥1
Работа с параметрами конструкторов
Когда мы получаем конструктор с помощью рефлексии, часто нужно узнать, какие параметры он принимает. Для этого используется метод getParameterTypes(), который возвращает массив объектов Class<?>, представляющих типы параметров конструктора.
Пример:
Вывод:
Как использовать конструктор с параметрами
После получения конструктора и информации о его параметрах, мы можем создать новый экземпляр класса с помощью метода newInstance(). Если конструктор принимает параметры, их нужно передать в newInstance().
Пример:
Вывод:
Плюсы и минусы работы с параметрами конструкторов
Плюсы:
Гибкость: можно создавать объекты с разными параметрами во время выполнения.
Возможность анализа и использования конструкторов, которые не известны на этапе компиляции.
Минусы:
Сложность: работа с рефлексией требует больше кода и внимания к деталям.
Ошибки времени выполнения: если передать неправильные параметры, возникнет исключение.
Нюансы использования
Проверка типов: Убедитесь, что типы параметров, передаваемых в newInstance(), соответствуют ожидаемым типам конструктора.
Обработка исключений: Метод newInstance() может выбрасывать исключения, такие как InstantiationException, IllegalAccessException, IllegalArgumentException и InvocationTargetException. Их нужно обрабатывать.
#Java #Training #Medium #Reflection_API #Constructor
Когда мы получаем конструктор с помощью рефлексии, часто нужно узнать, какие параметры он принимает. Для этого используется метод getParameterTypes(), который возвращает массив объектов Class<?>, представляющих типы параметров конструктора.
Пример:
import java.lang.reflect.Constructor;
public class Main {
public static void main(String[] args) {
try {
// Получаем класс Person
Class<?> personClass = Class.forName("Person");
// Получаем все конструкторы
Constructor<?>[] constructors = personClass.getDeclaredConstructors();
// Анализируем параметры каждого конструктора
for (Constructor<?> constructor : constructors) {
System.out.println("Constructor: " + constructor);
// Получаем типы параметров
Class<?>[] parameterTypes = constructor.getParameterTypes();
System.out.println("Parameter types:");
for (Class<?> paramType : parameterTypes) {
System.out.println(" - " + paramType.getName());
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Вывод:
Constructor: public Person(java.lang.String,int)
Parameter types:
- java.lang.String
- int
Constructor: private Person()
Parameter types:
Как использовать конструктор с параметрами
После получения конструктора и информации о его параметрах, мы можем создать новый экземпляр класса с помощью метода newInstance(). Если конструктор принимает параметры, их нужно передать в newInstance().
Пример:
import java.lang.reflect.Constructor;
public class Main {
public static void main(String[] args) {
try {
// Получаем класс Person
Class<?> personClass = Class.forName("Person");
// Получаем конструктор с параметрами (String, int)
Constructor<?> constructor = personClass.getConstructor(String.class, int.class);
// Создаем экземпляр класса с параметрами
Object personInstance = constructor.newInstance("John", 30);
// Выводим результат
System.out.println("Person created: " + personInstance);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Вывод:
Person created: Person@<hashcode>
Плюсы и минусы работы с параметрами конструкторов
Плюсы:
Гибкость: можно создавать объекты с разными параметрами во время выполнения.
Возможность анализа и использования конструкторов, которые не известны на этапе компиляции.
Минусы:
Сложность: работа с рефлексией требует больше кода и внимания к деталям.
Ошибки времени выполнения: если передать неправильные параметры, возникнет исключение.
Нюансы использования
Проверка типов: Убедитесь, что типы параметров, передаваемых в newInstance(), соответствуют ожидаемым типам конструктора.
Обработка исключений: Метод newInstance() может выбрасывать исключения, такие как InstantiationException, IllegalAccessException, IllegalArgumentException и InvocationTargetException. Их нужно обрабатывать.
#Java #Training #Medium #Reflection_API #Constructor
👍1
Не могу не опубликовать.
Вот первый, за все время существования Youtube канала, наверно наиболее конструктивный комментарий, который показывает, что всегда есть куда стремиться.
Это явно показывающий пример того, что такое программирование на самом деле. Всему, что описал этот человек Вас не научат на курсах Мишустина, OTUS, и бог знает каких еще...🤦♂️
Все это - собранный по крупицам многолетний опыт, который мне, да и большинству из нас еще предстоит заработать.
Но и относиться к этому как к ИСТИНЕ принесенной мессией, тоже не стоит. Уверен, что в среде опытных разработчиков, нашли бы что возразить на некоторые доводы, опять же потому - что все это плоды опыта)))
В целом, я благодарен за критику. Я знаю, что пишу как новичок, каким по сути и являюсь🤪 , но я обещаю учиться дальше и стараться, чего и Вам желаю))
😎
Вот первый, за все время существования Youtube канала, наверно наиболее конструктивный комментарий, который показывает, что всегда есть куда стремиться.
Это явно показывающий пример того, что такое программирование на самом деле. Всему, что описал этот человек Вас не научат на курсах Мишустина, OTUS, и бог знает каких еще...
Все это - собранный по крупицам многолетний опыт, который мне, да и большинству из нас еще предстоит заработать.
Но и относиться к этому как к ИСТИНЕ принесенной мессией, тоже не стоит. Уверен, что в среде опытных разработчиков, нашли бы что возразить на некоторые доводы, опять же потому - что все это плоды опыта)))
В целом, я благодарен за критику. Я знаю, что пишу как новичок, каким по сути и являюсь
Please open Telegram to view this post
VIEW IN TELEGRAM
💯3
Вот что мне написали в комментариях под последним видео:
@AlexSmile-y2x
В кратце могу накидать:
1) create:
в рест рекоммендациях указано каким долен быть create эндпоинт и это хорошие рекоммендации. Он долен возвращать path с айди созданной сущности в хедере Location респонса, а не созданную сущность (еще и скопированную в существующую ссылку, в каком то из твоих сервисов и такое было...)
2) read:
- никогда не используется получение всех сущностей из БД, это бесполезная и ресурсоемкая операция. Всегда возвращается конкретная необходимая часть данных.
- при получении данных всегда используется фильтрация, а по хорошему еще пагинация и сортировка. Это работа на пять минут (добавление пары аннотаций и пары классов), но это хотя бы реалистичный вариант findBy эндпоинта, а не синтетический и абсолютно бесполезный как тут.
- при получении данных плохо возвращать List, т.к. часто нуно дорабатывать метаданными респонс и придется костылить. Вместо этого проще сразу создать обертку, куда можно будет добавлять поля метаданных (а еще лучше использовать готовый вариант Page)
- если у тебя есть адекватный эндпоинт с фильтрацией, то тебе не понадобятся эндпоинты типа findByStatus, findByLogin etc. т.к. он сможет обрабатывать любой из таких запросов. Собственно именно так и делается обычно
3) update:
- апдейт вообще работает сейчас некорректно. Это по твоей логике сейчас PUT, а не PATCH (почитай про разницу, только у тебя вообще почему-то ожидается POST, что вообще невалидно для ReST), но даже если сменишь на PUT это крайне неудобно использовать в реале: Ты обязуешь клиента передавать всю сущность целиком для апдейта даже одного поля, а если он передаст только поле, котрое хочет изменить, то остальные поля станут null... и даже если ты поставишь @NotNull constraint то тем самым не позволишь апдейтить nullable значения в бдю Вобщем апдей вообще не так реализуется, если интересно спроси как, я опишу детальнее (почитай про Json Merge Patch)
4) delete:
- проверка на наличие перед удалением избыточно, ты этим стреляешь сам себе в ногу: удаление должно быть идемпотентным (почитай что это такое)
- удалять все тоже стоит по фильтру (как при получении данных), тогда можно удалить несколько сущностей по айли, имени и т.п.
5) В целом по сервису:
- У тебя вообще отсутствует транзакционность. Это серьезная недоработка бэкенда.
- возвращай нормальные стутусы, иначе для чего тебе ResponseEntity? (201 для создания, 204 для удаления ит.п.)
- Нет смысла делать имплементацию публичной. Имплементации не выставляются наружу (есть интерфейс для этого, либо тогда нет смысла делать интерфейс)
- Есть смысл держать объекты максимально неизменяемыми (как минимум локальные переменные всегда должны быть final, это в перспективе позволяет отсечь огромное количество багов)
- маппинг эндпоинтов и набор параметров абсолютно рандомный. Есть стандарт ReST и RMM для работы с подобными API. Почитай про это (вкратце маппинг контроллера - имя ресурса во мн.числе, а маппинг эндпоинтов только id для findById, deleteById и update)
- именование пакетов всегда в единственном числе
- у тебя рест сервис, поэтому вместо ControllerAdvice лучше использовать RestControllerAdvice, а еще гибче использовать стартер спринга для exception-handling
- нет смысла ставить @Repository, если интерфейс и так наследует Repository (Spring Boot Data Jpa component scan уже содержит фильтр по созданию компонентов для таких интерфейсов)
- оборачивать список в optional тоже бессмысленно, list сам по себе обертка (почитай для чего создавался optional и как он используется)
- использовать @Resource из JSR-250 очень странно тут, учитывая, что у тебя Spring, надо использовать специфичные аннотации, это и более идеоматично и более гибко, т.к. вся подкапотная логика спринговая
- dto для создания, апдейта и возвращения результата всегда отличаются, это три разных типа должны быть (например OrderCreateDto, OrderUpdateDto, OrderGetDto, приставка Delivery избыточна, т.к. у тебя весь сервис и так delivery, это просто context duplication)
🤔2