Есть ли какое-либо использование интерфейса (в Java), кроме стандартизации ожидания?
Я новичок в Java и изучения интерфейсов. Я не понимал использование интерфейсов, кроме как стандартизировать ожидания.
Если есть какие-либо другие применения, пожалуйста, помогите мне понять это.
5 ответов
Интерфейсы имеют несколько хороших применений:
Полиморфизм
Они позволяют одинаково обрабатывать несколько разных, но похожих объектов. Например:
public interface Flyer {
public void fly();
}
public class Bird implements Flyer {
@Override
public void fly() {
System.out.println("I'm flying");
}
}
public class Airplane implements Flyer {
@Override
public void fly() {
System.out.println("I'm inanimate and flying");
}
}
// then you can have a method like so:
public void makeFly(Flyer flyer) {
flyer.fly();
}
// or make a list like so:
List<Flyer> fliers = Arrays.asList(new Airplane(), new Bird());
Они также позволяют Объектам помещаться в несколько разных блоков. Например, Bird
не только летает, но это Animal
, Интерфейсы позволяют лечить Bird
как либо один:
public interface Animal {
public void move();
}
public class Bird implements Flyer, Animal {
@Override
public void fly() {
System.out.println("I'm flying");
}
@Override
public void move() {
fly();
}
}
// now I can do:
Bird bird = new Bird();
Flyer flyer = new Bird();
Animal animal = new Bird();
Отделенный дизайн
Кроме того, они дают вам гибкость в выборе вашей реализации. (Я не уверен, что вы подразумеваете под "Стандартизацией ожиданий", но это использование, вероятно, больше всего связано со стандартизацией. Т.е. это работает, потому что это создает стандарт.) Например, скажем, у меня есть метод, который возвращает List<Flyer>
, поскольку List
это интерфейс, я могу выбрать использование ArrayList
, LinkedList
и т. д. как моя реализация:
public List<Flyer> makeFlyerList() {
return new ArrayList<Flyer>(Arrays.asList(new Airplane(), new Bird()));
}
// works just the same
public List<Flyer> makeFlyerList() {
return new LinkedList<Flyer>(Arrays.asList(new Airplane(), new Bird()));
}
Еще один случай, который приходит мне в голову - это функциональность маркера.
java.lang.Cloneable
например, не имеет никакого объявления метода, он используется только для пометки класса, который реализуется как клонируемый класс.
Из документации:
Класс реализует интерфейс Cloneable, чтобы указать методу Object.clone(), что для этого метода допустимо делать копию поля для поля экземпляров этого класса.
Еще один образец того же использования можно увидеть в Serializable
Интерфейсы - это способ объявить контракт на реализацию классов для выполнения; это основной инструмент для создания абстракций и разрозненных дизайнов между потребителями и производителями.
Да, но я бы возражал против слова "просто".
Помните, что вы можете определять не только абстрактные методы, но и все виды другого багажа, который идет с expectation
,
Например, обратите внимание, что в интерфейсе Map есть внутренний интерфейс Map.Entry. Здесь мы видим не только то, что вы можете ожидать от карты, но и много подробностей о некоторых вещах, которые вы можете ожидать от Map
такие как их Entries
,
Хотя вы не найдете много примеров в java API, в реальном программировании есть много случаев, когда у вас будет большое количество enum
и / или public static final
s в классе интерфейса тоже. Они используются для уточнения и детализации почти до чрезмерного уровня того, что вы можете и не можете делать с объектами этого типа.
Таким образом, вы правы... до такой степени... что interface
это просто стандартизация ожидания, но небольшое исследование покажет вам, что стандартизация ожидания - это широкая и глубокая тема, достойная некоторых невероятно сложных interface
s.
У Java есть ограничение по дизайну в наследовании (т.е. множественное наследование). Таким образом, вы не можете расширять более одного класса, но вы можете реализовать столько интерфейсов, сколько захотите.
Второе преимущество использования интерфейсов в Java связано с дизайном и производительностью приложения. Для любого приложения требуется быть "слабо связанным" и "очень связным". Здесь интерфейсы входят в картину. Интерфейсы реализуют контракт между классами и, следовательно, дизайн становится слабосвязанным.
Надеюсь, это будет полезно.