2013-05-20 9 views
29

Dlaczego powinniśmy zadeklarować interfejs wewnątrz klasy w Javie?Dlaczego powinniśmy zadeklarować interfejs wewnątrz klasy?

Na przykład

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

Zależy od tego, co chcesz zrobić. – johnchen902

Odpowiedz

25

Aby zebrać niektóre pola w obiekcie w celu podkreślenia pojęcia, można utworzyć klasę zewnętrzną lub wewnętrzną (nazywaną zagnieżdżoną (statyczną) lub wewnętrzną).

Jeśli chcesz podkreślić fakt, że ta wspóldzielna klasa nie ma sensu (nie ma zastosowania) poza oryginalnym użyciem obiektu, możesz uczynić ją zagnieżdżoną/wewnętrzną.

Tak więc, w przypadku niektórych hierarchii, można opisać "zagnieżdżony" interface, który zostanie zaimplementowany przez podklasy klasy zawijania.

W JDK, najbardziej znaczącym przykładem byłoby Map.Entry wewnętrzny interfejs zdefiniowany w Map interfejsu i wdrażane przez różne sposoby przez HashMap, LinkedHashMap etc ...

I oczywiście Map.Entry musiał być zadeklarowany jako public aby być dostępnym podczas iteracji mapy, gdziekolwiek jest kod.

+2

Miej sens. Dzięki –

2

to wewnętrzny interfejs. Język programowania Java pozwala definiować klasy wewnętrzne i interfejsy. Jest to zazwyczaj przydatne, jeśli chcesz ograniczyć widoczność tej klasy lub interfejsu według zakresu obecnej klasy zewnętrznej.

Niektórzy ludzie używają tego mechanizmu do tworzenia przestrzeni nazw. IMHO jest to nadużycie funkcji językowej (w większości przypadków).

+0

Ale interfejs jest publiczny, więc czy ten cel został tutaj osiągnięty? –

+0

Publiczne, ale pod główną klasą, więc tak naprawdę nie jest publiczne. IMPLEMENTY nie zadziałają, ponieważ potrzebują super interfejsu, a nie interfejsu pod klasą (po prostu miałem do czynienia z tym problemem w aplikacji Spring) –

+0

@ChaibiAlaa, Prawdopodobnie miałeś problem ze Spring, ponieważ twoja wewnętrzna klasa/initerface jest nie zadeklarowane jako publiczne. – AlexR

9

Jeśli definicja interfejsu jest mała, a interfejs będzie używany tylko przez klientów klasy, w której jest zdefiniowany, jest to dobry sposób na uporządkowanie kodu. W przeciwnym razie interfejs powinien zostać zdefiniowany we własnym pliku.

+0

Brzmi nieźle. :) Dzięki! – MrBCut

1

Wewnątrz klasy możesz potrzebować wielu implementacji interfejsu, który dotyczy tylko tej konkretnej klasy. W takim przypadku należy utworzyć wewnętrzny interfejs, a nie publiczny/pakietowy prywatny.
Tylko interfejs wewnątrz klasy może być zadeklarowany jako prywatny lub chroniony. Czasami ma to sens, gdy interfejs jest odpowiedni tylko do użytku wewnątrz zewnętrznej klasy (lub jej podklas).

1

Enkapsulowanie zachowania w sposób ogólny i użyteczny.

Oprócz ładnego przykładu Map.Entry używanego przez Map klasy implementacji innym dobrym przykładem jest implementacja Strategy Pattern, w której strategia wykonania jest oceniana i stosowana wewnętrznie.

class Test 
{ 

.. 
interface Cipher { 
doAction(); 
} 
class RAMPCipher implements Cipher{} 
class DiskCipher implements Cipher{} 
.. 
} 
Powiązane problemy