От старого экзамена без решения:
Учитывая этот код....
import java.util.*;
public class AClass {
private int f(List<Integer> list){
int i = 0;
//Something useful
return i;
}
public int g() {
List<Integer> myList = new LinkedList<Integer>();
return f(myList);
}
}
Обратите внимание, что метод f
является полиморфным, т.е. Ему может быть передана любая реализация интерфейса List. С другой стороны, метод g
не является. Поскольку он myList
объект myList
, он не может этого сделать, не зная его типа. Следовательно, он не может быть полиморфным. Наш код содержит много методов, страдающих одной и той же проблемой. Мы стремимся сделать наш код полиморфным.
Свободная связь Существует много способов решить эту проблему среди них: программа для интерфейсов и применение инъекции зависимостей
Метод g()
тесно связан с LinkedList
потому что метод явно создает экземпляр этого объекта, который, следовательно, является жестким для этого класса. Если вы хотите, например, использовать ArrayList
вам нужно открыть класс и явно изменить метод и потенциально ввести ошибки. Кроме того, вам, вероятно, придется пройти тестирование и документацию. С другой стороны, метод f()
является более гибким, поскольку вы можете просто передать нужную вам коллекцию, а метод не имеет понятия о конкретной реализации, которую вы передаете, тем самым закрывая ваш метод.
По-видимому, решением в этом случае было бы создание Abstract Factory Pattern
.
Например, мы должны создать новый класс под названием AClassCreator
и создать метод createAClass(List<?> list)
где параметр является подклассом списка.
Consequently, it cannot be polymorphic. Our code contains many methods suffering from the same problem. We aim to make our code polymorphic.
Что ты имеешь в виду? Просьба привести примеры. Единственный способ сделать этот код более универсальным - использовать Collection
или Iterable
вместо List
, но я бы сказал, что это избыток в терминах свободной связи.
List
), а не конкретную реализацию (LinkedList
,ArrayList
т. Д.). Вместо этого вы всегда можете использовать класс позже, если вам нужно использовать методы, специфичные для него, которые не были определены в интерфейсе.