Senior
Implémenter un type énuméré (enum) comme s'il existait avant l'apparition de l'enum moderne en Java 1.5. Il faut respecter le contrat de l'enum moderne de Java : • accéder facilement à n'importe quelle valeur de l'enum • comparaison sûre des valeurs par référence (==) • chaque valeur a un nom de chaîne correspondant au nom de la valeur • chaque valeur a un identifiant entier `ordinal`, qui contient le numéro de la valeur dans l'ordre de déclaration dans l'enum • il est possible d'obtenir une liste de toutes les valeurs de l'enum • il est possible d'obtenir une valeur par son `ordinal` • il est possible d'obtenir une valeur par son nom Pour l'exemple, on peut prendre une liste de devises. Il est important que la liste soit potentiellement extensible, car la qualité du code déterminera à quel point l'ajout de valeurs à l'enum sera sans problème à l'avenir. class Currency { // TODO } --- Une table user_orders est fournie |ts|user_id|order_value| Pour chaque utilisateur, retourner la somme de son premier achat.
sobes.tech IA
Réponse de l'IA
До появления 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;
Этот запрос находит минимальную дату покупки для каждого пользователя и суммирует значения заказов, сделанных в этот момент (если несколько заказов в одно время).