Библиотека Java разработчика
10.8K subscribers
1.14K photos
563 videos
58 files
1.44K links
📚 Лайфхаки, приёмы и лучшие практики для Java-разработчиков. Всё, что ускорит код и прокачает навыки. Java, Spring, Maven, Hibernate.


По всем вопросам @evgenycarter

РКН clck.ru/3KoGeP
Download Telegram
Не можете продлить нужный сервис, оплатить хостинг или получить деньги из-за рубежа?

Ребята из rk.finaxe.ru тоже столкнулись с данной проблемой и запустили сервис, в котором граждане РФ могут оформить онлайн карту Visa или Mastercard в банке Казахстана.

Для чего это нужно:
— Оплата любых зарубежных сервисов и покупок
— Получение денег из-за рубежа
— Использование в путешествиях

Весь процесс проходит онлайн, от вас потребуется только загранпаспорт, даже вставать с дивана не понадобится!

Оформить заявку
и ознакомиться с FAQ можно в боте:
https://t.me/Robokazakh_bot
Что такое «анонимные классы»? Где они применяются?

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

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

• Их использование разрешено только в одном месте программы - месте его создания;
• Применение возможно только в том случае, если после порождения экземпляра нет необходимости на него ссылаться;
• Реализует лишь методы своего интерфейса или суперкласса, т.е. не может объявлять каких-либо новых методов, так как для доступа к ним нет поименованного типа.

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

• создания объекта функции (function object), например, реализация интерфейса Comparator;
• создания объекта процесса (process object), такого как экземпляры классов Thread, Runnable и подобных;
• в статическом методе генерации;
• инициализации открытого статического поля final, которое соответствует сложному перечислению типов, когда для каждого экземпляра в перечислении требуется отдельный подкласс.
👍6
Приглашаем на конференцию HighLoad++ Foundation.

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

Расписание и тезисы докладов на сайте: https://bit.ly/3wMNxa7.

В программе: архитектура крупных проектов, базы данных и системы хранения, devops и системное администрирование, нагрузочное тестирование, эксплуатация крупных проектов и другие направления, связанные с большими и высоконагруженными IT-системами.

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

Ждем вас 13 и 14 мая, Москва. Присоединяйтесь!
👍3
Какие существуют типы в Java?

В качестве типа переменной в Java может использоваться одна из пяти сущностей:

1. примитивный тип;
2. class – сложный тип, с поведением (API), возможно его реализацией и внутренним состоянием;
3. enum – перечисление. Тип с заданным конечным набором возможных значений;
4. interface – только описание поведения, без состояния. С Java 8 может иметь дефолтную реализацию. Возможно множественное наследование интерфейсов;
5. @ interface – аннотация. Пассивная метаинформация уровня класса: само ее наличие, параметры и поведение. Обычно используется для описания особых свойств (@Deprecated), для использования фреймворками (@Test) или инструментами разработки (@NotNull);

Новые примитивы создавать пока нельзя. Остальные типы называются ссылочными – переменная несет не значение, а ссылку на экземпляр. Для каждого ссылочного типа при компиляции создается отдельный .class файл. Его содержимое рассмотрим позднее.

Теме посвящена глава 8 спецификации.

Класс бывает:
1. Абстрактный – помеченный ключевым словом abstract. Не может иметь экземпляры, может иметь нереализованные абстрактные методы, также с модификатором abstract и без тела. Похож на частично реализованный интерфейс с состоянием, хотя с точки зрения JVM это совсем другая сущность;
2. Внутренний (inner, non-static nested) – объявленный внутри другого класса. Не может иметь статических объявлений. Имеет доступ ко всем внутренностям экземпляра внешнего класса. Если член внешнего класса foo перекрыт членом внутреннего (shadowing), обратиться к внешнему можно с помощью конструкции OuterClassname.this.foo, без перекрытия сработает просто foo. Инстанциируется только от экземпляра внешнего класса: outer.new Inner();
3. Вложенный (nested, inner static) – имеет доступ ко всем статическим членам внешнего класса. В остальном ничем не отличается от обычного класса;
4. Локальный – объявленный внутри метода. Является внутренним классом, в случае объявления в статическом методе без доступа к экземпляру внешнего класса. Не имеет модификаторов доступа;
5. Анонимный – локальный класс, объявленный без имени, непосредственно при инстанциировании, расширением другого класса или интерфейса. В отличие от других вложенных классов, анонимный может расширять только один класс или интерфейс. Не может быть абстрактным или финальным. Лямбда-выражение является сокращенной записью создания объекта анонимного наследника функционального интерфейса;
6. Финальный – с модификатором final, нерасширяемый;

Внутренние и вложенные классы могут иметь несколько уровней вложенности. Модификаторы abstract и final несовместимы, но по отдельности применимы к различным внутренним классам (кроме анонимного). Подробно разные виды вложенных классов рассмотрены в официальном туториале.

#Классы
👍13👎2
Media is too big
VIEW IN TELEGRAM
Web чат на Java фреймворке Vaadin, без единой строки HTML, JS, CSS

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

Один из таких примеров как раз фреймворк Vaadin, речь о котором идёт в этом видео, где я создаю простой многопользовательский вэб чат в виде SPA приложения.


Код из видео:
https://github.com/drucoder/vaadin-chat

Сайт Vaadin:
https://vaadin.com/

Генератор проекта Spring:
https://start.spring.io/
👍8
Что такое static?

Ключевое слово static используется для объявления вложенных классов, статических методов, полей, блоков инициализации и статических импортов.

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

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

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

Статический импорт (static import) импортирует статические члены классов в .java-файл.

#Классы
👍7
В чем разница между разными модификаторами доступа?

🔘 private – доступ только непосредственно из этого класса и его внутренних/вложенных классов;
🔘 package-private – доступ из всех классов этого пакета. Наследники доступа не имеют. Применяется когда модификатор не указан;
🔘 protected – доступ из всех классов этого пакета и всех наследников;
🔘 public – никаких ограничений доступа;

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

Вопросу посвящен Effective Java Item 13 и глава 6.6 спецификации.

#Классы
👍13
Опишите процесс создания экземпляра класса

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

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

Далее инстанциируется сам экземпляр. Как и с загрузкой классов, процесс выполняется для всей цепочки наследования, с самого дальнего родителя:
1. Выделяется память в куче для экземпляра, получается ссылка на этот экземпляр;
2. Выполняются инициализации нестатических полей и блоков инициализации в порядке объявления;
3. Вызывается конструктор;

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

В процессе конструирования объекта может возникать проблема виртуального вызова в конструкторе, свойственная для многих языков. Effective Java Item 17 рекомендует не использовать переопределяемые методы в расширяемом классе. Иллюстрация неочевидного поведения в результате приведена ниже:
👍8🔥1
new Integer(128) == 128?

Для всех классов-оберток над примитивами кроме Float и Double работает механизм кэширования. Некоторые значения создаются на этапе инициализации класса, и переиспользуются когда объект создается не оператором new (например с помощью valueOf).

Кэшируемые значения – оба возможных Boolean, Character до '\u007f' (127) и все целые числа от -128 до 127 включительно. С Java 7 верхнюю границу для Integer можно увеличить параметром java.lang.Integer.IntegerCache.high.

Значения кэшируются и во многих других встроенных классах: BigDecimal, Currency, пустые коллекции. Детали можно узнавать из исходников и документаций, так как эти кэши реализованы не на уровне JVM а в коде классов.

В конкретно этом примере скрыт еще один подвох: объект класса-обертки сравнивается с примитивом. Это приводит к анбоксингу и сравнению значений. И ответ на вопрос – да.

#Классы
👍7
3 причины учить Java начинающему программисту.
1. Java уже 8 лет входит в пятёрку самых топовых языков по данным StackOverflow. И это не просто хайп:
На Java пишут сервера, корпоративные системы, банковские приложения, игры (привет, Майнкрафт) и нейросети. Его используют Netflix, Amazon, Ebay и даже NASA.
2. На hh.ru открыто почти 3 000 вакансий для Java-разработчика. Кодеров ищут банки, госсектор и телекомы. 25% компаний предлагают удалёнку — сможете работать откуда угодно.
3. Java-разработчикам много платят. Уже джуниором будете зарабатывать от 75 000 рублей. Сеньорам готовы платить от 350 000 рублей — потолка нет.


Оставьте заявку, а мы откроем доступ к первым 5 модулям курса. Это 5 часов интенсивной теории и практики с опытным преподавателем.
Вы оцените качество уроков, освоите азы профессии, а полученные знания закрепите в домашних заданиях.
Переходите на сайт и оставляйте заявку: https://clc.to/IjqDSA
👍6👎1
Java для начинающих.

Урок 1: JDK и Hello World
Урок 2: Переменные. Примитивные типы данных
Урок 3: Строки(String) в Java. Ссылочные типы данных
Урок 4: Цикл while
Урок 5: Цикл for
Урок 6: Условный оператор if
Урок 7: Ввод данных. Класс Scanner
Урок 8: Цикл do...while
Урок 9: Операторы break и continue
Урок 10: Оператор switch.
Урок 11: Массивы в Java.
Урок 12: Цикл for each, Массивы строк.
Урок 13: Многомерные массивы.
Урок 14: Классы и объекты.
Урок 15: Методы в Java.
Урок 16: Тип возвращаемого значения метода.
Урок 17: Параметры метода.
Урок 18: Инкапсуляция. Сеттеры и геттеры.
Урок 19: Ключевое слово this.
Урок 20: Конструкторы
Урок 21: Ключевое слово static.
Урок 22: Ключевое слово final.
Урок 23: StringBuilder
Урок 23(продолжение): Форматирование строк в Java
Урок 24: Класс Object и метод toString()
Урок 25: Наследование
Урок 26: Интерфейсы
Урок 27: Пакеты
Урок 28: Модификаторы доступа public, private, protected и default
Урок 29: Полиморфизм
Урок 30: Приведение примитивных типов данных.
Урок 31: Классы-обертки примитивных типов данных.
Урок 32: Восходящее и нисходящее преобразование.
Урок 33: Введение в параметризацию. (Generics)
Урок 34: Wildcards (Generics)
Урок 35: Анонимные классы
Урок 36: Чтение из файла.
Урок 37: Исключения (часть 1). Обработка исключений.
Урок 38: Исключения (часть 2). Выбрасывание исключений.
Урок 39: Исключения (часть 3). Checked и Unchecked исключения.
Урок 40: Исключения (часть 4).
Урок 41: Абстрактные классы.
Урок 42: Метод equals() и String Pool.
Урок 43: Вложенные классы.
Урок 44: Запись в файл.
Урок 45: Сериализация (часть 1).
Урок 46: Сериализация (часть 2). Сериализация массивов.
Урок 47: Сериализация (часть 3). Transient, serialVersionUID.
Урок 48: Enum (Перечисления).
Урок 49: Рекурсия.


Ссылка на youtube
👍24
new String("Hello_42") == "Hello_" + 42?

Такие вопросы о сравнении строковых и числовых констант проверяют знания о понятии пулов литералов (literal pool). Не следует путать с пулом констант класса. Виртуальная машина переиспользует один и тот же объект для строкового литерала при загрузке класса, если такой уже выделен в куче. Вот почему "Hello" == "Hello" истинно, не смотря на то что String – ссылочный тип. Такая оптимизация возможна благодаря свойству неизменяемости (immutable) класса String, и называется интернирование строк.

Кроме самих литералов, интернирование применяется ко всем константным выражениям. К таким выражениям в этом примере относятся неявное приведение числа 42 к строке и конкатенация констант. Это делает истинным "Hello_42" == "Hello_" + 42.

Пул литералов не работает, когда явно используется оператор new. Это причина, по которой выражение new String("Hello_42") == "Hello_" + 42 ложно.

#Строки
#JVM
👍8
HashMaps

HashMap – это встроенная структура данных, которая хранит набор пар ключ-значение. Каждый ключ действует как уникальный идентификатор для связанного с ним значения.
Чтобы использовать эту структуру данных, импортируйте HashMap класс в верхней части программы.

Подписывайтесь на канал 👉@coddy_academy

#java
👍7👎2
Можем ли мы перегрузить методы по возвращаемому типу?
😁5
Параметры в Java передаются по ссылке или по значению?

Этот вопрос уходит корнями в C++ прошлое (скорее всего интервьюера), это терминология из C++. Для начала нужно разобраться в этой терминологии.

В C++ ссылка – это переменная-псевдоним для другой переменной. Меняя значение ссылки, поменяется и оригинал. В Java такого нет, легко понять это подумав например о ссылке на int.

Ссылка в Java – это нечто похожее на адрес объекта в памяти. Похожая сущность в C++ называется указатель.

Передача параметра по значению – это копирование значения в переменную-параметр метода. По ссылке – передача ссылки, то есть по сути использование той же самой переменной. Разобраться подробнее (осторожно, много C++).

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

#JVM
👎6👍5
Перегрузка в Java

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

Подписывайтесь на канал 👉@coddy_academy

#java
👍10
Какие в Java бывают виды ссылок?

Кроме обычной жесткой ссылки на объект существуют варианты ссылок, которые обрабатываются сборщиком мусора особым образом. Это наследники класса java.lang.ref.Reference. Все они реализуют разного рода слабые ссылки. Технически это обертки над объектом, который доступен по методу get(), и может быть удален сборщиком мусора пока объект-обертка еще не удален. Используются они для экономии памяти, для реализации кэшей, для финализации внешних ресурсов. Например в Android слабые ссылки иногда используются для борьбы с утечкой Activity.

Виды ссылок в порядке убывания «жесткости»:

Обычная жесткая ссылка – любая переменная ссылочного типа. Очистится сборщиком мусора не раньше, чем станет неиспользуемой (перестанет быть доступной из GC roots, подробнее в следующих постах).
SoftReference – мягкая ссылка. Объект не станет причиной израсходования всей памяти – гарантированно будет удален до возникновения OutOfMemoryError. Может быть раньше, зависит от реализации сборщика мусора.
WeakReference – слабая ссылка. Слабее мягкой. Не препятствует утилизации объекта, сборщик мусора игнорирует такие ссылки.
PhantomReference – фантомная ссылка. Используется для «предсмертной» обработки объекта: объект доступен после финализации, пока не очищен сборщиком мусора.

Подробнее можно почитать в этой статье, и как обычно в документации классов.

#JVM
👍12
Выкладывать информацию по Kotlin?
Anonymous Poll
68%
Да
32%
Нет
Из чего состоит .class-файл?

.class-файл представляет собой один скомпилированный класс. Это то, что в конечном итоге исполняет Java Virtual Machine. В .class компилируется код любого JVM языка, формат входит в спецификацию и не зависит от платформы или реализации виртуальной машины. Содержимое конкретного класса просматривают утилитой javap из стандартного набора JDK. Подробно структура файла описана на википедии, в документации и во множестве статей. Файл состоит из 10 секций, которые можно условно разбить на группы:

🔘 Свойства файла: определяющее тип файла «волшебное слово» 0xCAFEBABE и версия формата;
🔘 Пул констант – содержит все используемые имена методов и классов в специальном формате, и прочую символьную информацию. В других местах используются только ссылки на элементы пула;
🔘 Основные свойства класса: флаги доступа, имя этого класса, его предка, интерфейсов;
🔘 Внутреннее содержимое: список полей класса и байткод методов
🔘 Атрибуты класса;

Для внутренних классов тоже создаются отдельные файлы с названиями формата OuterClass$InnerClass.class. Если класс анонимный, вместо имени используются номера с 1.

#JVM
👍12🔥2
Из чего состоит .class-файл?

.class-файл представляет собой один скомпилированный класс. Это то, что в конечном итоге исполняет Java Virtual Machine. В .class компилируется код любого JVM языка, формат входит в спецификацию и не зависит от платформы или реализации виртуальной машины. Содержимое конкретного класса просматривают утилитой javap из стандартного набора JDK. Подробно структура файла описана на википедии, в документации и во множестве статей. Файл состоит из 10 секций, которые можно условно разбить на группы:

🔘 Свойства файла: определяющее тип файла «волшебное слово» 0xCAFEBABE и версия формата;
🔘 Пул констант – содержит все используемые имена методов и классов в специальном формате, и прочую символьную информацию. В других местах используются только ссылки на элементы пула;
🔘 Основные свойства класса: флаги доступа, имя этого класса, его предка, интерфейсов;
🔘 Внутреннее содержимое: список полей класса и байткод методов
🔘 Атрибуты класса;

Для внутренних классов тоже создаются отдельные файлы с названиями формата OuterClass$InnerClass.class. Если класс анонимный, вместо имени используются номера с 1.

#JVM
🔥4👍2