2015-08-26 3 views
5

В каком сценарии у интерфейса есть вложенные классы?Где полезно иметь вложенные классы в интерфейсе?

Следующий код разрешен и действителен.

public interface Iface { 

    void show(); 

    class ifaceClass { 
     int x; 

     public ifaceClass() { 
      System.out.println(x); 
     } 
    } 
} 

Я также стараюсь сделать объект класса ifaceClass.

EDIT:

Я могу сделать объект как этот

public class Test implements Iface {  

    public static void main(String[] args){ 
     ifaceClass ifaceClassObj = new ifaceClass(); 
    } 

    public void show() {  

    } 
} 

я заметил, если Test не реализовал Iface я нуждался импортируют,

import com.jls.Iface.ifaceClass; 

Но он сводился к той же проблеме, что и не использовать ее как просто другой класс.

Какая разница или добавление стоимости при таком подходе?

+0

Всякий раз, когда вы хотите убедиться, что классы, реализующие ваш интерфейс, имеют доступ к указанному классу с определенной реализацией. – Stultuske

+2

Вы имеете в виду, где это * полезно *? Интерфейс может * всегда * иметь вложенные классы ... –

+0

@Jon Skeet. да, где это полезно. –

ответ

2

Где полезно иметь вложенные классы в интерфейсе?

Там нет такого случая, который может быть выполнен только с внутреннего классом интерфейса. Синтаксически справедливо иметь внутренний класс в интерфейсе, а для класса, который реализует интерфейс, может создать экземпляр класса, и кроме того, что Interface.Class также может сделать этот класс доступным, поскольку он не может быть private.

Я заметил, если тест не реализовал Iface тогда мне нужно было импортируют import com.jls.Iface.ifaceClass;

Не обязательно, если ваш интерфейс доступен ваш внутренний класс автоматически становится accessible.Here вы пытаетесь получить доступ класс напрямую, даже не импортируя interface, в этом случае следующая инструкция требует инструкции импорта.

ifaceClass ifaceClassObj = new ifaceClass(); 

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

Ровно, создавая еще один класс также может предоставить вам тот же объект, и я никогда не видел ни одного прецедента в моем повседневное программирование, которые могут быть выполнены только с внутренним классом интерфейса. Он не обеспечивает ничего, кроме доступности через интерфейс.

Я использовал его как-то, что я думаю довольно плохой практике. Однажды нам нужно реализовать один общий метод в разных классах, которые реализуют интерфейс, например X, и мы хотели добавить один дополнительный метод, который будет использоваться всеми этими классами, чтобы добавить один вид проверки на Object, который проверяет только некоторый параметр и возвращает boolean даже если этот случай использования может быть выполнен иным образом, но будет определенно, что он предназначен только для классов, которые реализуют этот интерфейс, мы добавили класс в интерфейс, чтобы мы могли предоставить этот метод для реализации классов. (Примечание: В настоящее время по умолчанию методы могут быть использованы в этом случае вместо внутреннего класса)

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

3

Вы можете создать экземпляр ifaceClass внутри класса, который реализует Iface:

interface Iface { 
    void show(); 
    class ifaceClass { 
     int x; 
     public ifaceClass() { 
      System.out.println(x); 
     } 
    } 
} 

public class Test implements Iface { 

    public static void main(String args[]) { 
     ifaceClass iface = new ifaceClass(); 
    } 

    @Override 
    public void show() { 
     // ... 
    } 
} 

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

Iface.ifaceClass iface = new Iface.ifaceClass(); 

Почему создать класс внутри интерфейса? В основном по той же причине вы создаете класс внутри другого класса, чтобы группировать связанные классы вместе.