Java | Фишки и трюки
7.21K subscribers
182 photos
29 videos
6 files
40 links
Java: примеры кода, интересные фишки и полезные трюки

Купить рекламу: https://telega.in/c/java_tips_and_tricks

✍️По всем вопросам: @Pascal4eg
Download Telegram
Что выведет код?
Anonymous Quiz
17%
TO BE
34%
NOT TO BE
49%
ошибка компиляции
🎉2❤‍🔥11🤡1
Паттерн MVC (Model-View-Controller) — это архитектурный шаблон, используемый для разделения приложения на три основных компонента: модель, представление и контроллер. Это помогает улучшить организацию кода, облегчить его поддержку и тестирование.

Модель (Model) предоставляет данные и реагирует на команды контроллера, изменяя своё состояние.

Представление (View) отвечает за отображение данных модели пользователю, реагируя на изменения модели.

Контроллер (Controller) интерпретирует действия пользователя, оповещая модель о необходимости изменений.

Основная цель применения этой концепции состоит в отделении бизнес-логики (модели) от её визуализации (представления, вида). За счёт такого разделения повышается возможность повторного использования кода. Наиболее полезно применение данной концепции в тех случаях, когда пользователь должен видеть те же самые данные одновременно в различных контекстах и/или с различных точек зрения. В частности, выполняются следующие задачи:

1️⃣ К одной модели можно присоединить несколько видов, при этом не затрагивая реализацию модели. Например, некоторые данные могут быть одновременно представлены в виде электронной таблицы, гистограммы и круговой диаграммы;

2️⃣ Не затрагивая реализацию видов, можно изменить реакции на действия пользователя (нажатие мышью на кнопке, ввод данных) — для этого достаточно использовать другой контроллер;

3️⃣ Ряд разработчиков специализируется только в одной из областей: либо разрабатывают графический интерфейс, либо разрабатывают бизнес-логику. Поэтому возможно добиться того, что программисты, занимающиеся разработкой бизнес-логики (модели), вообще не будут осведомлены о том, какое представление будет использоваться.

#java #pattern #MVC
👍42🔥1
⌨️ Функциональный интерфейс Consumer является частью пакета java.util.function и предназначен для представления операции, которая принимает один входной аргумент и не возвращает результата. Этот интерфейс используется для операций, выполняемых с объектом, но не возвращающих значения, таких как вывод данных, модификация объектов и выполнение побочных эффектов.

Интерфейс Consumer аннотирован @FunctionalInterface, что означает, что он предназначен для использования с лямбда-выражениями и содержит ровно один абстрактный метод:

void accept(T t);

Выполняет операцию над переданным аргументом типа T.

Пример:

List<String> strings = Arrays.asList("a", "b", "c");
Consumer<String> printer = System.out::println;
strings.forEach(printer);
// a
// b
// c


Еще один:

List<String> list = Arrays.asList("a", "b", "c");
Consumer<List<String>> listModifier = l -> l.add("d");
listModifier.accept(list);
System.out.println(list); // [a, b, c, d]


#java #consumer
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤‍🔥1👨‍💻1
🤣20👍3🔥2👏1😁1
This media is not supported in your browser
VIEW IN TELEGRAM
Юзеры не знают своих героев...
28👍9😁9🔥4💯2👏1🤣1
⌨️ Что такое «локальный класс»? Каковы его особенности?

Local inner class (Локальный класс) - это вложенный класс, который может быть декларирован в любом блоке, в котором разрешается декларировать переменные. Как и простые внутренние классы (Member inner class) локальные классы имеют имена и могут использоваться многократно. Как и анонимные классы, они имеют окружающий их экземпляр только тогда, когда применяются в нестатическом контексте.

Локальные классы имеют следующие особенности:

Видны только в пределах блока, в котором объявлены;

Не могут быть объявлены как private/public/protected или static;

Не могут иметь внутри себя статических объявлений методов и классов, но могут иметь финальные статические поля, проинициализированные константой;

Имеют доступ к полям и методам обрамляющего класса;

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


public class OuterClass {

void someMethod() {
int localVar = 10;

// Локальный класс внутри метода
class LocalClass {
void display() {
// Локальный класс имеет доступ к переменным метода
System.out.println("Local variable: " + localVar);
}
}

LocalClass local = new LocalClass();
local.display();
}

public static void main(String[] args) {
OuterClass outer = new OuterClass();
outer.someMethod();
}
}


#java #local #inner #class
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥21
⌨️ Какие существуют особенности использования вложенных классов: статических и внутренних? В чем заключается разница между ними?

Вложенные классы могут обращаться ко всем членам обрамляющего класса, в том числе и приватным.

Для создания объекта статического вложенного класса объект внешнего класса не требуется.

Из объекта статического вложенного класса нельзя обращаться к не статическим членам обрамляющего класса напрямую, а только через ссылку на экземпляр внешнего класса.

Обычные вложенные классы не могут содержать статических методов, блоков инициализации и классов. Статические вложенные классы - могут.

В объекте обычного вложенного класса хранится ссылка на объект внешнего класса. Внутри статической такой ссылки нет. Доступ к экземпляру обрамляющего класса осуществляется через указание .this после его имени. Например: Outer.this.

#java #nested #static #class
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1👏1👨‍💻1
⌨️ Что такое «анонимные классы»? Где они применяются?

Это вложенный локальный класс без имени, который разрешено декларировать в любом месте обрамляющего класса, разрешающем размещение выражений. Создание экземпляра анонимного класса происходит одновременно с его объявлением. В зависимости от местоположения анонимный класс ведет себя как статический либо как нестатический вложенный класс - в нестатическом контексте появляется окружающий его экземпляр.

Анонимные классы имеют несколько ограничений:

✔️ Их использование разрешено только в одном месте программы - месте его создания;

✔️ Применение возможно только в том случае, если после порождения экземпляра нет необходимости на него ссылаться;

✔️ Реализует лишь методы своего интерфейса или суперкласса, т.е. не может объявлять каких-либо новых методов, так как для доступа к ним нет поименованного типа.

Анонимные классы обычно применяются для:

✔️ создания объекта функции (function object), например, реализация интерфейса Comparator;

✔️ создания объекта процесса (process object), такого как экземпляры классов Thread, Runnable и подобных;

✔️ в статическом методе генерации;

✔️ инициализации открытого статического поля final, которое соответствует сложному перечислению типов, когда для каждого экземпляра в перечислении требуется отдельный подкласс.

#java #abstract #class
Please open Telegram to view this post
VIEW IN TELEGRAM
👍61🔥1👏1
public class Quest {
public static void main(String[] args) {
System.out.print(condition1() && condition2());
}

private static boolean condition1() {
System.out.print(1);
return false;
}

private static boolean condition2() {
System.out.print(2);
return true;
}
}
🔥31
Что выведет код?
Anonymous Quiz
55%
1false
38%
12false
7%
21false
3🎉1😍1
⌨️ DateTimeFormatter — это класс в Java, который используется для форматирования и парсинга дат и времени. Он предоставляет различные методы для преобразования объектов даты и времени в строку и наоборот. Этот класс является частью пакета java.time.format и был введен в Java 8 в рамках новой Date and Time API.

DateTimeFormatter содержит предопределенные форматы, такие как ISO_LOCAL_DATE, ISO_LOCAL_TIME, ISO_LOCAL_DATE_TIME, BASIC_ISO_DATE и другие. Так же, DateTimeFormatter поддерживает создание пользовательских форматов с использованием шаблонов.

Форматирование даты и времени:

LocalDateTime now = LocalDateTime.now();

// Использование предопределенного формата
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
String formattedDate = now.format(formatter);
System.out.println("ISO_LOCAL_DATE_TIME: " + formattedDate);
// ISO_LOCAL_DATE_TIME: 2024-06-20T21:46:43.584659

// Использование пользовательского формата
DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
String customFormattedDate = now.format(customFormatter);
System.out.println("Custom format: " + customFormattedDate);
// Custom format: 20-06-2024 21:46:43


Парсинг строки в дату и время:

String dateStr = "2024-06-20T15:30:00";

// Использование предопределенного формата
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
LocalDateTime dateTime = LocalDateTime.parse(dateStr, formatter);
System.out.println("Parsed date (ISO_LOCAL_DATE_TIME): " + dateTime);
// Parsed date (ISO_LOCAL_DATE_TIME): 2024-06-20T15:30

// Использование пользовательского формата
String customDateStr = "20.06.2024 15:30:00";
DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss");
LocalDateTime customDateTime = LocalDateTime.parse(customDateStr, customFormatter);
System.out.println("Parsed date (custom format): " + customDateTime);
// Parsed date (custom format): 2024-06-20T15:30


#java #DateTimeFormatter
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥5👍2🔥21
⌨️ Проброс исключений

Иногда возникает необходимость передать исключение дальше по стеку вызовов, чтобы оно было обработано на более высоком уровне. Для этого можно использовать ключевое слово throws в сигнатуре метода и не перехватывать исключение в блоке catch, либо пробросить исключение дальше внутри блока catch.


public void someMethod() throws IOException {
try {
// код, который может выбросить IOException
} catch (IOException e) {
// возможно, выполнить какую-то обработку
throw e; // проброс исключения дальше
}
}


#java #throw #throws
Please open Telegram to view this post
VIEW IN TELEGRAM
5
public class Quest {
public static void main(String[] args) {
int i=0;
label1: System.out.print(i++);
if (i < 2) {
goto label1;
}
}
}


#java #quest
😁8
Что выведет код?
Anonymous Quiz
40%
012
11%
123
48%
ошибка компиляции
4👏2🎉1
⌨️ Что такое Heap и Stack память в Java? Какая разница между ними?

Heap (куча) используется Java Runtime для выделения памяти под объекты и классы. Создание нового объекта также происходит в куче. Это же является областью работы сборщика мусора. Любой объект, созданный в куче, имеет глобальный доступ и на него могут ссылаться из любой части приложения.

Stack (стек) это область хранения данных также находящееся в общей оперативной памяти (RAM). Всякий раз, когда вызывается метод, в памяти стека создается новый блок, который содержит примитивы и ссылки на другие объекты в методе. Как только метод заканчивает работу, блок также перестает использоваться, тем самым предоставляя доступ для следующего метода. Размер стековой памяти намного меньше объема памяти в куче. Стек в Java работает по схеме LIFO (Последний-зашел-Первый-вышел)

Различия между Heap и Stack памятью:

✔️ Куча используется всеми частями приложения, в то время как стек используется только одним потоком исполнения программы.

✔️ Всякий раз, когда создается объект, он всегда хранится в куче, а в памяти стека содержится лишь ссылка на него. Память стека содержит только локальные переменные примитивных типов и ссылки на объекты в куче.

✔️ Объекты в куче доступны с любой точки программы, в то время как стековая память не может быть доступна для других потоков.

✔️ Стековая память существует лишь какое-то время работы программы, а память в куче живет с самого начала до конца работы программы.

✔️ Если память стека полностью занята, то Java Runtime бросает исключение java.lang.StackOverflowError. Если заполнена память кучи, то бросается исключение java.lang.OutOfMemoryError: Java Heap Space.

✔️ Размер памяти стека намного меньше памяти в куче.

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

Для определения начального и максимального размера памяти в куче используются -Xms и -Xmx опции JVM. Для стека определить размер памяти можно с помощью опции -Xss.

#java #heap #stack #memory
Please open Telegram to view this post
VIEW IN TELEGRAM
👏143👍3
⌨️ Верно ли утверждение, что примитивные типы данных всегда хранятся в стеке, а экземпляры ссылочных типов данных в куче?

Не совсем. Примитивное поле экземпляра класса хранится не в стеке, а в куче. Любой объект (всё, что явно или неявно создаётся при помощи оператора new) хранится в куче.

#java #heap #stack #question
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10👎41
public class Quest {
public static void main(String[] args) {
String str1 = "Hello World";
String str2 = new String("Hello World");

Set<String> set = new HashSet<>();
set.add(str1);
set.add(str2);

for (String str : set) {
if (str == str1) {
System.out.print("origin ");
}
if (str == str2) {
System.out.print("replace ");
}
}
}
}
👍8
Что выведет код?
Anonymous Quiz
28%
origin
16%
replace
56%
origin replace
🎉2👍1
⌨️ Несколько способов для избежания NullPointerException:

✔️ Используйте Optional из пакета java.util.

✔️ При сравнении константы с переменной пришедшей из вне, нужно вызывать equals() на константе.

✔️ А при сравнении двух переменных используйте java.util.Objects#equals.

✔️ Используйте библиотеки с null-безопасностью, например, Apache Commons StringUtils.

✔️ Вызывайте методы equals() и equalsIgnoreCase() на известных объектах.

✔️ Применяйте valueOf() вместо toString().

✔️ Воспользуйтесь аннотациями @NotNull и @Nullable на основе IDE.

✔️ При возврате из метода коллекций, не стоит возвращать null, лучше пустую коллекцию (java.util.Collections#emptyList).

#java #NullPointerException #Optional
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
⌨️ Полезные стримы. Сортировка

Отсортировать список с помощью стрима можно используя метод sorted():

var list = List.of(10, 5, 7, 3);
var sortedList = list.stream()
.sorted()
.toList();
sortedList.forEach(System.out::println);
// 3 5 7 10


Можно передать Comparator:

var list = List.of(10, 5, 7, 3);
var sortedList = list.stream()
.sorted(Comparator.reverseOrder())
.toList();
sortedList.forEach(System.out::println);
// 10 7 5 3


#java #stream #sorted
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81🔥1