Java for Beginner
675 subscribers
547 photos
155 videos
12 files
839 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Всем привет! 🖐

Сегодня как всегда в 16:00 по МСК, я жду вас на встречу, где мы начнем писать сервис доставки товаров с привязкой к Яндекс Картам. 😏

Ничего необычного, но пройдемся по стандартам создания Rest-приложений, продумаем логику бэкенда да и что-то напишем 🫣

Рекомендуется всем кто хочет набить руку в написании бэка для web-приложений!
🫵

И раз предложений ни от кого не поступило я придумал тему сам 😜

Жду всех, как всегда 🤨🫡
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Методы по умолчанию в интерфейсах (default методы)

Методы по умолчанию — это методы в интерфейсах, которые имеют реализацию по умолчанию. Они были добавлены в Java 8, чтобы позволить разработчикам добавлять новые методы в интерфейсы, не нарушая существующие реализации этих интерфейсов.

До Java 8 интерфейсы могли содержать только абстрактные методы (без реализации). Это создавало проблемы при необходимости добавить новый метод в интерфейс, так как все классы, реализующие этот интерфейс, должны были бы предоставить реализацию нового метода. Методы по умолчанию решают эту проблему.


Пример:
interface Vehicle {
void start(); // Абстрактный метод

default void stop() { // Метод по умолчанию
System.out.println("Vehicle stopped");
}
}

class Car implements Vehicle {
@Override
public void start() {
System.out.println("Car started");
}
}

public class Main {
public static void main(String[] args) {
Car car = new Car();
car.start(); // Вызов абстрактного метода
car.stop(); // Вызов метода по умолчанию
}
}
В этом примере метод stop() имеет реализацию по умолчанию, и класс Car не обязан его переопределять.


Зачем они были добавлены в Java 8?

Методы по умолчанию были добавлены для поддержки эволюции API. Например, в Java 8 была добавлена поддержка лямбда-выражений, и для этого потребовалось добавить новые методы в интерфейсы коллекций, такие как forEach, stream и другие. Если бы эти методы были абстрактными, все существующие классы, реализующие эти интерфейсы, сломались бы. Методы по умолчанию позволили добавить новые методы без нарушения обратной совместимости.

Пример:
interface List<E> {
void add(E element); // Абстрактный метод

default void forEach(Consumer<? super E> action) { // Метод по умолчанию
for (E element : this) {
action.accept(element);
}
}
}
Теперь все классы, реализующие List, могут использовать метод forEach без необходимости его переопределения.


Конфликты при множественном наследовании интерфейсов и их разрешение

Если класс реализует два интерфейса, и оба интерфейса имеют метод по умолчанию с одинаковой сигнатурой, возникает конфликт. В этом случае компилятор требует, чтобы класс явно переопределил этот метод.

Пример:
interface A {
default void show() {
System.out.println("Interface A");
}
}

interface B {
default void show() {
System.out.println("Interface B");
}
}

class C implements A, B {
@Override
public void show() {
System.out.println("Class C");
}
}

public class Main {
public static void main(String[] args) {
C c = new C();
c.show(); // Вывод: Class C
}
}
В этом примере класс C должен переопределить метод show(), чтобы разрешить конфликт между интерфейсами A и B.


Плюсы и минусы методов по умолчанию

Плюсы:
Гибкость API: Позволяют добавлять новые методы в интерфейсы без нарушения существующих реализаций.
Обратная совместимость: Упрощают эволюцию библиотек и фреймворков.
Повторное использование кода: Реализация по умолчанию может быть использована в нескольких классах.


Минусы:
Сложность отладки: Если метод по умолчанию используется в нескольких интерфейсах, может быть сложно отследить, какая реализация используется.
Конфликты при множественном наследовании: Требуют явного переопределения в случае конфликтов.


#Java #Training #Medium #Functional_programming #Interface #default
Что выведет код?

public class Task030225 {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("hello");
sb.append(" world").reverse().delete(0, 6).reverse();
System.out.println(sb);
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
9%
olleh
14%
world
25%
dlrow olleh
52%
hello
Или те кто пишет процессоры в Factorio 😎🤪

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
Ссылки на методы (Method References)

Ссылки на методы (Method References) — это способ сослаться на метод, не вызывая его. Они были добавлены в Java 8 как часть поддержки лямбда-выражений. Ссылки на методы позволяют сделать код более компактным и читаемым, особенно когда лямбда-выражение просто вызывает уже существующий метод.

Синтаксис ссылки на метод:
ClassName::methodName


Типы ссылок на методы

В Java существует четыре типа ссылок на методы:

Ссылка на статический метод
Используется для ссылки на статический метод класса.

Пример:
interface MathOperation {
int operate(int a, int b);
}

public class Main {
public static int add(int a, int b) {
return a + b;
}

public static void main(String[] args) {
// Ссылка на статический метод
MathOperation operation = Main::add;
System.out.println(operation.operate(5, 3)); // Вывод: 8
}
}


Ссылка на метод экземпляра

Используется для ссылки на метод конкретного объекта.

Пример:
interface Printer {
void print(String message);
}

public class Main {
public void printMessage(String message) {
System.out.println(message);
}

public static void main(String[] args) {
Main main = new Main();
// Ссылка на метод экземпляра
Printer printer = main::printMessage;
printer.print("Hello, World!"); // Вывод: Hello, World!
}
}


Ссылка на метод произвольного объекта
Используется для ссылки на метод объекта, который будет передан в качестве аргумента.

Пример:
interface StringOperation {
String operate(String str);
}

public class Main {
public static void main(String[] args) {
// Ссылка на метод произвольного объекта
StringOperation operation = String::toUpperCase;
System.out.println(operation.operate("hello")); // Вывод: HELLO
}
}


Ссылка на конструктор
Используется для ссылки на конструктор класса.

Пример:
interface Factory {
Object create();
}

public class Main {
public static void main(String[] args) {
// Ссылка на конструктор
Factory factory = String::new;
String str = (String) factory.create();
System.out.println(str.isEmpty()); // Вывод: true
}
}


Как это работает под капотом?

Ссылки на методы компилируются в объекты функциональных интерфейсов. Например, ссылка String::toUpperCase компилируется в реализацию функционального интерфейса, который вызывает метод toUpperCase на переданном объекте.

Пример:
Function<String, String> toUpperCase = String::toUpperCase;
System.out.println(toUpperCase.apply("hello")); // Вывод: HELLO
Здесь String::toUpperCase преобразуется в реализацию интерфейса Function, который принимает строку и возвращает её в верхнем регистре.


Плюсы и минусы ссылок на методы

Плюсы:
Упрощение кода: Ссылки на методы делают код более компактным и читаемым.
Повторное использование: Позволяют повторно использовать существующие методы.
Интеграция с лямбда-выражениями: Отлично сочетаются с лямбда-выражениями и Stream API.


Минусы:
Ограниченная гибкость: Ссылки на методы подходят только для случаев, когда лямбда-выражение просто вызывает существующий метод.
Сложность отладки: Могут усложнить отладку, так как код становится менее явным.
Пример использования ссылок на методов в Stream API


Ссылки на методы часто используются в Stream API для упрощения кода.

Пример:
import java.util.Arrays;
import java.util.List;

public class Main {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

// Использование ссылки на метод для вывода элементов
names.forEach(System.out::println);

// Использование ссылки на метод для преобразования строк
names.stream()
.map(String::toUpperCase)
.forEach(System.out::println);
}
}


#Java #Training #Medium #Functional_programming #Method_References
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Reflection API — Определение, назначение, преимущества и недостатки

Определение и назначение Reflection API

Reflection API — это мощный механизм в Java, который позволяет анализировать и изменять поведение классов, методов, полей и других элементов программы во время выполнения.


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


Reflection API часто используется в:
Фреймворках (например, Spring для dependency injection).
Библиотеках сериализации (например, Jackson для работы с JSON).
Инструментах тестирования (например, JUnit для запуска тестов).


Преимущества использования Reflection

Гибкость: Позволяет работать с классами, о которых нет информации на этапе компиляции.
Динамичность: Можно создавать и использовать объекты, вызывать методы и изменять поля во время выполнения.
Расширяемость: Полезно для создания универсальных инструментов, таких как ORM, IoC-контейнеры и т.д.


Недостатки использования Reflection

Производительность: Reflection работает медленнее, чем прямой вызов методов или доступ к полям, так как требует дополнительных проверок и вызовов.
Безопасность: Reflection может обходить модификаторы доступа (например, получить доступ к приватным полям), что может нарушить инкапсуляцию.
Сложность отладки: Код с использованием Reflection сложнее отлаживать, так как многие ошибки возникают только во время выполнения.


#Java #Training #Medium #Reflection_API
Что выведет код?

import java.io.StringWriter;

public class Task040225 {
public static void main(String[] args) {
StringWriter writer = new StringWriter();
writer.write("Hello");
writer.append(" World");
System.out.println(writer.toString().length());
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
0%
5
9%
9
61%
11
30%
RuntimeException
Дружная семья 😁

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
Базовые понятия и практическое применение Reflection API

Класс Class<T>: что это такое и зачем он нужен

Класс Class<T> — это основа Reflection API. Он представляет собой метаинформацию о классе или интерфейсе.

Каждый класс в Java имеет соответствующий объект Class, который можно использовать для:
Получения информации о классе (поля, методы, конструкторы).
Создания экземпляров класса.
Вызова методов и доступа к полям.


Как получить объект Class

Через .class:
Class<String> stringClass = String.class;
Этот способ работает для любого типа, включая примитивы и массивы.


Через метод getClass():
String str = "Hello";
Class<?> stringClass = str.getClass();
Этот метод доступен для всех объектов и возвращает класс их экземпляра.


Через Class.forName():
Class<?> stringClass = Class.forName("java.lang.String");
Этот метод полезен, когда имя класса известно только во время выполнения.


Практическое применение: примеры получения объекта Class

Для примитивов:
Class<?> intClass = int.class;
System.out.println(intClass.getName()); // Вывод: int


Для классов:
Class<?> stringClass = String.class;
System.out.println(stringClass.getName()); // Вывод: java.lang.String


Для массивов:
Class<?> arrayClass = int[].class;
System.out.println(arrayClass.getName());


Для анонимных классов:
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Running");
}
};
Class<?> anonymousClass = runnable.getClass();
System.out.println(anonymousClass.getName()); // Вывод: com.example.Main$1


#Java #Training #Medium #Reflection_API #Class
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Класс Class и его методы.

Класс Class в Java является частью Reflection API и представляет собой метаинформацию о классах и интерфейсах. Каждый объект в Java имеет ассоциированный объект Class, который можно использовать для получения информации о классе, его методах, полях, конструкторах и аннотациях.

Получение объекта Class

Объект Class можно получить несколькими способами:
Через объект: obj.getClass()
Через имя класса: Class.forName("полное.имя.класса")
Через литерал класса: ClassName.class


Пример:
String str = "Hello";
Class<?> strClass = str.getClass(); // Получаем Class для объекта String
Class<?> intClass = int.class; // Получаем Class для примитива int
Class<?> arrClass = String[].class; // Получаем Class для массива String[]


Методы для получения информации о классе

getName()
Возвращает полное имя класса, включая пакет.

Пример:
Class<?> strClass = String.class;
System.out.println(strClass.getName()); // Вывод: java.lang.String


getSimpleName()
Возвращает простое имя класса (без пакета).

Пример:
System.out.println(strClass.getSimpleName()); // Вывод: String


getPackage()
Возвращает объект Package, представляющий пакет, в котором находится класс.

Пример:
Package pkg = strClass.getPackage();
System.out.println(pkg.getName()); // Вывод: java.lang


getModifiers()
Возвращает модификаторы класса в виде целого числа. Для расшифровки используется класс Modifier.

Пример:
int modifiers = strClass.getModifiers();
System.out.println(Modifier.isPublic(modifiers)); // Вывод: true
System.out.println(Modifier.isFinal(modifiers)); // Вывод: true


Пример получения информации о классе
public class Main {
public static void main(String[] args) {
Class<?> clazz = String.class;
System.out.println("Class Name: " + clazz.getName());
System.out.println("Simple Name: " + clazz.getSimpleName());
System.out.println("Package: " + clazz.getPackage().getName());
System.out.println("Is Public: " + Modifier.isPublic(clazz.getModifiers()));
}
}


#Java #Training #Medium #Reflection_API #Class