2012-10-17 13 views
5

Buduję bardzo prostą bibliotekę w Javie, która zostanie spakowana w jednym słoiku. Powinien eksponować tylko jedną klasę: Świat. Klasa World używa podklas klasy Block, która znajduje się w tym samym pakiecie (com.yannbane.a) i nie zapewnia dużej liczby funkcji, ale musi zostać rozszerzona. Planowałem stworzyć kolejną paczkę, com.yannbane.a.blocks, która miałaby wszystkie typy bloków (podklasy).Pakiety i klasy Java

Struktura katalogu/pakiet powinny do nich wyglądać następująco: w porządku dla podklas Bloku rzeczywiście rozszerzyć klasę Zablokuj, potrzebowałem

com/ 
    yannbane/ 
     a/ 
      World.java 
      Block.java 

      blocks/ 
       Brick.java 
       Stone.java 

Jednak aby klasę Zablokuj public. To niszczy mój cel polegający na tym, że plik Jar przedstawia tylko jedną klasę, Świat. Muszę również udostępnić podklasy publicznie, aby świat mógł z nich korzystać.

Jak mogę zachować tę strukturę paczek i katalogów, ale nadal mam Jar tylko eksponować klasę światową, a nie inne?

+0

* Dlaczego * trzeba udostępnić podklasy? To nie jest jasne ... –

+0

czy możesz zablokować wewnętrzną klasę dla świata, która jest prywatna i niedostępna z zewnątrz? – amphibient

+1

Jeśli wszystko, co zamierzasz ujawnić, to klasa światowa, dlaczego ma znaczenie, gdzie znajdują się inne klasy. Równie dobrze mogą znajdować się w tej samej paczce, a Ty nie masz takich problemów. Nie sądzisz? –

Odpowiedz

3

Jeśli jest to kwestia enkapsulacji, a wszystko, co chcesz eksponować światu, to klasa "Światowa", to nie ma znaczenia, czy nieeksponowane klasy znajdują się w tym samym pakiecie, czy też są klasami wewnętrznymi. ten sam pakiet.

W każdym razie nie będą dostępne dla użytkowników Twojego API. Uważam, że enkapsulacja jest ważniejsza niż "logiczna" organizacja, którą chcesz przekazać swoim plikom. Ponieważ jeśli zlokalizujesz wszystkie klasy w tym samym pakiecie, nie będziesz miał tych problemów i osiągniesz poziom enkapsulacji, którego szukasz. Być może to, co mówi Java, jest takie, że te klasy są ze sobą nieodłącznie związane, że powinieneś umieścić je wszystkie w tym samym pakiecie.

1

Utwórz klasy public, ale ich konstruktorzy protected.

Wciąż technicznie eksponujesz klasy - inne pakiety są ich świadome - ale żadne inne pakiety nie mogą utworzyć tych obiektów.

Chociaż Block podklasy są w innym opakowaniu z Block (com.yannbane.a i com.yannbane.blocks) będą w stanie wywołać chroniony konstruktor nadrzędną, ponieważ protected członkowie są dostępne z tego samego pakietu lub z obiektu dziedziczenia.