2013-07-29 5 views
6

Ho recentemente (4 giorni fa) iniziato a programmare in JAVA. Ho una certa esperienza di programmazione generale da C++ e PHP. La mia domanda è: possiamo implementare una funzione in JAVA, che è disponibile in tutte le classi? Sto pensando ad alcune funzioni di logging globale, che devo chiamare in diversi posti (eventi di registro, errori, ecc.).Funzione Java (metodo) disponibile ovunque (globale)

Immaginate di avere due classi, A e B. Ho bisogno di chiamare la funzione di registrazione in entrambi, ma non voglio copiare tutto il corpo della funzione (cosa terribile credo), e voglio chiamarlo rigorosamente (senza creare un'altra classe, creando un'istanza e quindi chiamando dall'istanza), ad esempio logEvent(someVariable). Quindi dovrei usare una classe astratta C, che A e B si estenderanno, ma sono già un'estensione di un'altra classe (built-in). Dal momento che non è consentita l'ereditarietà multipla (vero?), Ho bisogno di fare qualche trucco. Singleton non mi piace anche a me. In PHP o C++ vorrei semplicemente creare un file separato con il corpo della funzione e quindi includerlo.

Ecco come voglio usarlo:

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

Si può leggere sul male 'Singleton' modello. –

+3

@LeeMeador "male" è una questione di opinione. – hexafraction

risposta

26

mettere un metodo statico in ogni classe (che potrebbe essere una classe utils, o qualsiasi altra cosa), quindi chiamare in questo modo: ClassName.functionName()

I metodi statici appartengono alla classe, non alle istanze della classe, quindi non è necessario istanziare la classe per accedere al metodo

Ma tutto in Java deve essere in una classe, quindi non è possibile accedervi senza il nome della classe.

+1

Puoi anche avere un metodo statico che restituisce la singola istanza consentita della classe se non ti piacciono i metodi statici. Rendi privato il costruttore della classe e mantieni l'istanza in un campo statico. –

+4

È inoltre possibile utilizzare un'importazione statica in modo da poter utilizzare il metodo statico senza qualificarlo con il nome della classe in ciascun sito di utilizzo. – DaoWen

+0

@ goodDao, ho dimenticato questa caratteristica di Java. Per maggiori informazioni: http://docs.oracle.com/javase/1.5.0/docs/guide/language/static-import.html Ma tenere a mente le importazioni statiche sono in qualche modo disapprovate, possono essere facilmente abusate. Non penso che dover digitare il nome della classe ogni volta sia un grosso problema e mantiene il codice pulito. –

0

È possibile utilizzare il metodo statico.

Definire una classe con un metodo statico:

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

Quindi, è possibile utilizzare Metod statico come in questo modo:

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

si può dare uno sguardo qui per saperne di più su metodo statico, http://www.leepoint.net/notes-java/flow/methods/50static-methods.html

+0

Conosco metodi statici, ma vorrei evitare di scrivere il nome della classe ogni volta che li uso (dopo 20 o 50 chiamate potrebbe essere frustrante :)). Ma io posso fare l'importazione statica come @DaoWhen dichiarato sopra. – Mars

6

Si consiglia di utilizzare il metodo statico:

package xxx; 

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

e l'importazione statica:

import static xxx.Util.*; 

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

Grazie, questo era proprio quello che stavo cercando! Mai visto "import statico" prima. – BadCash

+0

Sono d'accordo anche per me. Grazie mille – hershkoy