Telegram Web Link
🖥 Значение и использование пакетов `org` и `com` в Java

🟡Главная задача префиксов пакетов com и org в Java сводится к тому, чтобы отразить доменное имя организации в структуре пакетов. com обычно ассоциируется с коммерческими компаниями, тогда как org используется для обозначения некоммерческих организаций. Для уникальности рекомендуется использовать доменное имя в обратном порядке, например, com.example.
// Для коммерческих организаций
package com.example.checkOutMyProfit;

// Для некоммерческих организаций
package org.example.utilityToTheRescue;

Такой подход позволяет предотвратить конфликты имен и улучшает идентифицируемость проекта в среде Java.

🟡Менее распространённые пути: `edu` и `net`
Префиксы edu. и net. не так широко распространены, но тем не менее они имеют своё применение. edu. обычно используют учебные заведения, в то время как net. предпочитают любители сетевых технологий. Они служат отражением определённых "районов" в виртуальном "городе программных решений", обслуживая определённые сообщества.

🟡Отражение ваших ценностей в структуре пакетов
Структура пакетов должна отражать логику и организацию вашего бизнеса или проекта. Это не только демонстрирует корпоративную культуру и дисциплину в программировании, но и способствует построению интуитивно понятной и легко навигируемой кодовой базы.

🟡Избегаем конфликтов имен пространства
Для предотвращения пересечений имён в Java рекомендуется начинать имя пакета с домена компании, представленного в обратном порядке. Например, для домена example.com, имя пакета должно начинаться с com.example. Такой подход обеспечивает уникальность пространства имен на глобальном уровне и снижает риск конфликтов.

🟡Защитите свой домен
Перед присвоением имени пакету убедитесь, что вы владеете доменом. Пакеты с префиксами java., javax. и sun. зарезервированы компанией Oracle, и их использование может столкнуться с юридическими последствиями или вызвать негативную реакцию сообщества.

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
11👍8🔥2
💻 Хмм, а ты хорошо знаешь Kotlin?

Задача: как в Kotlin случайным образом выбрать 1 значение в каждом столбце двумерного массива и результат записать в новый массив?

Дано:
val table = Array(3, { Array(3, {0}) })
table[0] = arrayOf(1, 2, 3) // 1 строка
table[1] = arrayOf(4, 5, 6) // 2 строка
table[2] = arrayOf(7, 8, 9) // 3 строка

Вывод должен быть, к примеру, таким: 1, 8, 6

Подумай и напиши своё решение
Готово? Можешь смотреть

Тут в примере, код создает новый массив `resultArray` и заполняет его случайными значениями из каждого столбца исходного массива `table`. Размер нового массива соответствует количеству столбцов исходного массива.

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍3🔥1
Что такое синхронизированные коллекции в Java и как они работают

Коллекции Collection представляют собой группу объектов, а Java предоставляет несколько интерфейсов и реализаций для работы с этими коллекциями.

С появлением многопоточного программирования возросла потребность в потокобезопасных коллекциях. Именно тогда в структуру Java Collection были добавлены синхронизированные коллекции.


Как синхронизированные коллекции обеспечивают потокобезопасность

Синхронизированные коллекции Synchronized Collections обеспечивают потокобезопасность за счет принудительной синхронизации каждого из общедоступных методов. Кроме того, это гарантирует, что его внутреннее состояние никогда не будет опубликовано. То есть, единственный способ изменить коллекцию — это использовать ее общедоступные синхронизированные методы!

Синхронизированные коллекции можно представить, как простые несинхронизированные коллекции с инкапсуляцией состояния и синхронизированными общедоступными методами.

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


Как создавать синхронизированные коллекции

Класс Collections предоставляет несколько статических методов для создания синхронизированных коллекций. Эти статические методы имеют имена в следующем формате — synchronizedXxx. Вот список этих методов:
*️⃣synchronizedCollection(Collection<T> c)
*️⃣synchronizedList(List<T> list)
*️⃣synchronizedMap(Map<K, V> m)
*️⃣synchronizedNavigableMap(NavigableMap<K, V> m)
*️⃣synchronizedNavigableSet(NavigableSet<T> s)
*️⃣ synchronizedSet(Set<T> s)
*️⃣synchronizedSortedMap(SortedMap<K, V> m)
*️⃣synchronizedSortedSet(SortedSet<T> s)

Теперь мы создадим синхронизированный список, используя класс Collections.
List<Integer> synchronizedIntegerList = Collections.synchronizedList(new ArrayList<>());


🔘Подробнее про синхронизированные коллекции можно прочитать тут

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍148🔥3
🖥 Best LeetCode Resources

Репозиторий содержит материалы для подготовки к собеседованию по кодингу, включая:

- Более 350 решений LeetCode
- 30 концепций проектирования систем
- 40 Задач системного проектирования, упорядоченных по сложности

Цель этого репозитория - собрать лучшие ресурсы для подготовки к собеседованию по проектированию систем.

Github

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥65
🛠️ Расширение Spring Data JPA, позволяющее полностью динамически использовать Entity Graph в репозиториях.

Entity Graph -
позволяет улучшить производительность во время выполнения запросов к базе данных при загрузке связанных ассоциаций и основных полей объекта.

👉 https://github.com/Cosium/spring-data-jpa-entity-graph

@javatg
👍184🔥2👏1
🖥 Автодокументирование с помощью Doxygen

Если по какой-то причине ты ещё об этом не знаешь, существует система документирования кода — Doxygen

Doxygen — это система документирования кода, которая позволяет автоматически генерировать документацию на основе комментариев. Она поддерживает различные языки программирования, включая Java.
Doxygen позволяет генерировать документацию в различных форматах, таких как HTML, LaTeX, RTF, XML и других. Для использования Doxygen с Java необходимо следовать определенным шаблонам комментариев.

Например, для документирования класса в Java, можно использовать следующий шаблон комментария:
/**
* Описание класса.
*/
public class MyClass {
// код класса
}

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

А вот пример использования Doxygen для документирования класса в Java:
/**
* Описание класса.
*/
public class MyClass {
/**
* Описание метода.
* @param param Описание параметра.
* @return Описание возвращаемого значения.
*/
public int myMethod(int param) {
// код метода
return param;
}
}

Doxygen сгенерирует документацию, включая описание класса и метода, а также информацию о параметрах и возвращаемом значении.

В общем, используй Doxygen — будущим коллегам будет легче разбираться с твоим спагетти)

📎 Годная статья по Doxygen в тему
🖥 GitHub 5.3K ⭐️

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍217🔥3👎1
🖥 Полезный туториал по работе с JSON и не только в Java

Подробно описано использование библиотеки Gson, много полезных примеров.
Например, вот так мы можем сформировать свой JSON:
Gson gson = new Gson();
SmartPhone galaxy8 = new Smartphone("Samsung", "Galaxy 8", 829);
String JSON = gson.toJson(galaxy8);

// {"brand":"Samsung","model":"Galaxy 8","price":829.0}


А вот мы конвертируем JSON-строку в объект Java:
Gson gson = new Gson();
String json = "{\"brand\":\"Samsung\",\"model\":\"Galaxy 8\",\"price\":829.0}";
SmartPhone galxy8 = gson.fromJson(json, SmartPhone.class)

// SmartPhone [brand=Samsung, model=Galaxy 8, price=829.0]


В целом, туториал очень полезный, даёт представление о библиотеке Gson и о том, как обрабатывать JSON в Java

📎 Ссылка

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍266🥰3
💻 Хорошо разбираешься в Kotlin? Готов по полочкам разложить, чем он отличается от Java? Проверь свои знания на этих 10 вопросах

Что из этого в настоящее время не поддерживается в Kotlin?
[x] JVM
[x] JavaScript
[x] LLVM
[_] .NET CLR

Какое выражение Kotlin эквивалентно такому int x = a ? b : c из Java?
[x] val x = a ?: b, c
[x] val x = if (a) b : c
[x] val x = a ? b : c
[_] val x = if (a) b else c

Что применимо для следующего объявления класса?
class Person (val name: String)
[x] Он package-private
[x] Он может быть расширен другими классами
[_] Он public
[x] У него приватное свойство "name"

Есть ли у Kotlin примитивные типы данных, такие как int, long, float?
[x] Нет, Kotlin не имеет и не использует примитивные типы данных.
[_] Нет, не на уровне языка. Но компилятор Kotlin использует примитивы JVM для лучшей производительности.
[x] Да, но Kotlin всегда конвертирует их в не примитивные аналоги.
[x] Да, Kotlin в этом отношении похож на Java.

Что такое to в этом ниже примере:
val test = 33 to 42
[_] Инфиксная функция, создающая пару (33, 42)
[x] Ключевое слово Kotlin для создания пары (33, 42)
[x] Ключевое слово для создания диапазона от 33 до 42
[x] Опечатка

Какое из объявлений функций является валидным?
[x] int sum(int a, int b)
[x] int sum(a: Int, b: Int)
[x] function sum(a: Int, b: Int): Int
[_] fun sum(a: Int, b: Int): Int

В чем ключевое отличие Iterable<T> и Sequence<T> в Kotlin?
[x] Iterable<T> работает только с immutable коллекциями, Sequence<T> применим к mutable
[x] Нет никакой разницы, т. к. Sequence<T> аналог Iterable<T>
[_] Последовательности обрабатываются лениво, итераторы жадно
[x] Последовательности обрабатываются по очереди, итераторы параллельно (многопоточно)

Чего не предлагает dataclass?
[x] Авто-генерируемый метод toString()
[x] Метод copy(...), для создания копии экземпляров.
[_] Автоматическое преобразование из/в JSON
[x] Авто-генерируемые методы hashCode() и equals()

Что выведет следующий код?
     
val listA = mutableListOf(1, 2, 3)
val listB = listA.add(4)
print(listB)

[x] [1, 2, 3, 4]
[_] True
[x] Ничего, тут ошибка компиляции
[x] Unit

В чем разница между a и b?
        
var a: String? = "KotlinQuiz"
var b: String = "KotlinQuiz"

[x] a является volatile, как в Java
[x] b является final и не может быть изменено
[x] a является final и не может быть изменено
[_] b никогда не сможет стать null

Ну как? 10 из 10?

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
16👍9👎4🤩1
🖥 Для чего нужны функциональные интерфейсы в Java?

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


Во-первых, существует функциональный подход (ФП) к программированию, при котором мы можем оперировать методами (функциями) как переменными.
В Haskell, например, ФП встроен непосредственно, на синтаксическом уровне.
Также в некоторых языках (C и C++) можно использовать ссылки на методы, не те, которые в Java, а настоящие ссылки.

В Java нет ни того, ни другого, поэтому ФП в ней осуществляется посредством функциональных интерфейсов.

Когда мы пишем что-то вроде
(car) -> car.getOwner();

нам кажется, будто мы действительно объявляем функцию на месте и используем ФП. Но на деле для такой записи создаётся анонимный класс, расширяющий целевой интерфейс и реализующий метод в соответствии с тем, что написано после стрелки.

Упомянутая ссылка на метод — это просто способ ещё более коротко и изящно записать лямбда-выражение. Например, строка выше могла бы выглядеть так:
Car::getOwner


Для чего всё это нужно? Например, есть у нас список автомобилей, и нам нужно его преобразовать в список владельцев. К примеру, используя Stream API.

Очень грустно было бы для метода map() объявлять отдельный класс, имплементирующий целевой интерфейс и содержащий один простой метод, а потом в методе map() создавать объект от него с целью вызова этого самого метода.

Гораздо лучше написать короткую лямбду или вовсе ссылку на метод.

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

📎 Читать подробнее

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍255🔥3
🖥 Полезная статья про байт-код в Java

Байт-код Java — это промежуточное представление Java-кода, которое выполняется виртуальной машиной Java (JVM). При компиляции Java-программы компилятор Java (javac) преобразует ее в байт-код, представляющий собой набор инструкций, которые JVM может понять и выполнить.
Этот байт-код является платформонезависимым, то есть одна и та же Java-программа может выполняться на различных устройствах и в различных операционных системах, следуя принципу “пиши один раз, выполняй везде” (WORA).

Байт-код представляет собой набор инструкций, которые не являются человекочитаемыми, как Java-код, но менее сложны, чем машинный код.

Длина каждой инструкции в байт-коде Java равна одному байту (откуда и происхождение термина “байт-код”). Однако за некоторыми инструкциями следуют дополнительные байты, представляющие собой операнды для инструкций. Инструкции байт-кода, разработанные для компактности и эффективности, работают на основе стековой архитектуры. В этом их отличие от большинства физических архитектур процессоров, основанных на регистрах.

Поглядим на примере:
int a = 5;
int b = 10;
int sum = a + b;

При компиляции эти строки Java-кода преобразуются в серию инструкций байт-кода, которые при просмотре с помощью такого инструмента, как javap, могут выглядеть следующим образом:
0: iconst_5
1: istore_1
2: bipush 10
4: istore_2
5: iload_1
6: iload_2
7: iadd
8: istore_3


Вообще, тема очень интересная, советую глянуть статью
📎 Статья

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
15👍6🔥5🎉2🤔1
💻 Анонимные функции в Kotlin

В Kotlin часто используется особый вид функций — анонимные функции. Функции можно не давать имя после ключевого слова fun и она станет анонимной.

val a: (Int) -> Int = fun(i: Int) = i + 3
println(a(4)) // 7

Эта анонимная функция прибавляет к заданному значению число 3.

В некоторых случаях анонимные функции удобны и полезны. Например, мы можем добавить новые правила к существующим функциям.

В стандартной библиотеке есть функция count() для подсчёта числа символов в строке.
val charNumber = "Васька".count()
println(charNumber) // выводит 6


Есть перегруженная версия функции, в которой можно вызвать анонимную функцию в качестве аргумента. Зададим новое правило - подсчитать количество символов а в этом же слове.
val charNumber = "Васька".count({letter -> letter == 'а'})
println(charNumber) // выводит 2

Функция count() использует анонимную функцию, чтобы решить, как считать символы в строке. Она последовательно передаёт анонимной функции символ за символом, и если та вернёт истинное значение для заданного символа, общий счёт нужных символов увеличивается на единицу. Как только будет проверен последний символ, функция count() возвратит итоговое значение.
Это одно из применений анонимных функций, в целом очень полезный инструмент.

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍84🥰2
🖥 Вышла Java 22

Вышла общедоступная версия Java 22. В этот релиз попало около 2300 закрытых задач и 12 JEP'ов. Release Notes можно посмотреть здесь. Полный список изменений API – здесь.


Java 22 не является LTS-релизом, и у неё будут выходить обновления только полгода (до сентября 2024 года).

Скачать
Читать

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥145👍2🥰2😱2
🖥 Поговорим про механизм исключений в Java

Непроверяемые исключения. Начнем с проблемы. Далеко не все ошибки можно выявить на этапе компиляции, например обращение к несуществующему индексу в массиве. Подобная ошибка возникнет уже во время работы программы и скорее всего остановит ее выполнение:
int[] items = {1, 2, 3};
System.out.println(items[5]);


Запуск такого кода приведет к выбрасыванию (возбуждению) исключения и прерыванию работы программы. В консоли это будет выглядеть так:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 3
at io.hexlet.Application.main (Application.java:24)


Ошибка содержит не только описание того что произошло, но и указывает на то место, где она возникла включая файл и строку. Это важно для отладки.

Другая похожая ситуация – это деление на ноль, оно тоже приводит к исключению. Такие исключения являются непроверяемыми.

А вот так может выглядеть выкидывание исключений:
throw new RuntimeException("Сообщение об ошибке");



Проверяемые исключения. Проверяемые исключения – это исключения, которые могут возникнуть в любом случае, даже если в программе нет багов. Самое простое – это чтение файла, если файла не существует, то во время его чтения возникнет исключение.

Такое исключение должно быть обработано с помощью конструкции try..catch (как это видно на изображении)

📎 Читать подробнее

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍43🥰2
🖥Deque или Stack в Java — что выбрать?

Deque отличается гибкостью и производительностью, превосходя тем самым Stack. Являясь частью Java Collections Framework, Deque предлагает как механизмы работы LIFO (стек), так и FIFO (очередь), предоставляя разнообразные высокопроизводительные реализации, например ArrayDeque, что выделяет его на фоне устаревшего и предназначенного для однопоточности класса Stack.

ArrayDeque можно использовать в качестве стека:
Deque<Integer> stack = new ArrayDeque<>();

stack.push(1); // добавить элемент — easy
int top = stack.peek(); // Взять верхний элемент легко
int pop = stack.pop(); // ...как и нижний


Короче, выбирайте Deque для надежной и эффективной реализации стека

📎 Более подробную инфу про Deque можно найти тут

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
14👍10🥰3🔥1
💻 Ключевые различия между Kotlin и Java 🖥

Полезно понимать ограничения и достоинства инструмента, так что держите:

Kotlin сочетает в себе функции как объектно-ориентированного, так и функционального программирования, тогда как Java ограничивается объектно-ориентированным программированием.

Kotlin позволяет пользователям создавать функции расширения, тогда как Java не предлагает никаких функций расширения.

Kotlin не предлагает неявных преобразований, а Java поддерживает неявные преобразования.

В Котлине нет нулевых переменных или объектов; с другой стороны, переменные или объекты Null являются частью языка Java.

Kotlin не поддерживает статические члены, а Java использует статические члены.

В Kotlin переменные примитивного типа являются объектами, а в Java переменные примитивного типа не являются объектами.

Kotlin поддерживает лямбда-выражения, тогда как Java не поддерживает лямбда-выражения (Лямбда-выражения добавлены в Java 8)

Kotlin не требует каких-либо спецификаций переменных типов данных, тогда как Java требует спецификаций переменных типов данных.

Kotlin не требует каких-либо спецификаций переменных типов данных, но Java требует спецификаций переменных типов данных.

Программы Kotlin не требуют точек с запятой в своей программе, в то время как программа Java требует точку с запятой.

Возможности языковых сценариев позволяют использовать Kotlin непосредственно в сценариях сборки Gradle, тогда как Java не предлагает возможностей языковых сценариев.

@android_its
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍119🔥6👎4😁1
2025/07/08 21:31:52
Back to Top
HTML Embed Code: