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

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

✍️По всем вопросам: @Pascal4eg
Download Telegram
public class Quest {
public static void main(String[] args) {
try {
System.out.println("Hello World");
} catch (IOException e) {
System.out.println("Error");
}
}
}
Какой будет результат выполнения кода?
Anonymous Quiz
78%
Hello World
7%
Error
15%
ошибка компиляции
👍3🎉1
⌨️ Управление доступом к членам класса

Модификаторы уровня доступа определяют, могут ли другие классы использовать определенное поле или вызывать определенный метод.

Существует 4 уровня доступа:

private
Указывает, что доступ возможен только в его собственном классе.

package-private (нет явного модификатора)
Указывает, что доступ только внутри своего собственного пакета.

protected
Указывает, что доступ возможен только внутри его собственного пакета (как в случае с package-private) и, кроме того, для подкласса его класса в другом пакете.

public
Указывает, что доступ возможен отовсюду.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥1😁1
JIT-компилятор

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

JIT-компилятор является ключевым элементом виртуальной машины Java (JVM). Он компилирует байт-код часто вызываемых методов в машинный код во время выполнения. Следовательно, он отвечает за оптимизацию программ Java.

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

Таким образом, JIT-компиляция в Java позволяет достичь компромисса между портативностью байт-кода и производительностью машинного кода. Этот механизм позволяет Java-приложениям быть эффективными на различных платформах, так как байт-код может быть выполнен на любой машине, в то время как JIT-компиляция обеспечивает высокую производительность приложений в процессе их выполнения.
👍1111🔥1
⌨️ Class Loaders

В Java, Class Loader (загрузчик классов) является частью Java Runtime Environment (JRE), которая ответственна за загрузку классов в виртуальную машину Java (JVM) во время выполнения программы. Class Loader осуществляет поиск и загрузку классов в память JVM по их именам.

Class Loader имеет иерархическую структуру и состоит из трех основных типов:

1️⃣ Bootstrap Class Loader (Загрузчик базовых классов): Этот загрузчик является частью ядра JVM и отвечает за загрузку системных классов Java, таких как java.lang.Object, java.lang.String и другие. Он является самым высоким в иерархии загрузчиком.

2️⃣ Extension Class Loader (Загрузчик расширений): Этот загрузчик наследуется от Bootstrap Class Loader и загружает классы из расширенной библиотеки Java (расположенной в директории jre/lib/ext).

3️⃣ Application Class Loader (Загрузчик приложений): Также известный как System Class Loader, этот загрузчик загружает классы из путей, указанных в переменной окружения CLASSPATH. Он также загружает классы из текущего рабочего каталога приложения.

Когда Java-программа запускается, система Class Loader следует иерархии загрузки классов. Если класс не найден в одном загрузчике, система пытается найти его в следующем в иерархии.

Процесс загрузки класса включает в себя три этапа:

1️⃣ Загрузка (Loading): Загрузчик находит байт-код класса и загружает его в память.

2️⃣ Связывание (Linking): На этом этапе проводится проверка байт-кода, выделение памяти для статических полей, и разрешение ссылок на другие классы.

3️⃣ Инициализация (Initialization): Выполняются статические блоки кода и инициализируются статические переменные.

Класс ClassLoader предоставляет методы для динамической загрузки классов во время выполнения. Работа с Class Loader'ами может быть полезной, например, при реализации механизмов плагинов и динамической загрузки классов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍72🔥2👎1
Метод dropWhile был введен в интерфейсе Stream в JDK 9. Этот метод позволяет пропускать элементы в начале потока данных, пока они удовлетворяют определенному условию, и возвращает новый поток, начиная с первого элемента, который не соответствует условию.

В нашем примере метод dropWhile используется для пропуска элементов в потоке до тех пор, пока они меньше 0. После первого элемента, не соответствующего условию, оставшиеся элементы добавляются в новый поток.
👍14🔥1
Класс Properties

В Java класс Properties представляет собой таблицу хэш-значений ключ-значение. Он является частью пакета java.util, и обычно используется для работы с конфигурационными файлами, настройками приложений и другими данными в формате ключ-значение.

Некоторые методы класса Properties:

setProperty(String key, String value) - добавление или изменение значения ключа.

getProperty(String key) - получение значения по ключу.

load(InputStream in) - загрузка свойств из InputStream.

store(OutputStream out, String comments) - сохранение свойств в OutputStream.

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

Пример файла Properties:
version=1.0
name=TestApp
👍9👏2
😁15🤣7
Цепочка методов (Method chaining) — это общий синтаксис для нескольких вызовов методов в объектно-ориентированных языках программирования. Каждый метод возвращает объект, что позволяет объединить вызовы в один оператор без необходимости использования переменных для хранения промежуточных результатов.

Пример для String:

text = text
.trim()
.replace("?", "")
.replace(" ", "-")
.toLowerCase();


Для того чтобы сделать такую штуку в своем классе, нужно что бы каждый метод возвращал из метода ссылку на текущий объект (this).
👍26🔥1😁1
Ромб

Интересная задача для тренеровки мозга. Нужно в ASCII-графике (скажем так) вывести ромб заданной размерности.
Не смотрите сразу решение, попытайтесь решить сами. Код вашего решения пишите в комментах, интересно как еще можно это сделать.


*
***
*****
*******
*****
***
*


Алгоритм: поместим центр координат в центр ромба, в результате для каждой из 4х плоскостей мы увидим закономерность: там где сумма x и y (без знака) меньше или равна половине размерности ромба, там стоит *, иначе пробел.
👍8
HttpClient представляет собой класс, введенный в Java 11, который предоставляет более современный и гибкий способ для выполнения HTTP-запросов и обработки HTTP-ответов. Он заменяет устаревший HttpURLConnection и предоставляет более удобный интерфейс для работы с сетевыми операциями.

HttpClient также поддерживает асинхронные операции, позволяя выполнять запросы асинхронно с использованием CompletableFuture.
👍12🔥2
Контракт метода hashCode

Для реализации хэш-функции в спецификации языка определены следующие правила:

1️⃣ вызов метода hashCode один и более раз над одним и тем же объектом должен возвращать одно и то же хэш-значение, при условии что поля объекта, участвующие в вычислении значения, не изменялись.

2️⃣ вызов метода hashCode над двумя объектами должен всегда возвращать одно и то же число, если эти объекты равны (вызов метода equals для этих объектов возвращает true).

3️⃣ вызов метода hashCode над двумя неравными между собой объектами должен возвращать разные хэш-значения. Хотя это требование и не является обязательным, следует учитывать, что его выполнение положительно повлияет на производительность работы хэш-таблиц.
👍12🔥3👎1
class Cat {
public static void mew() {
System.out.println("Meow");
}
}

class SimonsCat extends Cat {
public static void mew() { }
}

public class Mew {
public static void main(String[] args) {
Cat cat = new Cat();
Cat simonsCat = new SimonsCat();
cat.mew();
simonsCat.mew();
}
}
👍6👏2
Retrofit - это библиотека для работы с HTTP-запросами в Java и Android, разработанная компанией Square. Основной целью Retrofit является упрощение выполнения сетевых запросов и преобразование HTTP-ответов в объекты Java. Retrofit использует аннотации Java для определения типа запроса, параметров, URL и других свойств.

Retrofit предоставляет удобный способ выполнения асинхронных запросов. Вы можете использовать Call как для выполнения синхронного вызова (call.execute()), так и для выполнения запросов асинхронно (call.enqueue(...)).

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

Библиотека Retrofit предоставляет удобные средства для работы с сетевыми запросами, уменьшая объем необходимого кода и обеспечивая чистый и читаемый интерфейс для взаимодействия с удаленными API.
👍11👏31
Несколько способов для избежания 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).
🔥24👍11
Метод retainAll()

Метод retainAll() интерфейса Collection, удаляет из коллекции все элементы, не содержащиеся в переданной коллекции. По сути оставляет в коллекции только пересекающиеся элементы из двух коллекций.


boolean retainAll(Collection<?> c);


Параметры:
c – коллекция, содержащая элементы, которые следует сохранить в коллекции.

Возврат:
true, если коллекция изменилась в результате вызова
👍22🏆1
BIRT (Business Intelligence and Reporting Tools) - это открытая платформа, предоставляющая возможности для создания отчетов и бизнес-аналитики в приложениях, разрабатываемых на языке программирования Java. Эта платформа предоставляет инструменты для создания, развертывания и поддержки отчетов различной сложности.

Вот несколько ключевых аспектов BIRT:

Дизайнер отчетов (BIRT Designer)
BIRT предоставляет визуальный дизайнер отчетов, который позволяет разработчикам создавать отчеты с использованием различных элементов, таких как таблицы, графики, текстовые блоки и т.д. Этот дизайнер встроен в Eclipse IDE, что упрощает интеграцию с существующими проектами Java.

Интеграция с Java-приложениями
BIRT обеспечивает простую интеграцию с Java-приложениями. Вы можете использовать BIRT Runtime API для встраивания отчетов в свои приложения. Это позволяет вам создавать динамические отчеты, которые могут быть сгенерированы на лету в ответ на запросы пользователей.

Поддержка различных источников данных
BIRT может работать с различными источниками данных, такими как базы данных (SQL, JDBC), веб-службы, XML-файлы и другие. Это обеспечивает гибкость при работе с данными из различных источников.

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

Генерация различных форматов отчетов
BIRT поддерживает генерацию отчетов в различных форматах, таких как HTML, PDF, Excel, Word и другие. Это позволяет пользователям получать отчеты в удобных для них форматах.

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

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

Для начала работы с BIRT, вы можете загрузить Eclipse IDE, которая включает в себя BIRT Designer. После установки вы сможете создавать, редактировать и интегрировать отчеты BIRT в ваши Java-приложения.
👍7🔥1🏆1
Метод putIfAbsent() интерфейса Map. Если указанный ключ еще не связан со значением (или сопоставлен со значением null), он связывает его с заданным значением и возвращает значение null, в противном случае возвращается текущее значение.


default V putIfAbsent(K key, V value) {
V v = get(key);
if (v == null) {
v = put(key, value);
}

return v;
}

Параметры:
key – ключ, с которым должно быть связано указанное значение. value – значение, которое должно быть связано с указанным ключом.

Возврат:
предыдущее значение, связанное с указанным ключом, или значение null, если для ключа не было сопоставления. Возврат null может также указывать на то, что мапа ранее ассоциировала с ключом значение null, если реализация поддерживает значения null.
👍6🔥1
⌨️ Можно ли объявить метод абстрактным и статическим одновременно?

Нет. В таком случае компилятор выдаст ошибку: "Illegal combination of modifiers: ‘abstract’ and ‘static’".

Модификатор abstract говорит, что метод будет реализован в другом классе, а static наоборот указывает, что этот метод будет доступен по имени класса.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🎄3