Библиотека джависта | Java, Spring, Maven, Hibernate
24.9K subscribers
1.86K photos
38 videos
42 files
2.64K links
Все самое полезное для Java-разработчика в одном канале.

Список наших каналов: https://yangx.top/proglibrary/9197

Обратная связь: @proglibrary_feedback_bot

По рекламе: @proglib_adv

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
加入频道
#вопросы_с_собеседований
Для чего нужны функциональные интерфейсы ToDoubleBiFunction<T,U>, ToIntBiFunction<T,U> и ToLongBiFunction<T,U>?
ToDoubleBiFunction<T,U> - операция принимающая два аргумента классов T и U и возвращающая результат типа Double;
ToLongBiFunction<T,U> - операция принимающая два аргумента классов T и U и возвращающая результат типа Long;
ToIntBiFunction<T,U> - операция принимающая два аргумента классов T и U и возвращающая результат типа Integer.
Java позволяет добавлять неабстрактные реализации методов в интерфейс, используя ключевое слово default:

interface Example {
int process(int a);
default void show() {
System.out.println("default show()");
}
}

☕️ Если класс реализует интерфейс, он может, но не обязан, реализовать методы по-умолчанию, уже реализованные в интерфейсе. Класс наследует реализацию по умолчанию.
☕️ Если некий класс реализует несколько интерфейсов, которые имеют одинаковый метод по умолчанию, то класс должен реализовать метод с совпадающей сигнатурой самостоятельно. Ситуация аналогична, если один интерфейс имеет метод по умолчанию, а в другом этот же метод является абстрактным - никакой реализации по умолчанию классом не наследуется.
☕️ Метод по умолчанию не может переопределить метод класса java.lang.Object.
☕️ Помогают реализовывать интерфейсы без страха нарушить работу других классов.
☕️ Позволяют избежать создания служебных классов, так как все необходимые методы могут быть представлены в самих интерфейсах.
☕️ Дают свободу классам выбрать метод, который нужно переопределить.
☕️ Одной из основных причин внедрения методов по умолчанию является возможность коллекций в Java 8 использовать лямбда-выражения.
#вопросы_с_собеседований
Для чего используется оператор assert?
Assert (Утверждение) — это специальная конструкция, позволяющая проверять предположения о значениях произвольных данных в произвольном месте программы. Утверждение может автоматически сигнализировать об обнаружении некорректных данных, что обычно приводит к аварийному завершению программы с указанием места обнаружения некорректных данных.

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

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

Т.к. утверждения могут быть удалены на этапе компиляции либо во время исполнения программы, они не должны менять поведение программы. Если в результате удаления утверждения поведение программы может измениться, то это явный признак неправильного использования assert. Таким образом, внутри assert нельзя вызывать методы, изменяющие состояние программы, либо внешнего окружения программы.

В Java проверка утверждений реализована с помощью оператора assert, который имеет форму:

assert [Выражение типа boolean]; или assert [Выражение типа boolean] : [Выражение любого типа, кроме void];

Во время выполнения программы в том случае, если поверка утверждений включена, вычисляется значение булевского выражения, и если его результат false, то генерируется исключение java.lang.AssertionError. В случае использования второй формы оператора assert выражение после двоеточия задаёт детальное сообщение о произошедшей ошибке (вычисленное выражение будет преобразовано в строку и передано конструктору AssertionError).
Узнай о возможности работы удаленно над долгосрочными проектами глобального уровня с EPAM Anywhere.
15 апреля 18:30- 20:00 GMT+3

НА ВЕБИНАРЕ МЫ БОЛЕЕ ПОДРОБНО РАССКАЖЕМ:
- Что такое EPAM Anywhere и возможности работы ремоут в рамках программы;
- Какие есть открытые вакансии для тебя;
- Процесс подачи заявки и этапы отбора;
- Подробно как проходит интервью;
- Как происходит знакомство с проектом и интервью с клиентом;
- Как проходит онбординг процесс в программу.

Зарегистрироваться: https://epa.ms/anywherewebinar-15
#вопросы_с_собеседований
Для чего нужны функциональные интерфейсы ObjDoubleConsumer<T>, ObjIntConsumer<T> и ObjLongConsumer<T>?
☕️ ObjDoubleConsumer<T> - операция, которая принимает два аргумента классов T и Double, производит с ними некоторое действие и ничего не возвращает;
☕️ ObjLongConsumer<T> - операция, которая принимает два аргумента классов T и Long, производит с ними некоторое действие и ничего не возвращает;
☕️ ObjIntConsumer<T> - операция, которая принимает два аргумента классов T и Integer, производит с ними некоторое действие и ничего не возвращает.
В ВТБ открыта вакансия Java-разработчика. На позиции вы будете:
— разрабатывать приложения с использованием микросервисной архитектуры;
— участвовать в code review;
— заниматься написанием unit-тестов.

Присоединяйтесь к ВТБ и вы получите:
— достойную заработную плату и соц.пакет;
— живые и интересные проекты;
— команда из лучших профессионалов, среди более 5000 IT-специалистов компании;
— карьерный рост и возможность выбора направления развития.

Отправляйте резюме до 23 апреля включительно: https://clc.am/lTzxjA
#вопросы_с_собеседований
Как вызывать default метод интерфейса в реализующем этот интерфейс классе?
interface Paper {
default void show() {
System.out.println("default show()");
}
}

class Licence implements Paper {
public void show() {
Paper.super.show();
}
}
#вопросы_с_собеседований
Какие классы позволяют преобразовать байтовые потоки в символьные и обратно?
Объявляем конкурс на самый интересный контент в телеграм-каналах Proglib!
Призовой фонд — 280 тысяч рублей.
Автор лучшего поста в отдельно взятом канале получает 20 тысяч рублей.
В каналах по языкам программирования, data science и мобильной разработке интересно увидеть топовые материалы по этим темам, в канале @progbook топовые рецензии на книги, в @proglibrary материалы по общим темам: проектирование, базы данных, linux, алгоритмы и структуры данных. Поощряются интерактивные форматы — авторские тесты, квизы, функционал которых встроен в Telegram, гифки, шпаргалки, неочевидные фишки.

Полный список каналов:
https://yangx.top/progbook
https://yangx.top/proglibrary
https://yangx.top/pyproglib
https://yangx.top/frontendproglib
https://yangx.top/javaproglib
https://yangx.top/dsproglib
https://yangx.top/phpproglib
https://yangx.top/cppproglib
https://yangx.top/mobileproglib
https://yangx.top/goproglib
https://yangx.top/csharpproglib
https://yangx.top/devopsslib
https://yangx.top/testerlib
https://yangx.top/hackproglib

Все посты будут с лайками и дизлайками и хэштегом #proglib_contest. Ссылки мы будем прогонять через наш сокращатель, будут браться в расчет лайки, дизлайки, охваты, клики по ссылкам. Чем больше лайков/охватов/кликов по ссылкам в публикации, тем больше шансов статьи победителем в конкурсе. Присылайте посты боту @proglib_contest_bot с указанием, на какой канал идет публикация. Юридическая информация здесь.
☕️ OutputStreamWriter — «мост» между классом OutputStream и классом Writer. Символы, записанные в поток, преобразовываются в байты.
☕️ InputStreamReader — аналог для чтения. При помощи методов класса Reader читаются байты из потока InputStream и далее преобразуются в символы.
Что такое Java-модули?

Java Platform Module System (JPMS) – система модулей, появившаяся в Java версии 9. Она разрабатывалась под названием Project Jigsaw, и ожидалась еще с Java 7.

Модуль – группа связанных пакетов и ресурсов. Механизм модулей определяет видимость содержимого одних модулей для других. Скрытые модули недоступны ни для обычного использования в коде, ни даже для рефлекшна: Class.forName() выбросит ClassNotFoundException.

Вдобавок, модули инкапсулируют собственные ресурсы – конфиги и медиафайлы больше не хранятся в общей куче.

Модуль определяется файлом объявления module-info.java.

JVM может работать относительно модулей в трех режимах:

• Legacy mode – применяется, когда код компилируется в режиме совместимости с версиями Java 8 и меньше. Весь код работает как безымянный модуль, флаги для настройки модулярности не работают.

• Single module mode – когда не используется флаг --module-source-path. Структура проекта остается старой, файл module-info.java лежит в директории /src. Поэтому иметь несколько модулей в одном проекте не получится.

• Multi-module mode – каждый модуль находится в собственной директории. Общая корневая директория передается в --module-source-path. Полноценное использование JPMS.

#Модули
⚡️Ищете работу или мечтаете поменять профессию?

Полезная информация для вас. За интересными вакансиями следите на профильном канале @pravkiforyou.

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

Молодых перспективных специалистов легче найти в телеграме, а подписаться на вакансии тут: https://yangx.top/pravkiforyou
Инкапсуляция

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

Более узкий и прикладной смысл инкапсуляции – принцип сокрытия данных. Так инкапсуляция достигается не только группировкой, но и ограничением доступа к внутренней реализации для других компонентов. Под компонентами здесь подразумеваются и более мелкие чем модуль части программы. Функция инкапсулирует локальные переменные, класс инкапсулирует приватные поля.

Термин тесно связан с понятием абстракции. Это техника разделения программного контракта и средств его реализации. Если проще, разделения на интерфейс и его имплементацию.

Понятие инкапсуляции присуще не только ООП. Абстракция данных применяется например и в функциональном программировании, модуляризация широко применима в процедурных языках.

#ООП
#вопросы_с_собеседований
Как выбрать все элементы определенного каталога по критерию (например, с определенным расширением)?
Метод File.listFiles() возвращает массив объектов File, содержащихся в каталоге. Метод может принимать в качестве параметра объект класса, реализующего FileFilter. Это позволяет включить в список только те элементы, для которых метод accept возвращает true (критерием может быть длина имени файла или его расширение).