2013-09-03 20 views
5

Mamy projekt Shared Utilities, dwa niezależne projekty SDK (każdy odnosi się do narzędzi) i kilka projektów wtyczek, z których każdy używa tylko jednego z tych pakietów SDK. Shared Utilities zawiera niektóre statyczne klasy, które muszą być widoczne dla wymienionych wtyczek, ale chcielibyśmy ukryć przed nimi pozostałe klasy.Ujawnianie metod statycznych za pomocą klas proxy

Jak możemy rozwiązać problem? Chcielibyśmy, aby proces budowania był tak prosty jak to tylko możliwe (używamy Anta do kompilacji) z najmniej możliwymi zależnościami.

Oto opcje jakie uważane do tej pory i dlaczego mamy odrzuca każde podejście:

  1. projektu Second Media współdzielone, które zostaną udostępnione do wtyczek - uczynią rozmieszczenie trudniejsze.
  2. Zbuduj 2 oddzielne .jar-s z projektu Shared Utils, z których jeden zawiera tylko narzędzia statyczne, a drugi - wszystko, co należy ukryć. Sprawiłoby to, że kompilacja byłaby bardziej złożona, tj. Dodatkowa zależność od skryptów kompilacji wtyczek.
  3. Proxy wszystkie klasy statyczne w każdym z pakietów SDK - zduplikowane definicje metod, ale implementacja po prostu wywołuje odpowiednią metodę statyczną z projektu współdzielonego - wydaje się najbardziej bezbolesna, wadą jest to, że musimy ręcznie skopiować Javadoc. Czy istnieje prosty tag Javadoc, który zrobiłby to automatycznie po wygenerowaniu?
  4. Konwertuj wszystkie klasy statyczne na "normalne" i po prostu utwórz podklasy w każdym pakiecie SDK - niepotrzebne (na myśl) obciążenie wydajnościowe.
+1

jaki masz narzut preformancji? – maks

+0

Musielibyśmy stworzyć nowy obiekt prawie za każdym razem, gdy potrzebujemy użyć jednej z tych metod - tak, tworzenie obiektów jest raczej tanie, ponieważ obiekt nie miałby żadnych właściwości, ale wciąż tam jest. Co więcej, kod byłby "brzydszy" i trudniejszy do odczytania. Już potrafię sobie wyobrazić ludzi drapiących się głowami w taki kod. :) –

+1

Jeśli są to klasy użytkowe, jakie metody próbujesz ukryć? Wygląda na to, że potrzebujesz osobnych projektów "Utilities". Zaimportuj oba do projektów SDK i tylko ten z bardziej publicznymi metodami do wtyczek. – JohnMark13

Odpowiedz

0

„Odsłanianie metody statyczne poprzez zajęcia proxy” Czytałem kompletnego pytanie i nie jestem pewien, jaki jest twój problem dokładnie. Wyeksponowanie metody statycznej (niezwiązanej z instancją) za pośrednictwem serwera proxy (instancji).

Co nie będzie ukrywać przed tym, co dokładnie. Co chcesz ujawnić do czego dokładnie.

public class A { 

private A(){} //prevent instanciation 

public static void doSomething(){} //want to expose to some class, hide from other 

} 

Aby ograniczyć ekspozycję doSomething można ustawić widoczność: Controlling Access to Members of a Class.

Można również usunąć statyczny charakter i użyć statycznego fabryczny wzór do zwrotu przedmiotu takiego:

public class A { 

private A(){} 

public void doSomething(){} //want to expose to some class, hide from other 

//the new A can also be set in a member variable and 
//return always the same instance, if it is unmuttable it will be thread safe. 
public static A getInstance(){ return new A();} 

} 

To może wyglądać jak „samo”, ale można teraz kontrolować widoczność wszystkich metod w A kontrolując jedynie widoczność getInstance(), javadoc pozostaje na A, aby kontrolować dokładnie, w jaki sposób getInstance może uzyskać dostęp ... Musiałbym dokładnie zrozumieć, co chcesz zrobić.

Powiązane problemy