Есть ли какое-либо использование интерфейса (в 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 finals в классе интерфейса тоже. Они используются для уточнения и детализации почти до чрезмерного уровня того, что вы можете и не можете делать с объектами этого типа.

Таким образом, вы правы... до такой степени... что interface это просто стандартизация ожидания, но небольшое исследование покажет вам, что стандартизация ожидания - это широкая и глубокая тема, достойная некоторых невероятно сложных interfaces.

У Java есть ограничение по дизайну в наследовании (т.е. множественное наследование). Таким образом, вы не можете расширять более одного класса, но вы можете реализовать столько интерфейсов, сколько захотите.

Второе преимущество использования интерфейсов в Java связано с дизайном и производительностью приложения. Для любого приложения требуется быть "слабо связанным" и "очень связным". Здесь интерфейсы входят в картину. Интерфейсы реализуют контракт между классами и, следовательно, дизайн становится слабосвязанным.

Надеюсь, это будет полезно.

Другие вопросы по тегам