Pytanie Funkcja (metoda) Java dostępna wszędzie (globalnie)


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.).

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 funkcyjnego (okropne, w co wierzę) i chcę to nazwać ścisłym (bez tworzenia kolejnego klasa, tworzenie instancji, a następnie wywoływanie 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żyć:

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);
}

9
2017-07-29 21:29


pochodzenie


Możesz przeczytać o złu Singleton wzór. - Lee Meador
@LeeMeador "evil" to kwestia opinii. - Andrey Akhmetov


Odpowiedzi:


Umieść statyczną metodę w dowolnej klasie (może to być klasa utils lub cokolwiek innego), a następnie nazwij ją 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

Ale wszystko w Javie musi znajdować się w klasie, więc nie można uzyskać do niego dostępu bez nazwy klasy.


28
2017-07-29 21:31



Możesz także użyć metody statycznej, która zwraca pojedynczą dozwoloną instancję klasy, jeśli nie lubisz metod statycznych. Utwórz konstruktor klasy jako prywatny i zachowaj jedną instancję w polu statycznym. - Lee Meador
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
@ 4,0 Dobra uwaga, zapomniałem o tej funkcji Javy. Po więcej informacji: docs.oracle.com/javase/1.5.0/docs/guide/language/...  Ale pamiętajmy, że import statyczny jest nieco zaniedbany, 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. - Vyassa Baratham
Ok. To jest do przyjęcia, ale teraz muszę zrobić dodatkowy import: D. Ale z mojego punktu widzenia jest to lepsze, niż pisanie z wyprzedzeniem Class. każdego razu. Miałem nadzieję, że jest lepsze rozwiązanie, ale po długich poszukiwaniach nie mogłem go znaleźć. Dzięki za odpowiedzi :) - Mars
Czy są jakieś plusy i minusy tej metody? - NOT_A_PROGRAMMER


Powinieneś użyć metody statycznej:

package xxx;

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

i importuj statyczne:

import static xxx.Util.*;

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

7
2017-11-04 14:11



Dzięki, właśnie tego szukałem! Nigdy wcześniej nie widziałem "importuj statyczne". - BadCash
Zgadzam się, pracował również dla mnie. Dziękuję Ci bardzo - justadev


Możesz użyć metody statycznej.

Zdefiniuj klasę metodą statyczną:

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

Następnie możesz użyć metody statycznej w następujący sposób:

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

możesz zajrzeć tutaj, aby dowiedzieć się więcej o metodzie statycznej, http://www.leepoint.net/notes-java/flow/methods/50static-methods.html


0
2017-07-29 21:41



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 wymienione powyżej. - Mars