Sobes.tech
Senior

Implementieren Sie einen aufzählungstyp (enum), als ob es ihn vor dem Erscheinen des modernen Enums in Java 1.5 gegeben hätte. Es muss den Vertrag des modernen Java-Enums erfüllen: • Einfacher Zugriff auf jeden Enum-Wert • Sichere Vergleichsoperationen der Werte per Referenz (==) • Jeder Wert hat einen String-Namen, der mit dem Namen des Wertes übereinstimmt • Jeder Wert hat eine ganzzahlige `ordinal`-ID, die die Nummer des Wertes in der Reihenfolge seiner Deklaration im Enum enthält • Es ist möglich, eine Liste aller Enum-Werte zu erhalten • Es ist möglich, einen Wert anhand seines `ordinal` zu erhalten • Es ist möglich, einen Wert anhand seines Namens zu erhalten Als Beispiel kann eine Liste von Währungen genommen werden. Es ist wichtig, dass die Liste potenziell erweiterbar ist, da die Qualität des Codes bestimmt, wie problemlos zukünftige Hinzufügungen von Werten zum Enum erfolgen. class Currency { // TODO } --- Es wurde eine Tabelle user_orders bereitgestellt |ts|user_id|order_value| Für jeden Nutzer soll die Summe seines ersten Kaufs zurückgegeben werden.

sobes.tech KI

Antwort von AI

До появления enum в Java 1.5 можно было реализовать перечислимый тип с помощью класса и статических констант. Вот пример реализации класса Currency, который удовлетворяет перечисленным требованиям:

import java.util.*;

public class Currency {
    private static final List<Currency> VALUES = new ArrayList<>();
    private final String name;
    private final int ordinal;

    // Приватный конструктор
    private Currency(String name) {
        this.name = name;
        this.ordinal = VALUES.size();
        VALUES.add(this);
    }

    // Определение значений
    public static final Currency USD = new Currency("USD");
    public static final Currency EUR = new Currency("EUR");
    public static final Currency GBP = new Currency("GBP");

    // Получить имя
    public String name() {
        return name;
    }

    // Получить ordinal
    public int ordinal() {
        return ordinal;
    }

    // Получить все значения
    public static Currency[] values() {
        return VALUES.toArray(new Currency[0]);
    }

    // Получить по имени
    public static Currency valueOf(String name) {
        for (Currency c : VALUES) {
            if (c.name.equals(name)) {
                return c;
            }
        }
        throw new IllegalArgumentException("No enum constant Currency." + name);
    }

    @Override
    public String toString() {
        return name;
    }
}

Такой класс:

  • Хранит все значения в списке VALUES.
  • Присваивает каждому значению уникальный ordinal по порядку создания.
  • Позволяет получить все значения через метод values().
  • Позволяет получить значение по имени через valueOf(String).
  • Сравнение по ссылке работает, так как все значения — это статические константы.

Для SQL-запроса, чтобы для каждого пользователя получить сумму первой покупки из таблицы user_orders:

SELECT user_id, SUM(order_value) AS first_order_sum
FROM user_orders uo1
WHERE ts = (
    SELECT MIN(ts) FROM user_orders uo2 WHERE uo2.user_id = uo1.user_id
)
GROUP BY user_id;

Этот запрос находит минимальную дату покупки для каждого пользователя и суммирует значения заказов, сделанных в этот момент (если несколько заказов в одно время).