Загрузка...

Records в Java

Объявите компактный тип данных через record и читайте его компоненты. В Card.java оставьте package-private record Tag(String name) {}, public класс Card, создайте Tag t = new Tag("oak"); и выведите t.name(). Скомпилируйте javac Card.java и запустите java Card. На экране должно быть oak. Вторая демонстрация добавляет компонент int, и экран показывает oak, затем 3. Опциональный JUnit оставьте на следующую страницу. Этот урок — record с accessors, а не конвейер Streams и не проход Lambda forEach.

Один компонент, один accessor

Откройте Card.java. Имя public класса — Card. Удалите оставшиеся демо Streams с Pipe, оставшиеся lambda-печати Cue, оставшиеся списки Generics Bin и оставшиеся запросы Scanner Box, если они заслоняют тему records. Программа не должна ждать ввода с клавиатуры и не должна запускать stream-конвейер.
Над public классом объявите record:
record Tag(String name) {}
Внутри Card.main создайте один экземпляр и выведите accessor:
Tag t = new Tag("oak");
System.out.println(t.name());
Заголовок record перечисляет компоненты в скобках. Java генерирует конструктор и accessor name() для этого компонента. На экране будет oak.

Card record Tag prints oak

java
record Tag(String name) {}

public class Card {
    public static void main(String[] args) {
        Tag t = new Tag("oak");
        System.out.println(t.name());
    }
}

В папке с Card.java выполните javac Card.java. Когда скобки и круглые скобки сходятся, javac сам ничего не печатает. Затем запустите java Card — не java Card.java и не java Tag. Оставьте один public класс, чтобы имя запуска совпадало с Card. Record Tag остаётся package-private в том же файле.
Пройдите запуск один раз. Java начинает в Card.main. new Tag("oak") сохраняет компонент. t.name() возвращает "oak". println пишет oak. Никто не вызывает stream(). Никто не вызывает forEach. Никто не читает args[0].
Пока смотрите на экран, сформулируйте правило для начинающего: record задаёт тип и его компоненты; accessor совпадает с именем компонента; создавайте через new. Не выдумывайте демо JUnit на этой странице. JUnit ждёт на следующем опциональном уроке. Не заменяйте record длинным вручную написанным классом с getters в учебном файле — оставьте заголовок record.
Если вы всё ещё видите OAK затем PINE из оставшегося файла Pipe streams, переключитесь на Card и оставьте t.name(). Если javac жалуется на два public типа, public оставьте только у Card, а record Tag — без public.

Два компонента, два вывода

Оставьте тот же public класс Card. Расширьте record до двух компонентов:
record Tag(String name, int n) {}
Tag t = new Tag("oak", 3);
System.out.println(t.name());
System.out.println(t.n());
Снова скомпилируйте javac Card.java и запустите java Card. На экране oak, затем 3. У каждого компонента свой accessor с тем же именем. Порядок в заголовке совпадает с аргументами конструктора.

Card record Tag prints oak then 3

java
record Tag(String name, int n) {}

public class Card {
    public static void main(String[] args) {
        Tag t = new Tag("oak", 3);
        System.out.println(t.name());
        System.out.println(t.n());
    }
}

Пройдите запуск один раз. name() возвращает "oak". n() возвращает 3. Держите обе демонстрации как две учебные формы. Сначала докажите один компонент. Затем — два. Обе формы делят package-private record рядом с public Card.
Если поменять местами аргументы конструктора, значения попадут не в те компоненты. В учебном файле держите "oak" первым и 3 вторым.

Привычки record

Держите компактный заголовок и accessors вместе, пока тренируетесь.

📊 Привычки record для Card

Привычка Форма Проверка для начинающего
Объявление record Tag(String name) {} компоненты в заголовке
Создание new Tag("oak") аргументы в порядке компонентов
Чтение t.name() имя accessor совпадает с компонентом
Два поля record Tag(String name, int n) {} у каждого компонента свой accessor
Public класс public class Card запуск через java Card, не java Tag

Records — это не Streams и не JUnit

Streams фильтровал и преобразовывал значения списка в конвейере. Records хранят фиксированный набор компонентов в компактном типе. JUnit проверит поведение тестами на более поздней опциональной странице. Не смешивайте эти три роли в одном начальном файле сегодня.
oak здесь — значение компонента record, которое возвращает name(). Это не результат stream filter и не одиночный проход Lambda forEach. Если оставшийся файл Pipe всё ещё печатает отмапленные слова в верхнем регистре, считайте это историей и оставьте в Card строку t.name().
Без ключевого слова record компактный заголовок этой страницы исчезает. Без совпадающих аргументов конструктора javac отвергнет вызов. Держите заголовок и строку new согласованными на каждой демонстрации. Оставьте аннотации JUnit вне этой страницы до того урока, даже если вы уже видели заголовок про тесты на опциональном пути. Предпочитайте короткую форму record, чтобы экран оставался привязан к name() и n() при каждом внимательном чтении учебного файла.

Проверка папки перед JUnit

После успешной компиляции посмотрите папку. Рядом должны лежать Card.java и Card.class, обычно также Tag.class для record. Отредактируйте исходник, сохраните, выполните javac Card.java, затем java Card. Устаревший .class может показать старый однострочный экран, если пропустить compile после добавления n.
Если javac жалуется на дублирующиеся public классы, public оставьте только у Card. Если экран показывает Tag[oak] вместо oak, вы вывели весь record — в учебном print оставьте t.name(). Если ничего не печатается, убедитесь, что main всё ещё вызывает println.
Не вставляйте Pipe stream().map в Card. Не вставляйте Cue forEach вместо истории record. Опциональная работа records — компактный тип с accessors.

Перед опциональным JUnit

Вы можете оставить record Tag(String name) {}, создать new Tag("oak"), вывести t.name() как oak, затем использовать record Tag(String name, int n) {}, вывести oak и 3. Скомпилируйте javac Card.java и запустите java Card. Таблица отделяет объявление, создание и чтение. Следующая опциональная страница — JUnit.
Держите демо Card как ясную пару records. Держите файлы Pipe streams вне этой страницы, когда тренируете records. Держите lambda-файлы Cue вне этой страницы, когда тренируете records. Работу JUnit вне этой страницы до того урока. Эти привычки — контрольная точка перед продолжением. Когда экран с одним полем показывает oak или экран с двумя полями — oak затем 3, Records выполнил работу этого урока, и вы готовы к JUnit, если продолжите опциональный путь.
Последний проход по папке: один public Card, package-private record Tag, согласованные аргументы конструктора, вывод через accessors, без ожидания Scanner, без обязательного stream-конвейера. Ещё раз выполните javac Card.java и java Card на демо, которое держите открытым. Если экран всё ещё показывает oak или oak затем 3, форма Records прочна, и курс может перейти к опциональному JUnit на следующей странице. На каждое чтение — одна ясная привычка record, чтобы каждый проход учил той же карте.

🧠 Проверьте Свои Знания

Готов к Началу

Проверьте Свои Знания

Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему

❓
5
Вопросы
🎯
70%
Для Прохождения
♾️
∞
Время
🔄
∞
Попытки

📝 Инструкции

  • Внимательно прочитайте каждый вопрос
  • Выберите лучший ответ на каждый вопрос
  • Вы можете пересдавать тест столько раз, сколько захотите
  • Ваш прогресс будет показан вверху