Скажем, я пишу метод, который должен возвращать Map. Например:
public Map<String, Integer> foo() {
return new HashMap<String, Integer>();
}
Подумав об этом некоторое время, я решил, что нет причины модифицировать эту карту после ее создания. Таким образом, я хотел бы вернуть ImmutableMap.
public Map<String, Integer> foo() {
return ImmutableMap.of();
}
Должен ли я оставить возвращаемый тип как общую карту, или я должен указать, что возвращаю ImmutableMap?
С одной стороны, именно поэтому были созданы интерфейсы; чтобы скрыть детали реализации.
С другой стороны, если я оставлю это так, другие разработчики могут упустить тот факт, что этот объект неизменен. Таким образом, я не стану достигать главной цели неизменяемых объектов; чтобы сделать код более понятным, минимизируя количество объектов, которые могут измениться. Даже хуже, через некоторое время кто-то может попытаться изменить этот объект, и это приведет к ошибке времени выполнения (компилятор не будет предупреждать об этом).