В чем суть задания по 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 шт):

Автор решения: Nowhere Man

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

Также класс хранилища следует объявить как финальный (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);
→ Ссылка