Java · 43 строк
RatesCache отдаёт курсы для экрана обмена валюты. rate и convert вызываются из 200 потоков веб-сервера, refresh — из планировщика раз в минуту. Источник курсов отвечает за 150–400 мс.
Отметьте строки с ошибками.
В работе: Экран обмена валюты в мобильном банке.
Как проверяем
Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 1 вопрос про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
Источник: на задачах Альфа-Банка: обмен валюты в приложении. Условие пересказано своими словами.
Давали на собеседовании?
Ответов пока мало — ваш поможет.
import java.math.BigDecimal;import java.math.RoundingMode;import java.util.HashMap;import java.util.Map;public class RatesCache {private static Map<String, BigDecimal> rates;private final RatesClient client;public RatesCache(RatesClient client) {this.client = client;}public BigDecimal rate(String currency) {if (rates == null) {synchronized (RatesCache.class) {if (rates == null) {rates = new HashMap<>();rates.putAll(client.fetchAll());}}}return rates.get(currency);}// Планировщик вызывает раз в минуту.public void refresh() {synchronized (RatesCache.class) {rates.clear();rates.putAll(client.fetchAll());}}// Сколько валюты получит клиент за сумму в рублях.public BigDecimal convert(BigDecimal amountRub, String currency) {return amountRub.divide(rate(currency), 2, RoundingMode.HALF_UP);}}interface RatesClient {Map<String, BigDecimal> fetchAll();}