2013-07-29 11 views
6

Niedawno (4 dni temu) rozpocząłem programowanie w JAVA. Mam ogólne doświadczenie w programowaniu w C++ i PHP. Moje pytanie brzmi: czy możemy zaimplementować funkcję w JAVA, która jest dostępna we wszystkich klasach? Zastanawiam się nad jakąś funkcją globalnego logowania, którą muszę wywołać w kilku miejscach (rejestrować zdarzenia, błędy itp.).Funkcja (metoda) Java dostępna wszędzie (globalna)

Wyobraź sobie, że mam dwie klasy, A i B. Muszę zadzwonić do funkcji logowania w obu z nich, ale nie chcę kopiować całego ciała funkcji (okropne, w co wierzę), i chcę to nazwać ścisłym (bez tworzenia innej klasy, tworzenia instancji, a następnie wywoływania z instancji), np. logEvent(someVariable). Powinienem więc użyć abstrakcyjnej klasy C, którą rozciągną A i B, ALE są już rozszerzeniem innej klasy (wbudowanej). Ponieważ dziedziczenie wielokrotne jest niedozwolone (czyż nie?), Muszę zrobić jakąś sztuczkę. Singleton też mnie nie cieszy. W PHP lub C++ po prostu utworzę osobny plik z treścią funkcji, a następnie dołączę go.

Oto jak chcę go używać:

public class A extends SomeClass { 
    String error = "Error from class A"; 
    logEvent(error); 
} 

public class B extends SomeOtherClass { 
    String error = "Error from class B"; 
    logEvent(error); 
} 
+0

Można przeczytać o złu 'Singleton' wzorca. –

+3

@LeeMeador "evil" to kwestia opinii. – hexafraction

Odpowiedz

26

Put metody statyczne w każdej klasie (może to być klasa utils, lub cokolwiek), a następnie nazwać tak: ClassName.functionName()

Metody statyczne należą do klasy, a nie do instancji klasy, więc nie trzeba tworzyć instancji klasy, aby uzyskać dostęp do metody. Jednak wszystko w Javie musi znajdować się w klasie, więc nie można uzyskać do niej dostępu bez nazwa klasy.

+1

Możesz także użyć metody statycznej, która zwróci pojedynczą dozwoloną instancję klasy, jeśli nie lubisz metod statycznych. Utwórz konstruktor klasy jako prywatny i zachowaj jedną instancję w polu statycznym. –

+4

Można również użyć statycznego importu, aby można było użyć metody statycznej bez kwalifikowania jej nazwą klasy w każdej witrynie użytkowania. – DaoWen

+0

@Dao Dobra sprawa, zapomniałem o tej funkcji Java. Aby uzyskać więcej informacji: http://docs.oracle.com/javase/1.5.0/docs/guide/language/static-import.html Należy jednak pamiętać, że import statyczny jest nieco przestraszony, dlatego można go łatwo nadużywać. Nie wydaje mi się, że wpisywanie nazwy klasy za każdym razem jest bardzo ważne, a kod jest czysty. –

0

Możesz używać metody statycznej.

Zdefiniuj klasę z metodą statyczną:

public class Util{ 
    public static void logEvent(String error){ 
     ... 
    } 
} 

Następnie można użyć Metod statycznej jak w ten sposób:

public class A extends SomeClass { 
    String error = "Error from class A"; 
    Util.logEvent(error); 
} 

można spojrzeć tutaj, aby dowiedzieć się więcej na temat metody statycznej, http://www.leepoint.net/notes-java/flow/methods/50static-methods.html

+0

Wiem o statycznych metodach, ale chciałbym uniknąć pisania nazwy klasy za każdym razem, kiedy ich używam (po 20 lub 50 połączeniach może to być frustrujące :)). Ale mogę zrobić import statyczny jako @DaoWen, o którym mowa powyżej. – Mars

6

należy użyć metody statycznej:

package xxx; 

public class Util{ 
    public static void logEvent(String error){ 
    ... 
    } 
} 

i import static:

import static xxx.Util.*; 

public class A extends SomeClass { 
    String error = "Error from class A"; 
    logEvent(error); 
} 
+0

Dzięki, tego właśnie szukałem! Nigdy wcześniej nie widziałem "importuj statyczne". – BadCash

+0

Zgadzam się, pracował również dla mnie. Dziękuję Ci bardzo – hershkoy