В чем суть задания по java ооп
задание звучит так:
Без null. Создайте сущность Хранилище, которая обладает следующими характеристиками:
- Может хранить один произвольный объект в один момент времени.
- Хранилище неизменяемо.
- Объект кладется в Хранилище при его создании. В качестве объекта может быть сохранено также и значение null.
- Хранилище может вернуть ссылку на Объект.
- Если вместо объекта хранится null, необходимо вернуть какое-либо альтернативное значение.
- Метод получения значения должен работать с тем типом данных, который был указан во время создания объекта Выполните следующие задания:
- Создайте Хранилище чисел, положите туда значение null. Передайте Хранилище в какой- либо метод, извлеките значение, и выведите его на экран. Альтернативой должно быть число 0.
- Создайте Хранилище чисел, положите туда значение 99. Передайте Хранилище в какой- либо метод, извлеките значение, и выведите его на экран. Альтернативой должно быть число -1.
- Создайте Хранилище строк, положите туда значение null. Передайте Хранилище в какой- либо метод, извлеките значение, и выведите его на экран. Альтернативой должна быть строка “default”.
- Создайте Хранилище строк, положите туда значение “hello”. Передайте Хранилище в какой-либо метод, извлеките значение, и выведите его на экран. Альтернативой должна быть строка “hello world”.
моя реализация:
public class Storage<T> {
private final T item; // Хранимый объект
private final T alternative; // Альтернативное значение
// Конструктор хранилища
public Storage(T item, T alternative) {
this.item = item;
this.alternative = alternative;
}
// Метод получения объекта из хранилища
public T get() {
return item != null ? item : alternative;
}
}
public class Main {
public static void main(String[] args) {
// Пример 1: Хранилище чисел с null и альтернативой 0
Storage<Integer> storageWithNullNumber = new Storage<>(null, 0);
processStorage(storageWithNullNumber); // Ожидается вывод 0
// Пример 2: Хранилище чисел со значением 99 и альтернативой -1
Storage<Integer> storageWithNumber = new Storage<>(99, -1);
processStorage(storageWithNumber); // Ожидается вывод 99
// Пример 3: Хранилище строк с null и альтернативой "default"
Storage<String> storageWithNullString = new Storage<>(null, "default");
processStorage(storageWithNullString); // Ожидается вывод "default"
// Пример 4: Хранилище строк со значением "hello" и альтернативой "hello world"
Storage<String> storageWithString = new Storage<>("hello", "hello world");
processStorage(storageWithString); // Ожидается вывод "hello"
}
// Универсальный метод обработки хранилища
public static <T> void processStorage(Storage<T> storage) {
System.out.println("Извлеченное значение: " + storage.get());
}
}
Вроде похоже на правду, но я не знаю зачем передавать альтернативное значение, если передаем в хранилище hello, оно же не равно 0, и то же самое для 99 в чем суть задания, может я не правильно делаю
Ответы (1 шт):
Формально, представленная реализация хранилища отличается от задания тем, что она содержит два поля вместо одного. То есть, нужно оставить одно поле в соответствии с заданием, тогда логику выбора объекта для хранения следует реализовать в конструкторе, а не в геттере.
Также класс хранилища следует объявить как финальный (final), чтобы он был неизменяемым.
Дополнительно, можно проверить, что альтернативное значение не содержит null, использовав Objects.requireNonNull (или аннотацию @NonNull).
С учётом вышесказанного, код можно исправить следующим образом:
import static java.util.Objects.requireNonNull;
// Неизменяемый класс
public final class Storage<T> {
// @NonNull
private final T item;
// Конструктор хранилища
public Storage(T item, T alternative) {
this.item = null != item
? item
: requireNonNull(alternative, "alternative must be not null");
}
// Упрощенный метод получения объекта из хранилища
public T get() {
return this.item;
}
}
Возможен вариант реализации с использованием Optional и функции, которая будет возвращать альтернативное значение:
import static java.util.Objects.requireNonNull;
import static java.util.Optional.ofNullable;
import java.util.function.Supplier;
public final class StorageOpt<T> {
private final T item;
public StorageOpt(T item, Supplier<T> alternative) {
this.item = requireNonNull(
ofNullable(item).orElseGet(alternative),
"Non-null value has to be stored"
);
}
public T get() {
return item;
}
}
// хранилище, принимающее функцию, которая вернёт альтернативное значение
StorageOpt<Integer> storageWithNumber = new StorageOpt<>(99, () -> -1);