Какая польза от создания класса внутри интерфейса и интерфейса внутри класса - PullRequest
25 голосов
/ 09 мая 2011

Я хочу знать, для чего нужно размещать класс внутри интерфейса и интерфейс внутри класса?

class A {
   interface B {}
}

interface D {
   class E {}
} 

Ответы [ 5 ]

21 голосов
/ 09 мая 2011

Это я копирую и вставляю из какой-то ссылки (я раньше делал и делился с вами) Может быть, это может немного помочь вам.

1)

interface employee{
class Role{
      public String rolename;
      public int roleId;
 }
Role getRole();
// other methods
 }

В приведенном выше интерфейсе вы строго привязываете тип роли к интерфейсу сотрудника (employee.Role). 2) Со статическим классом внутри интерфейса у вас есть возможность сократить общий фрагмент программирования: проверка, является ли объект экземпляром интерфейса, и, если это так, вызов метода этого интерфейса. Посмотрите на этот пример:

  public interface Printable {
    void print();

    public static class Caller {
        public static void print(Object mightBePrintable) {
                if (mightBePrintable instanceof Printable) {
                        ((Printable) mightBePrintable).print();
                }
        }
    }
}

Теперь вместо этого:

  void genericPrintMethod(Object obj) {
    if (obj instanceof Printable) {
        ((Printable) obj).print();
    }
}

Вы можете написать:

   void genericPrintMethod(Object obj) {
         Printable.Caller.print(obj);
    }
5 голосов
/ 09 мая 2011

Организация.

Указание класса внутри интерфейса связывает этот класс непосредственно с этим интерфейсом - клиенты, использующие этот интерфейс, будут иметь доступ к этому классу и ко всем функциям, которые он предоставляет.

Я видел шаблон класса внутри интерфейса, действительно только в Java 1.4 и ниже, чтобы обеспечить перечислимый тип для взаимодействия с интерфейсом - поскольку интерфейс может использовать только класс, и класс может быть защищен, клиенты, которые используютинтерфейс может принимать только экземпляры класса, определенного в интерфейсе, в качестве перечисляемых значений.Это единственный пример, который я могу придумать - я уверен, что другие существуют, но редко я вижу класс внутри используемого интерфейса.

Для перевернутого случая это все еще организация.Указание интерфейса внутри класса означает, что только этот класс должен использовать интерфейс.То, что другие классы и интерфейсы могут все еще использовать этот интерфейс, в зависимости от его уровня доступа, не имеет значения - организация документирует намерение интерфейса - использоваться только в классе, который его содержит.

Если этополезен за пределами этого класса, его следует соответствующим образом переместить в его собственный тип.Таким образом, оба эти использования редки, но они в основном используются для организации кода и документирования его намерений напрямую через синтаксис Java.

3 голосов
/ 30 мая 2016

Если функциональность класса тесно связана с интерфейсом, и мы не собираемся использовать этот класс где-либо, мы можем определить класс внутри интерфейса.

package PracticeTest;

public interface VehicleService {
   public void repair(Vehicle v);
   public class Vehicle{
      String vehicleModel;
      String vehicleNumber;
      public Vehicle(String vehicleModel, String vehicleNumber) {
      super();
      this.vehicleModel = vehicleModel;
      this.vehicleNumber = vehicleNumber;
      }

   }
}

В указанном выше случае класс Vehicle доступен для VehicleService, и мы не используем его где-либо еще.

  1. Чтобы обеспечить реализацию интерфейса по умолчанию, мы можем определить класс внутри интерфейса

Интерфейс

package PracticeTest;

public interface VehicleService {
public void repair();
public class DefaultVehicle implements VehicleService{

    @Override
    public void repair() {          
        System.out.println(" Default Repair");
    }
}

Класс реализации

 package PracticeTest;
 public class busRepair implements VehicleService{

   @Override
   public void repair() {
       System.out.println(" Bus Repair");
   }
   public static void main(String args[]){
        busRepair b = new busRepair();
        b.repair();
        DefaultVehicle d = new DefaultVehicle();
        d.repair();
    }
 }
1 голос
/ 17 апреля 2013

Если какая-либо функциональность класса тесно связана с каким-либо интерфейсом в этой ситуации, мы объявляем класс внутри интерфейса.

Иногда полезно также обеспечить реализацию по умолчанию абстрактного метода внутри интерфейса.

0 голосов
/ 05 февраля 2016

создание класса внутри интерфейса позволяет программисту иметь ограничения на класс, т. Е. Этот внутренний класс доступен только в том случае, если мы реализуем этот интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...