2012-01-29 24 views
7

Sto tentando di inizializzare una classe statica, con un argomento, quindi eseguire un altro codice statico in quella classe.
Sono a conoscenza del blocco static, ma sembra che non possa accettare alcun argomento.
C'è un modo per passare argomenti a un costruttore statico?
In caso contrario, qual è la tecnica consigliata per inizializzare una classe statica utilizzando un argomento?Passare argomenti a un costruttore statico in Java?

Edit: Una classe statica per la mia comprensione è una classe che non può essere un'istanza (in C# si chiamano classi statiche, se Java ha un termine diverso per loro, mi dispiace di non essere a conoscenza di esso) - è accessibile tramite il suo nome di classe piuttosto che il nome di un oggetto.

Quello che sto cercando di ottenere (molto semplificato) è una classe che riceve un dizionario come String, lo analizza e ha metodi di manipolarlo come GetRandomEntry.

Ecco un frammento di codice elaborato del mio codice:

public class QuestionsRepository { 
private static Map<String,String[]> easyDefinitions = new HashMap<String,String[]>(); 

//... 

static  
    { 
    // need to receive and parse dictionary here  
    } 
//... 

Prendendo le parti pertinenti di un frammento di codice non è mai facile, spero di aver scelto con saggezza (:
Un altro dettaglio che possa essere rilevante - Sono aC# programmatore, di solito. appena iniziato l'apprendimento di Java ultimamente.

Grazie.

+1

Questo si sta dirigendo nella direzione sbagliata. Qualche ragione particolare non puoi semplicemente usare un normale costruttore in una classe non statica? –

+2

Che cos'è una 'classe statica' nella tua comprensione? –

+0

Un esempio di codice permetterà alle persone di capire meglio la tua domanda e il contesto. –

risposta

12

Penso che avresti bisogno di inizializzare i campi statici della classe secondo alcuni input. Si può fare nel modo seguente chiamando il metodo statico di un'altra classe:

class ClassToInitialize { 
    static { 
     staticField = ParamPassClass.getParameter(); 
    } 

    private static String staticField; 

    ClassToInitialize() { 
     System.out.println("This is the parameter: " + staticField); 
    } 

} 

class ParamPassClass { 
    private static String parameter; 
    static String getParameter() { 
     return parameter; 
    } 

    static void setParameter(String parameter) { 
     ParamPassClass.parameter = parameter; 
    } 
} 

class Main { 
    public static void main(String args[]) { 
     ParamPassClass.setParameter("Test param"); 
     new ClassToInitialize(); 
    } 
} 
+0

Quindi avrò una classe solo per tenere il parametro? Sembra intelligente ma un po 'imbarazzante, d'altra parte, se questo è l'unico modo per andare .. (?) –

+0

.. E soprattutto, è garantito che il blocco statico di ClassToInitialize verrà eseguito dopo SetParameter? –

+0

Ciò non significa che devi mantenere un oggetto solo per mantenere il parametro, ma è proprio come, puoi chiamare un metodo 'static' direttamente per passare il valore, quasi come passare il parametro. un oggetto all'interno del blocco statico e ottenere th Il valore del parametro come richiesto. Dipende dal tuo uso e design. –

2

Java non ha costruttori statici. ha solo inizializzatori statici e inizializzatori statici non richiede alcun argomento. e ' viene eseguito quando la classe viene caricata per la prima volta e non c'è modo di chiamarla tu stesso.

È necessario utilizzare oggetti reali o aggiungere un modo di configurare la classe (ad esempio tramite un metodo statico).

1

si dovrebbe parlare dei membri della classe con un qualificatore statica, altrimenti non c'è una tale cosa come una classe statica Here è possibile trovare la spiegazione di usare la parola 'statica' in questo contesto.

Ora dovresti chiamare il suo costruttore e passare tutti gli argomenti che vuoi, l'unica restrizione che hai su una classe membro statica è che non può riferire i campi non statici della sua classe esterna, assomiglia un metodo statico sulla classe che non può riferire i campi non statici della classe.

Non ho capito perché parli di un blocco di inizializzazione statico qui, potresti chiarire un po '? Essere consapevoli, inoltre, che in Java non esiste una cosa del genere costruttore come statico ....

Spero che questo aiuti

+0

vuoi dire che una classe senza un modificatore statico e un costruttore anche senza un modificatore statico, sono entrambi statici in Java di default? (ha modificato la domanda btw, per renderla più chiara) –

0

Si può avere un metodo statico public static void setUp(Arg1 arg1, Arg2 arg2...) che imposta tutte le static campi e invocare quando il tuo il programma inizia.

È necessario assicurarsi che questo metodo sarà chiamato una sola volta [o solo quando si desidera ripristinare questi campi]

+0

Ma come farò in modo che il metodo venga eseguito PRIMA del mio altro codice statico? Ci scusiamo per il ritardo, ma si prega di fare riferimento alla mia modifica. Grazie (: –

+0

@ORenA: puoi aggiungere un flag di privage, che sarà initalizzato a 'false' in un blocco statico, e sarà impostato a' true' quando 'setUp()' è attivato. la bandiera e lancia un 'IllegalStateException' se è falso.Sono d'accordo che questa soluzione non è la migliore, è solo un po 'difficile da inizializzare con i parametri ... – amit

0

Non è possibile passare gli argomenti direttamente ai inizializza statici (JLS:static initializers).

Sarebbe bello poter condividere più informazioni sui tuoi obiettivi.

0

Si potrebbe utilizzare un enum per inizializzare un Singleton con un parametro di stringa come questo

import java.util.*; 
class Data { 
    static Map<String,String[]> easyDefinitions = new HashMap<String,String[]>(); 
} 
public enum QuestionsRepository 
{ 
    repository("primary=red,green,blue;secondary=cyan,yellow,magenta"); 
    QuestionsRepository(String dictionary) { 
     String[] rules = dictionary.split(";"); 
     for (String rule:rules) { 
      String[] keyValuePair = rule.split("=",2); 
      Data.easyDefinitions.put(keyValuePair[0],keyValuePair[1].split(",")); 
     } 
    } 
} 
Problemi correlati