Powiedzmy, że piszę metodę, która powinna zwrócić Map . Na przykład:
public Map<String, Integer> foo() {
return new HashMap<String, Integer>();
}
Po chwili zastanowienia zdecydowałem, że nie ma powodu, aby modyfikować tę mapę po jej utworzeniu. Dlatego chciałbym zwrócić ImmutableMap .
public Map<String, Integer> foo() {
return ImmutableMap.of();
}
Czy powinienem pozostawić zwracany typ jako mapę ogólną, czy powinienem określić, że zwracam ImmutableMap?
Z jednej strony, właśnie po to stworzono interfejsy; aby ukryć szczegóły implementacji.
Z drugiej strony, jeśli zostawię to w ten sposób, inni programiści mogą przegapić fakt, że ten obiekt jest niezmienny. Dlatego nie osiągnę głównego celu, jakim są niezmienne obiekty; aby uczynić kod bardziej przejrzystym, minimalizując liczbę obiektów, które mogą się zmieniać. Co gorsza, po chwili ktoś może spróbować zmienić ten obiekt, a to spowoduje błąd w czasie wykonywania (kompilator nie ostrzeże o tym).