Обложка канала

Библиотека Java разработчика. Страница 35

9291 @BookJava

Библиотека Java разработчика. Книги по программированию на Java.

  • Библиотека Java разработчика

    Как работает вывод типов? Для начала разберемся, что такое вывод типов. Type inference – это способность компилятора догадаться, какой тип нужно подставить, и сделать это за вас. На обычном интервью никто не спросит детали алгоритма вывода типов, достаточно будет сказать, что вывод происходит статически, только на основании типов аргументов и ожидаемого типа результата. По сути, вопрос заключается не в «как работает?», а «что это и когда возникает?». Первое, что многим приходит в голову при фразе «вывод типов» – diamond operator <>. Он появился в Java с версии 7. Его применяют к конструкторам дженерик классов, чтобы отличать требование автоматического вывода типа от raw type. С Java 9 diamond operator заработал и для анонимных классов. Для дженерик методов можно указывать параметр явно, но diamond синтаксически недопустим – вывод и так сработает по умолчанию. В Java 10 для вывода типа локальной переменной добавлено ключевое слово var. Работает это так же, как в большинстве современных языков – ключевое слово ставится вместо типа при объявлении. Типы выводимых параметров лямбда-выражения также можно не указывать. С Java 11 вместо типа указывается ключевое слово var. Такой синтаксис дает возможность добавлять параметру модификаторы и аннотации. #Язык #Дженерики
  • Библиотека Java разработчика

    💎 Интересен язык Scala? ️️❇️ Начните осваивать его уже 7 июня в 20:00! Ждем вас на открытом уроке «Эффекты в Scala» в OTUS. Занятие проведет Алексей Воронец, руководитель разработки в NAUMEN. 📕 На открытом уроке мы рассмотрим понятие эффекта и сложности, которые могут возникать при наличии эффектов, введем понятие функционального эффекта, рассмотрим его свойства и реализуем свой небольшой функциональный эффект. ⚠️ Этот урок — часть онлайн-курса «Scala Developer». Программа рассчитана на специалистов с опытом в Java от 1 года ли на других ООП от 3-х лет. 👉 Для участия пройдите вступительный тест
  • Библиотека Java разработчика

    Which JVM Version Is the Fastest? - DZone Java

    How is a high-performance, low-latency Java application affected by the JVM version used? Every nanosecond counts for trading and other applications where messages between two different threads are exchanged in about 500 ns! Read this article and find out

    dzone.com
  • Реклама

  • Библиотека Java разработчика

    Что такое heap pollution? Как было сказано ранее, массивы в Java ковариантны. А значит, можно обратиться к объекту типа String[] через переменную типа Object[], и положить туда например Integer. Такой код скомпилируется, но в момент записи произойдет ArrayStoreException. Дженерики защищены инвариантностью. Если попытаться положить List<Object> в List<String>, эта же по сути ошибка произойдет уже на этапе компиляции. Heap pollution – ситуация, когда эта защита не срабатывает, и переменная параметризованного типа хранит в себе объект, параметризованный другим типом. Простейший пример: List<String> strings = (List) new ArrayList<Integer>(); Документация гарантирует, что при компиляции всего кода целиком, heap pollution не может возникнуть без варнинга этапа компиляции. Heap pollution может произойти в двух случаях: при использовании массивов дженериков и при смешивании параметризованных и raw-типов. Raw types – это параметризованные типы без указания параметра. Пример с raw types, приводящий к heap pollution, уже был описан выше: List<String> strings = (List) new ArrayList<Integer>(); Использовать raw types не надо вообще, причины подробно изложены в главе 26 Effective Java. Если информация о дженериках не нужна, используется символ wildcard (<?>). Компилятор не даст создать массив параметризованного типа, это приведет к ошибке generic array creation. Картинка ниже иллюстрирует, к чему это могло бы привести. Параметризованный тип varargs-аргумента метода вызывает ту же проблему, т.к. varargs – не что иное как параметр-массив. Вот почему он так же приводит к предупреждению компилятора «possible heap pollution». Если вы уверены что риска нет, с Java 7 это предупреждение заглушается аннотацией @SafeVarargs.
  • Библиотека Java разработчика

    🔥 Чем отличаются объектно-ориентированное и функциональное программирование? ⚡️ Приглашаем 1 июня в 20:00 мск на бесплатный вебинар «Объектно-ориентированное и функциональное программирование»! 📚 Вместе с практикующим экспертом Сергеем Петрелевичем мы на максимально простом уровне разберем отличия объектно-ориентированного и функционального подходов в программировании, а также рассмотрим примеры на языке Java. Урок рассчитан на новичков в IT и пройдет в рамках онлайн-курса «Специализация Java-разработчик», об особенностях которого мы подробно расскажем во второй части занятия. 📌 Регистрация на бесплатный вебинар: https://otus.pw/LnqV/
  • Библиотека Java разработчика

    Что такое bridge method? В Java отсутствует ковариантность переопределенных методов по параметрам – их типы должны совпадать с типами параметров метода в родительском классе. Когда дженерик параметр конкретизируется в наследнике, методы с аргументами этого дженерик типа больше не совпадают в байткоде – в наследнике тип конкретный, а в родителе стертый до верхней границы. Проблема решается простым и безопасным кастом. Компилятор генерирует новый метод, который совпадает по сигнатуре с родительским. В его теле параметр кастуется и вызов делегируется в пользовательский метод. Это и называется bridge методом. Bridge method можно увидеть с помощью рефлекшна. Его имя совпадает с оригинальным методом, но параметр имеет тип, в который сотрется дженерик родителя. Этот метод будет помечен флагом synthetic, что значит, что он написан не программистом а компилятором. Попытка написать такой же метод вручную приведет к ошибке компиляции. 👉 @BookJava #Дженерики
  • Библиотека Java разработчика

    Что такое ковариантность и контравариантность? Формально, ковариантность/контравариантность типов – это сохранение/обращение порядка наследования для производных типов. Проще говоря, когда у ковариантных сущностей типами-параметрами являются родитель и наследник, они сами становятся как бы родителем и наследником. Контравариантные наоборот, становятся наследником и родителем. Легче всего осознать эти понятия на примерах: 🔘 Ковариантность: List<Integer> можно присвоить в переменную типа List<? extends Number> (как будто он наследник List<Number>). 🔘 Контравариантность: в качестве параметра метода List<Number>#sort типа Comparator<? super Number> может быть передан Comparator<Object> (как будто он родитель Comparator<Number>) Отношение типов «можно присвоить» – не совсем наследование, такие типы называются совместимыми (отношение «is a»). Существует еще одно связанное понятие – инвариантность. Инвариантность – это отсутствие свойств ковариантности и контрвариантности. Дженерики без вайлдкардов инвариантны: List<Number> нельзя положить ни в переменную типа List<Double>, ни в List<Object>. Массивы ковариантны: в переменную Object[] можно присвоить значение типа String[]. Переопределение методов начиная с Java 5 ковариантно относительно типа результата и типов исключений.
  • Библиотека Java разработчика

  • Библиотека Java разработчика

    👨🏼‍💻 Теперь official. Стартовала IT-ипотека. И в Банке ДОМ.PФ одни из самых выгодных условий! ✅ ставка — от 4,3%, ✅ первоначальный взнос — от 15%, ✅ MAX сумма кредита в регионах-миллионниках — 18 млн рублей, в остальных — до 9 млн рублей. Кстати, за счет ипотеки можно купить не только строящуюся квартиру, но и готовую от юрлица, а еще построить дом или купить готовый жилой дом с земельным участком 🔥 Подробности можно чекнуть здесь
  • Библиотека Java разработчика

    Как ограничивается тип generic параметра? В объявлении дженерик-параметра класса или метода может быть указана его верхняя граница (bound): class Foo<T extends Number> Ключевое слово extends применяется как для классов, так и для интерфейсов. Фактическим параметром такого класса Foo может быть или сам Number, или его наследники. Помимо ограничения возможных применяемых типов, bounded-параметр дает право использовать в реализации методы и поля типа-ограничителя – он будет как минимум предком фактического типа. Это достигается стиранием типа-параметра до верхней границы. Тип-параметр может иметь несколько верхних границ, то есть границу-пересечение типов: <T extends Comparable & Serializable>. Стирание произойдет до первой из границ, остальные послужат только ограничением вариантов фактического типа. Поэтому граница-класс, при наличии, должна быть указана раньше границ-интерфейсов. При указании значения дженерик-параметра переменной может быть использован вайлдкард – символ ?. Вайлдкард значит, что мы не собираемся использовать информацию о конкретном типе, этот тип может быть любым. Это не то же самое, что не указать дженерик параметр совсем. Для вайлдкарда также как и для объявления типа-параметра можно обозначить верхнюю границу. Но в отличие от объявления, здесь нельзя использовать пересечение типов, по крайней мере пока. Кроме того, в случае вайлдкарда можно задать нижнюю границу: Foo<? super Number> foo; Означает, что мы не будем использовать информацию о конкретном типе, но будем знать что это предок класса Number. То есть или сам Number, или Object. В объявлении класса или метода использование super запрещено, так как не имеет смысла. Лучше разобраться в механике использования ограниченных вайлдкардов поможет это видео. Хороший API должен уметь эффективно работать с классами-наследниками, то есть быть ко- или контравариантным где это необходимо. При этом без bounded вайлдкардов не обойтись. Чтобы запомнить, какая граница нужна в каких случаях, Joshua Bloch предложил мнемонику PECS: Producer-extends, Consumer-super. #Дженерики
  • Библиотека Java разработчика

    🤖Решаешь однотипные задачи на Java? 🚀Не стой на месте, джавист! Расширь возможности использования языка Java и открой для себя подходы к написанию чистого кода. Вырасти до мидл-разработчика на онлайн-курсе «Java Developer. Professional» в OTUS. Полгода ты будешь практиковаться решать сложные задачи на Java, а опытные разработчики проведут для тебя подробное код-ревью. 🗣Тебя ждут живые вебинары, обмен опытом, интересные домашние задания и создание своего серверного приложения в качестве выпускного проекта. 📌Пройди вступительный тест, чтобы присоединиться к закрытому сообществу и занять место по спец.цене: https://otus.pw/13QP/
  • Библиотека Java разработчика

    Что такое Type Erasure? Компилятор удаляет из байткода класс-файла информацию о типах-дженериках. Этот процесс и называется стирание типов (type erasure). Он появился в Java 5 вместе с самими дженериками. Такое решение позволило сохранить обратную совместимость без перекомпилляции кода Java 4. Стирание состоит из трех действий: 🔘 Если параметры ограничены (bounded), вместо типа-параметра в местах использования подставляется верхняя граница, иначе Object; 🔘 В местах присвоения значения типа-параметра в переменную обычного типа добавляется каст к этому типу; 🔘 Генерируются bridge-методы. Подробнее о границах дженериков и bridge-методах поговорим в следующих постах. Информация о типах стирается только из методов и полей, но остается в метаинформации самого класса. Получить эту информацию в рантайме можно с помощью рефлекшна, методом Field#getGenericType. Тип со стертой информацией о дженериках называется «Non-reifiable». Стирание типов позволяет не создавать при применении дженериков новые классы, в отличие от, например, шаблонов C++. #Дженерики
  • Библиотека Java разработчика

    Как создать папку на java? Используйте File() объект в Java чтобы создать папку или директорию на Java, ниже пример кода как пример: import java.io.File; public class Main { public static void main(String args[]) { // Путь к папке или название папкм String path = "/tmp/test"; File directory = new File(path); boolean res = false; // Проверяем если папка уже существует if (!directory.exists()) { // Создать новую папку res = directory.mkdirs(); } if (res) { // Вывод: Директория: /tmp/test создана System.out.println("Директория: " + path + " создана"); } } } #java Подписывайтесь на канал 👉@coddy_academy
  • Библиотека Java разработчика

    Неадекватное Java-интервью Обсудим, какие вопросы нам задают на интервью при найме на работу, и адекватны ли эти вопросы вообще.
  • Библиотека Java разработчика

    Тинькофф приглашает на One Day Offer Ищем Java- и Kotlin-разработчиков с опытом от трех лет, чтобы сделать им оффер за день. В течение дня вы общаетесь с командой, а после получаете оффер, если вам понравится команда, работа подойдет по условиям, а задачи — по скиллам. Встречаемся 28 мая онлайн. Успейте подать заявку до 26 мая. В течение трех дней вернемся с обратной связью: https://l.tinkoff.ru/onedayoffer_java
  • Реклама

  • Библиотека Java разработчика

    ​Как узнать, является ли A подтипом B? В Java доступны три способа проверки совместимости типов. Функционально они ничем не отличаются, применяются для разных наборов аргументов. В порядке убывания быстродействия: instanceof – бинарный оператор, самый быстрый и самый используемый. Если есть экземпляр A и можно указать B явно, выбирать надо его. Если A (точнее тип хранящей экземпляр A переменной) и B не из одной цепочки наследования – экземпляр точно не может быть подтипом B и компиляция упадет с ошибкой inconvertible types. Class::isInstance – метод принимает параметром объект типа A. Его стоит выбрать, когда экземпляр A в наличии, но B – неизвестный на этапе компиляции тип. То есть, для переменных A a и Class bClass, можем проверить bClass.isInstance(a). Class::isAssignableFrom – принимает Class<A>. Единственное, что остается, если экземпляра A нет. bClass.isAssignableFrom(aClass). Есть еще четвертый способ – имея экземпляр типа A привести его к B. Если типы были несовместимы, приведение выбросит ClassCastException. Это во всех смыслах плохой способ, построению логики программы на исключениях нет оправдания. Подробная аргументация описана в Effective Java Item 57.
  • Библиотека Java разработчика

    Подборка каналов для IT специалистов 🎯 Системное администрирование 📌 https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало) https://t.me/sysadminof Книги для админов, полезные материалы https://t.me/i_odmin Все для системного администратора https://t.me/i_odmin_book Библиотека Системного Администратора https://t.me/i_odmin_chat Чат системных администраторов https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др. Excel лайфхак📌 https://t.me/Excel_lifehack GitHub Сообщество 📌 https://t.me/Githublib Интересное из GitHub CodePen 📌 https://t.me/codepen_1 Сообщество пользователей CodePen Базы данных (Data Base) 📌 https://t.me/database_info Все про базы данных Вакансии для программистов 📌 https://t.me/progjob Программирование Python 📌 https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍 https://t.me/BookPython Библиотека Python разработчика https://t.me/python_real Python подборки на русском и английском Мобильная разработка: iOS, Android 📌 https://t.me/developer_mobila Мобильная разработка Фронтенд разработка 📌 https://t.me/frontend_1 Подборки для frontend разработчиков Java разработка 📌 https://t.me/BookJava Библиотека Java разработчика Разработка игр 📌 https://t.me/game_devv Все о разработке игр Библиотеки 📌 https://t.me/book_for_dev Книги для программистов Rus https://t.me/java_360 Книги по Java Rus https://t.me/python_360 Книги по Python Rus https://t.me/programmist_of Книги по программированию https://t.me/proglb Библиотека программиста https://t.me/bfbook Книги для программистов БигДата, машинное обучение 📌 https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning Программирование 📌 https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций https://t.me/coddy_academy Полезные советы по программированию QA, тестирование 📌 https://t.me/testlab_qa Библиотека тестировщика Шутки программистов 📌 https://t.me/itumor Шутки программистов Защита, взлом, безопасность 📌 https://t.me/thehaking Канал о кибербезопасности Книги, статьи для дизайнеров 📌 https://t.me/ux_web Статьи, книги для дизайнеров https://t.me/arhitekturamira World Architecture Английский 📌 https://t.me/UchuEnglish Английский с нуля Математика 📌 https://t.me/Pomatematike Канал по математике Арбитраж трафика 📌 https://t.me/partnerochkin CPA и арбитраж трафика Крипта 📌 https://t.me/bitkoinoff Новости криптовалют DeepFake 📌 https://t.me/deepfakenow Публикуем deepfake видео Мир технологий 📌 https://t.me/mir_teh Видео из мира технологий
  • Библиотека Java разработчика

    Привет! Давно кодишь на Java/Kotlin и устал от долгих собеседований? Тогда читай то, что написано ниже👇 Приглашаем Middle, Senior разработчиков в Surf. ✅Back-end оффер в Surf за 1 день ✅З/П до 400к ✅ДМС с психологом, юристом и стоматологом ✅Без бюрократии и пафоса ✅Все подробности здесь 👉Успей подать заявку до 18.05