Вы можете позвонить this.headers.clone()
, но вам нужно разыграть результат.Также это работает только в тех случаях, когда тип является клонируемым, и клон делает именно то, что вам нужно (например, в данном случае мелкий клон).
Кроме этого, нет возможности доступа к типу времени выполнения.(то, что вы называете типом экземпляра) this.headers
уже будет включать отражение.Однако я не стал бы воздерживаться от использования рефлексии только потому, что кто-то сказал, что она медленная.Не все отражающие операции выполняются медленно (например, я ожидаю, что вызов getClass()
для объекта будет довольно быстрым), и не все выполняемые вами операции будут влиять на производительность вашего приложения.Это зависит от гораздо большего количества факторов, т. Е. От того, как часто выполняется эта операция, насколько хорош оптимизатор и т. Д.
Проблема с отражением заключается в том, что нет общего способа создания конкретного типа.Если классу нужны аргументы конструктора, вам нужно знать, какие объекты передать конструктору.
Итак, подумайте об этом: Действительно ли вам нужно убедиться, что это точно такой же тип времени выполнения? Обычно это не так.Весь смысл программирования с использованием интерфейсов заключается в том, что обычно вам не нужно заботиться о реальном типе среды выполнения, а только о том, что он реализует правильный интерфейс (Map
здесь).Таким образом, геттер в его текущей форме будет в порядке, даже если в будущем тип времени выполнения this.headers
на самом деле будет TreeMap
.
Однако в этом конкретном случае я бы предложил совершенно другое решение.Я думаю, что нехорошо создавать копию всей коллекции при каждом вызове getResponseHeaders
(я бы предположил, что это намного дороже, чем, например, вызов рефлексивного метода).Вместо этого вы можете просто передать неизменяемое представление коллекции своему абоненту.При таком неизменяемом представлении вызывающая сторона не сможет изменить свою коллекцию, что обычно и требуется.Поэтому часто нет необходимости копировать всю коллекцию.
Это можно сделать очень легко, изменив метод получения на
return java.util.Collections.unmodifiableMap(this.headers);
Обратите внимание, что таким образом вызывающие абоненты будут видеть изменениякарта, если вы измените this.headers
после того, как getResponseHeaders
был вызван.