Автор оригинала: Pankaj Kumar.
В этом кратком руководстве мы поймем, как статические методы на интерфейсах помогают нам разрабатывать лучший код и поддерживать основной принцип проектирования: “Программа для интерфейса, а не реализация”. Вы можете найти основные сведения о статических методах в разделе Изменения интерфейса java 8 . Давайте начнем с программирования по принципу проектирования интерфейсов.
Программирование на Java для интерфейсов
В Java мы видели, как несколько классов коллекций следуют этим принципам, где конкретная реализация предоставляет только методы, которые они реализуют, из интерфейсов, оставляя остальную часть реализации в частных методах.
Проблема с программированием для реализации интерфейса
Давайте представим интерфейс СуперГерои
, который дает нам список персонажей.
public interface SuperHeros { public ListgetCharacters(); }
Существует множество студий комиксов, и каждая студия будет иметь свою собственную конкретную реализацию.
public class DCSuperHeros implements SuperHeros { Listcharacters = List.of("Super Man", "Bat Man", "Wonder Woman", "Cyborg", "Flash"); public List getCharacters() { return characters; } }
public class MarvelSuperHeros implements SuperHeros { Listcharacters = List.of("Spider Man", "Captain America", "Daredevil", "Wolverine", "Iron Man"); public List getCharacters() { return characters; } }
Клиенты/клиент будут использовать код, как показано ниже, для написания программы для интерфейсов.
SuperHeros marvelHeros = new MarvelSuperHeros(); SuperHeros dcHeros = new DCSuperHeros();
Это приводит к тому, что по своей сути связывает клиентский код с конкретной реализацией, а затем становится трудно изменить конкретные реализации позже, поскольку это уже было доступно клиентам.
Несмотря на то, что у нас есть интерфейсы, но мы предоставили заказчику конкретные детали реализации и нарушили принцип проектирования: Программа для интерфейса, а не реализация . Так как же нам это исправить и сделать лучше?
Статические методы Java 8 на интерфейсах
Java 8 привнесла много новых функций, и одна из них-статический метод в интерфейсах. Эта очень интересная и важная функция в основном игнорируется сообществом разработчиков.
Чтобы следовать нашему принципу проектирования, мы бы ввели статические методы, которые являются статическими фабриками, для создания экземпляра Конкретной реализации Супергероев. Давайте добавим статический метод в интерфейсы:
public interface SuperHeros { public ListgetCharacters(); static SuperHeros createDCSuperHeros() { return new DCSuperHeros(); } static SuperHeros createMarvelSuperHeros() { return new MarvelSuperHeros(); } }
Кроме того, сделайте ваши конкретные реализации непубличными. Теперь клиенты/клиент будут использовать код как:
SuperHeros marvelHeros = SuperHeros.createMarvelSuperHeros(); SuperHeros dcHeros = SuperHeros.createDCSuperHeros();
Теперь с помощью статических методов мы смогли написать статические фабрики для наших реализаций супергероев.
Ограничение : Этот подход может применяться только в том случае, если у вас есть контроль над интерфейсом, если это сторонний интерфейс, то он не будет работать, и вам лучше использовать общий подход.
Резюме
В этом кратком руководстве мы узнали, как программировать интерфейсы и как статический метод в интерфейсах помогает нам достичь этого.
И чтобы завершить, вы найдете исходный код этой статьи на Github .