Итоги — Обобщенный контейнер
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 58 из 87.
Задание
ЛегкоДавайте создадим универсальную систему хранения, которая объединит все, что вы узнали о дженериках! Вы создадите класс Container, который может хранить, извлекать и обрабатывать элементы любого типа, а также вспомогательные методы, демонстрирующие работу вайлдкардов (wildcards).
Вы организуете свой код в трех файлах:
Container.java: Создайте универсальный классContainer<T>, который управляет коллекцией элементов. Ваш контейнер должен использоватьArrayList<T>внутри для хранения элементов. Включите методыadd(T item)для добавления элемента,get(int index)для извлечения элемента в определенной позиции,size()для возврата количества элементов иisEmpty()для проверки, пуст ли контейнер. Также добавьте методgetAll(), который возвращает внутренний список.ContainerUtils.java: Создайте вспомогательный класс со статическими универсальными методами для работы с вашими контейнерами:printAll(Container<?> container)— использует неограниченный вайлдкард для вывода всех элементов в любом контейнере, по одному в строке.countItems(Container<? extends Number> container)— использует вайлдкард с верхней границей для вычисления суммы всех числовых значений в контейнере, возвращая результат в видеdouble.addDefaults(Container<? super Integer> container)— использует вайлдкард с нижней границей для добавления целых чисел 1, 2 и 3 в любой контейнер, который может хранить целые числа.<T> T getLastOrDefault(Container<T> container, T defaultValue)— универсальный метод, который возвращает последний элемент в контейнере или значение по умолчанию, если контейнер пуст.Main.java: Объедините вашу универсальную систему контейнеров! Вы получите три входных значения: слово (String), целое число (int) и число с плавающей точкой (double).Сначала создайте
Container<String>и добавьте в него слово дважды. Выведите"String container:", затем используйтеprintAllдля отображения его содержимого.Затем создайте
Container<Double>и добавьте в него значение double. Выведите пустую строку, затем"Number sum: "вместе с результатомcountItems.Затем создайте
Container<Number>и вызовите для негоaddDefaults. Выведите пустую строку, затем"After adding defaults:"и используйтеprintAllдля отображения содержимого.Наконец, создайте пустой
Container<Integer>и используйтеgetLastOrDefaultс вашим целочисленным вводом в качестве значения по умолчанию. Выведите пустую строку, затем"Last or default: "с полученным результатом.
Вы получите три входных значения по порядку: слово (String), целое число и число с плавающей точкой (double).
Эта задача сочетает в себе универсальные классы, универсальные методы, ограниченные параметры типов и все три типа вайлдкардов. Обратите внимание, как каждая часть служит своей цели: универсальный класс обеспечивает типизированное хранение, ограниченные вайлдкарды позволяют гибко читать и записывать данные, а универсальные методы предлагают многократно используемые операции для различных типов контейнеров!
Попробуйте сами
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Чтение входных данных
String word = scanner.nextLine();
int intValue = Integer.parseInt(scanner.nextLine());
double doubleValue = Double.parseDouble(scanner.nextLine());
// TODO: Создайте Container<String> и добавьте слово дважды
// Выведите "String container:", затем используйте ContainerUtils.printAll()
// TODO: Создайте Container<Double> и добавьте значение double
// Выведите пустую строку, затем "Number sum: [sum]", используя ContainerUtils.countItems()
// TODO: Создайте Container<Number> и вызовите для него ContainerUtils.addDefaults()
// Выведите пустую строку, затем "After adding defaults:" и используйте ContainerUtils.printAll()
// TODO: Создайте пустой Container<Integer>
// Используйте ContainerUtils.getLastOrDefault() с intValue в качестве значения по умолчанию
// Выведите пустую строку, затем "Last or default: [result]"
}
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово finalИтоги — Менеджер банковского счета5Полиморфизм
Основы перегрузки методовПереопределение методов (Run-Time)Upcasting и DowncastingОператор instanceofАбстрактные классы и методыИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияАгрегация против композицииВнутренние, вложенные и анонимные классыEnums и методы перечисленийRecords (Java 16+)Sealed-классы (Java 17+)11Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy3Свойства класса и статические члены
Переменные экземпляра и статические переменныеСтатические методыСтатические блокиКонстанты (static final)Итоги: Счетчик и утилиты6Интерфейсы и абстрактные классы
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовDefault и Static методы в интерфейсахАбстрактные классы vs ИнтерфейсыФункциональные интерфейсыИтоги — Платежная система9Обобщения
Введение в обобщенияОбобщенные классыОбобщенные методыОграниченные параметры типаСимволы подстановки (Wildcards: ?, extends, super)Итоги — Обобщенный контейнер12Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»