В данном классе есть несколько проблем и потенциальных улучшений:
public class Accumulator {
В данном классе есть несколько проблем и потенциальных улучшений:
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
public class Accumulator {
private Map<String, Object> data = new HashMap<>(); // текущий набор данных
private List<Map<String, Object>> dataList = new ArrayList<>(); // пачка с данными
private Map<Instant, String> responses = new HashMap<>(); // ответы сервера, принимающего данные
private int dataId;
/**
* Добавляет поле field со значением value в набор
*/
public void add(String field, String value) {
data.put(field, value);
}
/**
* Возвращает значение по названию поля field
*/
public <T> T get(String field) {
return (T) data.get(field);
}
/**
* Возвращает ответы сервера принимающего данные
*/
public String getResponses() {
String out = "";
for (String resp : responses.values()) {
out += "; " + resp;
}
return out;
}
/**
* Завершает сборку текущего набора данных и отправляет его в пачку
*/
public synchronized void push() {
dataList.add(data);
if (dataList.size() == 100) {
send();
dataList.clear();
}
data = new HashMap<>();
data.put("id", dataId++);
}
/**
* Отправляет пачку на сервер принимающий данные
*/
private void send() {
RestTemplate restTemplate = new RestTemplate();
HttpEntity<List<Map<String, Object>>> request = new HttpEntity<>(dataList);
String url = "localhost:20808/msg/incoming";
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, request, String.class);
responses.put(Instant.now(), response.getBody());
}
}
Ответ
В данном классе есть несколько проблем и потенциальных улучшений:
- Метод send() использует HTTP GET для отправки данных в теле запроса, что не соответствует стандартам HTTP. Для отправки данных следует использовать POST.
- RestTemplate создается заново при каждом вызове send(), что неэффективно. Лучше создать один экземпляр и переиспользовать.
- В методе getResponses() конкатенация строк через += в цикле неэффективна, лучше использовать StringBuilder.
- В методе push() поле "id" добавляется в новый data после очистки, но dataId не инициализирован явно, что может привести к проблемам.
- Отсутствует обработка ошибок при отправке данных.
Пример исправленного метода send():
private final RestTemplate restTemplate = new RestTemplate();
private void send() {
HttpEntity<List<Map<String, Object>>> request = new HttpEntity<>(dataList);
String url = "http://localhost:20808/msg/incoming";
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, request, String.class);
responses.put(Instant.now(), response.getBody());
}
Также стоит добавить обработку исключений и инициализацию dataId в конструкторе.
Таким образом, класс аккумулирует данные в пачки по 100 элементов и отправляет их на сервер, сохраняя ответы с временными метками.