2013-05-20 4 views
29

Почему мы должны объявлять интерфейс внутри класса в Java?Почему мы должны объявлять интерфейс внутри класса?

Например:

public class GenericModelLinker implements IModelLinker { 

    private static final Logger LOG =LoggerFactory.getLogger(GenericModelLinker.class); 
    private String joinAsPropertyField; 
    private boolean joinAsListEntry; 
    private boolean clearList; 
    private List<Link> joins; 

    //instead of a scalar property 
    private String uniqueProperty; 

    public interface Link { 

    Object getProperty(IAdaptable n); 

    void setProperty(IAdaptable n, Object value); 

    } 
} 
+4

В зависимости от того, что вы хотите сделать. – johnchen902

ответ

25

Если вы хотите собрать некоторые поля в объекте, чтобы подчеркнуть концепцию, вы можете либо создать внешний класс, либо внутренний (называемый либо вложенным (статическим), либо внутренним).

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

Таким образом, имея дело с некоторой иерархией, вы можете описать «вложенный» interface, который будет реализован подклассами класса упаковки.

В JDK, наиболее показательным примером будет Map.Entry внутренний интерфейс, определенный в Map интерфейс и реализованы различными способами HashMap, LinkedHashMap и т.д ...

И, конечно же, Map.Entry, необходимых для быть объявлены как public чтобы быть доступным при повторении карты везде, где находится код.

+2

Имеют смысл. благодаря –

2

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

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

+0

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

+0

Публичный, но под основным классом, так что не публично. IMPLEMENTS не будут работать, так как им нужен супер, чтобы быть интерфейсом, а не интерфейсом под классом (я просто столкнулся с этой проблемой в приложении Spring). –

+0

@ChaibiAlaa. У вас, вероятно, была проблема с Spring, потому что ваш внутренний класс/initerface не объявляется публичным. – AlexR

9

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

+0

Звучит неплохо. :) Благодаря! – MrBCut

1

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

1

Чтобы инкапсулировать поведение в общий и resuable образом.

Помимо хорошего примера Map.Entry, используемого классами Map, еще одним хорошим примером является реализация Strategy Pattern, где стратегия исполнения оценивается и применяется внутренне.

class Test 
{ 

.. 
interface Cipher { 
doAction(); 
} 
class RAMPCipher implements Cipher{} 
class DiskCipher implements Cipher{} 
.. 
} 
Смежные вопросы