Инкапсуляция
Инкапсуляция в Java является механизмом обёртывания данных (переменных) и кода, работающего с данными (методами), в одно целое. В инкапсуляции переменные класса будут скрыты от других классов и доступ к ним может быть получен только с помощью метода их текущего класса. По-другому это называется скрытием данных.
Для достижения инкапсуляции в Java:
☕️ Объявите переменные класса как private.
☕️ Предоставьте public к методам установки и получения (сеттеру и геттеру) для изменения и просмотра значений переменных.
Преимущества инкапсуляции:
☕️ Поля класса можно сделать только для чтения или только для записи.
☕️ Класс может иметь полный контроль над тем, что хранится в его полях.
Инкапсуляция в Java является механизмом обёртывания данных (переменных) и кода, работающего с данными (методами), в одно целое. В инкапсуляции переменные класса будут скрыты от других классов и доступ к ним может быть получен только с помощью метода их текущего класса. По-другому это называется скрытием данных.
Для достижения инкапсуляции в Java:
☕️ Объявите переменные класса как private.
☕️ Предоставьте public к методам установки и получения (сеттеру и геттеру) для изменения и просмотра значений переменных.
Преимущества инкапсуляции:
☕️ Поля класса можно сделать только для чтения или только для записи.
☕️ Класс может иметь полный контроль над тем, что хранится в его полях.
❤2👍2
Java 21: String templates
В сентябре выходит java 21 (LTS) с интересной превью фичей — String templates.
Есть две стратегии работы со строками:
🔸 Конкатенация — собираем строку по частям:
🔸 Интерполяция — замена переменных внутри шаблона:
В начале строки нужно добавить
❓ Зачем нужен префикс STR? Почему нельзя просто добавить новый функционал в строки?
Здесь 2 причины:
1️⃣ Для обратной совместимости
На джаве написано много кода, и наверняка какие-то строки содержат блоки \{}. Будет обидно, если этот код перестанет компилироваться. Поэтому строки для интерполяции нужно явно обозначить
2️⃣ Может быть не только STR😱
Здесь открывается портал в другой мир. По задумке авторов темплейты могут подставлять переменные, валидировать данные и делать преобразования. Например, так:
Но рано радоваться🙂 Из коробки этого не будет, только набор классов для кастомизации. Будем надеяться, что авторы библиотек возьмут фичу на вооружение.
❓ Как это работает? Выглядит как магия!
В JDK появится статическое поле StringProcessor STR, а строка
во время компиляции превратится в
Cинтаксический сахарок и никакого волшебства✨
В сентябре выходит java 21 (LTS) с интересной превью фичей — String templates.
Есть две стратегии работы со строками:
🔸 Конкатенация — собираем строку по частям:
String str = "Hello, " + name + "!";Сюда же относится StringBuilder, метод concat и тд.
🔸 Интерполяция — замена переменных внутри шаблона:
String name = "Jake";В чистом виде в java такого нет. В Formatter и MessageFormat вместо переменных какие-то %s и %d, а переменные стоят отдельно:
String str = "Hello, ${name}!";
String.format("%d plus %d equals %d", x, y, x + y);Для сравнения, как это выглядит в Kotlin:
"$x plus $y equals ${x + y}"Так вот, в java 21 появится интерполяция!
В начале строки нужно добавить
STR.
, а переменные поместить в \{}
int x = 10, y = 20;Хорошо работает вместе с текстовыми блоками (многострочные строки в тройных кавычках):
String str = STR."\{x} + \{y} = \{x + y}";
// "10 + 20 = 30"
String name = "Joan";Внутри можно вызывать методы и писать блоки кода:
String phone = "555-123";
String json = STR."""
{
"name": "\{name}",
"phone":"\{phone}",
}
""";
String time = STR."The time is \{Читаемость текста снижается, но если очень хочется — почему нет.
DateTimeFormatter
.ofPattern("HH:mm:ss")
.format(LocalTime.now())
} right now";
//"The time is 09:01:45 right now"
❓ Зачем нужен префикс STR? Почему нельзя просто добавить новый функционал в строки?
Здесь 2 причины:
1️⃣ Для обратной совместимости
На джаве написано много кода, и наверняка какие-то строки содержат блоки \{}. Будет обидно, если этот код перестанет компилироваться. Поэтому строки для интерполяции нужно явно обозначить
2️⃣ Может быть не только STR😱
Здесь открывается портал в другой мир. По задумке авторов темплейты могут подставлять переменные, валидировать данные и делать преобразования. Например, так:
JSONObject json = JSON."{ id: \{id}}";или даже так:
ResultSet rs = DB."SELECT * FROM Person WHERE name = \{name}";Для запросов в БД это, наверное, слишком, а вот для работы с JSON выглядит очень удобно.
Но рано радоваться🙂 Из коробки этого не будет, только набор классов для кастомизации. Будем надеяться, что авторы библиотек возьмут фичу на вооружение.
❓ Как это работает? Выглядит как магия!
В JDK появится статическое поле StringProcessor STR, а строка
String str = STR."\{name}!";
во время компиляции превратится в
StringTemplate template = new StringTemplate(паттерн, параметры);
String str = STR.process(template)
;Cинтаксический сахарок и никакого волшебства✨
👍10❤1
Какой шаблон проектирования лежит в основе класса java.lang.StringBuffer?
Anonymous Quiz
9%
Abstract Factory
66%
Builder
8%
Facade
7%
Adapter
11%
Узнать ответ
👍1
Какое из этих слов не является ключевым в Java?
Anonymous Quiz
6%
static
12%
try
63%
String
9%
new
10%
Узнать ответ
Какие логические операции и операторы вы знаете?
• & : Логическое AND (И);
• && : Сокращённое AND;
• | : Логическое OR (ИЛИ);
• || : Сокращённое OR;
• ^ : Логическое XOR (исключающее OR (ИЛИ));
• ! : Логическое унарное NOT (НЕ);
• &= : AND с присваиванием;
• |= : OR с присваиванием;
• ^= : XOR с присваиванием;
• == : Равно;
• != : Не равно;
• ?: : Тернарный (троичный) условный оператор.
#вопросы_с_собеседований
• && : Сокращённое AND;
• | : Логическое OR (ИЛИ);
• || : Сокращённое OR;
• ^ : Логическое XOR (исключающее OR (ИЛИ));
• ! : Логическое унарное NOT (НЕ);
• &= : AND с присваиванием;
• |= : OR с присваиванием;
• ^= : XOR с присваиванием;
• == : Равно;
• != : Не равно;
• ?: : Тернарный (троичный) условный оператор.
#вопросы_с_собеседований
Сортировка списка и костыль в JDK
Вести абстрактные разговоры о разработке легко и приятно. Можно два часа рассуждать, что такое хорошее API, но гораздо полезнее обсудить конкретные примеры. Сегодня разберём метод сортировки.
Если показать вопрос перед постом питонисту, он однозначно выберет
Класс Integer реализует интерфейс
Однако в интерфейсе List нет такого метода, только
(
Сейчас расскажу:)
Java создавался как язык для больших и долгоживущих приложений, и его основные ценности — стабильность и обратная совместимость.
C начала 2000-х в JDK есть метод
В больших компаниях классы JDK часто расширяли удобными методами, в том числе сортировкой в функциональном стиле:
Но есть проблема. Допустим, на проекте есть такой класс:
Многие проекты полагаются на свой sort, поэтому разработчики JDK не стали добавлять его в интерфейс. Метод sort(Comparator) использовался редко, поэтому теперь он с нами.
У Stream API нет проблем с совместимостью, так что для стримов есть прекрасный метод sorted(). Для коллекций метод sorted() есть в Kotlin💖
(обратите внимание на суффикс -ed, всё по правилам функционального подхода)
Ответ на вопрос перед постом: отсортировать список можно так:
✅
Вести абстрактные разговоры о разработке легко и приятно. Можно два часа рассуждать, что такое хорошее API, но гораздо полезнее обсудить конкретные примеры. Сегодня разберём метод сортировки.
Если показать вопрос перед постом питонисту, он однозначно выберет
list.sort()
. Хотя бы потому что в питоне есть такой метод.Класс Integer реализует интерфейс
Comparable
, сортировка чисел — базовая функциональность любого языка программирования. Так что метод sort()
максимально логичен.Однако в интерфейсе List нет такого метода, только
void sort(Comparator<? super E> c) {…}Для элементарной операции сортировки чисел приходится писать
list.sort(Comparator.naturalOrder())Код с Comparator.naturalOrder() похож на какой-то костыль. Под капотом не происходит ничего особенного, реализация компаратора очень простая:
(
с1, с2) -> c1.compareTo(c2)
❓ Так зачем писать так сложно? Почему в интерфейсе List нет метода sort()?Сейчас расскажу:)
Java создавался как язык для больших и долгоживущих приложений, и его основные ценности — стабильность и обратная совместимость.
C начала 2000-х в JDK есть метод
Collections.sort(List)
. Статический метод, который меняет внутреннее состояние аргумента. Сейчас это порицается, но в те времена было норм.В больших компаниях классы JDK часто расширяли удобными методами, в том числе сортировкой в функциональном стиле:
CustomList sorted = list.sort();Спустя много лет стало понятно, что экземплярные методы сортировки — это классно, и надо добавить такой метод в JDK. Чтобы текущие реализации списков не сломались, это должен быть дефолтный метод в интерфейсе List.
Но есть проблема. Допустим, на проекте есть такой класс:
public class CustomList implements List {Допустим, в java 8 в интерфейс List добавили метод
public CustomList sort() {…}
}
default void sort() {…}Старый метод не может переопределить дефолтный. тк возвращаемые значения не совместимы. Поэтому проекты, которые определили свой функциональный sort в начале 2000-х, перестанут компилироваться. Пользователи будут недовольны.
Многие проекты полагаются на свой sort, поэтому разработчики JDK не стали добавлять его в интерфейс. Метод sort(Comparator) использовался редко, поэтому теперь он с нами.
У Stream API нет проблем с совместимостью, так что для стримов есть прекрасный метод sorted(). Для коллекций метод sorted() есть в Kotlin💖
(обратите внимание на суффикс -ed, всё по правилам функционального подхода)
Ответ на вопрос перед постом: отсортировать список можно так:
✅
list.sort(Comparator.naturalOrder());
✅ list = list.stream().sorted().toList();
Если вам понравился list.sort()
, значит у вас хороший вкус на API. К сожалению, у java свои загоны, поэтому этого метода в JDK нет.👍6❤2
Какая строка первой вызовет ошибку компиляции?
Anonymous Quiz
33%
l1
9%
l2
9%
l3
17%
l4
32%
Узнать ответ
Уютное сообщество джавистов
Photo
Ошибка, не прислали само условие. 7% правильно ответило) 41% почти)
🤣3
Сколько переходов происходит в момент вызова HashMap.get(key) по ключу, который есть в таблице?
• ключ равен null: 1 - выполняется единственный метод getForNullKey().
• любой ключ отличный от null: 4 - вычисление хэш-кода ключа; определение номера корзины; поиск значения; возврат значения.
#вопросы_с_собеседований
• любой ключ отличный от null: 4 - вычисление хэш-кода ключа; определение номера корзины; поиск значения; возврат значения.
#вопросы_с_собеседований
👍3
Какой из этих конструкторов используется для создания пустого объекта String?
Anonymous Quiz
63%
String()
4%
String(void)
3%
String(0)
30%
Ни один из перечисленных
Имеет ли смысл объявлять метод private final?
Объявление метода с модификаторами private и final имеет смысл, когда вы хотите:
— Скрыть детали реализации метода от других классов.
— Зафиксировать определенное поведение метода и не дать его переопределить.
— Сделать метод доступным только для использования внутри данного класса.
#вопросы_с_собеседований
— Скрыть детали реализации метода от других классов.
— Зафиксировать определенное поведение метода и не дать его переопределить.
— Сделать метод доступным только для использования внутри данного класса.
👎14👍2
Что означает переопределение метода в Java (override)?
Anonymous Quiz
78%
Изменение поведения метода относительно родительского
5%
Изменение поведения метода относительно дочернего
17%
Несколько методов с одинаковыми названиями, но разными наборами параметров
👍1
Что произойдет при вызове Iterator.next() без предварительного вызова Iterator.hasNext()?
Если итератор указывает на последний элемент коллекции, то возникнет исключение NoSuchElementException, иначе будет возвращен следующий элемент.
#вопросы_с_собеседований
Какое значение будет сохранено в строку s? String s = "value = " + 2 + 2;
Anonymous Quiz
9%
"value = 2 + 2"
43%
"value = 22"
19%
Compiler Error
23%
"value = 4"
7%
"value = 2 2"
В чем разница между Iterator и Enumeration?
— Iterator появился в JDK 1.2 и реализует интерфейс Iterable, в то время как Enumeration существовал в более ранних версиях JDK и не реализует Iterable.
— Методы Iterator позволяют удалять элементы во время итерации, в то время как методы Enumeration не предоставляют такой возможности.
— Iterator является "fail-fast", то есть выбросит ConcurrentModificationException, если коллекция была изменена, а Enumeration не гарантирует такого поведения.
— Iterator поддерживает обобщенные типы, а Enumeration работает только с объектами типа Object.
#вопросы_с_собеседований
— Методы Iterator позволяют удалять элементы во время итерации, в то время как методы Enumeration не предоставляют такой возможности.
— Iterator является "fail-fast", то есть выбросит ConcurrentModificationException, если коллекция была изменена, а Enumeration не гарантирует такого поведения.
— Iterator поддерживает обобщенные типы, а Enumeration работает только с объектами типа Object.
👍5
Что будет выведено на экран в результате выполнения следующего кода: public class SomeClass { static int x = 5; public static void main(String[] args) { int x; int y = 5; if (y > 3) x = 1; System.out.println(x); } }
Anonymous Quiz
28%
Compiler error
51%
1
3%
3
9%
Error warning
9%
5
В каком случае использование TreeSet предпочтительнее использования HashSet?
Anonymous Quiz
9%
Когда необходимо часто осуществлять обращение к элементам из Set
12%
Когда необходимо часто вставлять в Set новые элементы или удалять их
70%
Когда нужно гарантировать сохранение порядка элементов коллекции
9%
Когда нужно модифицировать производительность итератора по коллекции