2009-07-20 19 views
9

Ho un array di Java:soluzione Java per C++ direttiva stile compilatore

String[] myArray = {"1", "2"}; 

A seconda di una condizione che è noto al momento della compilazione vorrei assegnare valori diversi:

String[] myArray = {"A", "B", "C"}; 

In C++ Vorrei usare qualcosa come

#ifdef ABC 
    // ABC stuff here 
#else 
    // 123 stuff here 
#endif 

ma cosa fare in Java?

+1

Non sono sicuro, ma penso che sia possibile passare tali cose alla jvm usando '-Dname = value' e quindi usare' System.getProperty' per ottenere il valore di 'name'. –

+0

p.s. Benvenuto in SO! – jjnguy

risposta

13
class Foo { 

    static final boolean ABC = true; 

    public void someMehod() { 
     if (ABC) { // #ifdef ABC 

     } else { // #else 

     }   // #endif 
    } 
} 

poiché ABC è sia statico che definitivo, il compilatore lo valuta al momento della compilazione, agendo efficacemente come un pre-processore.

+4

Usa l'idea di libt dai commenti. usa System.getProperty ("...") per assegnare ABC. –

1
String[] myArray; 

if (ABC) 
myArray = ... 
else 
myArray = ... 

ABC è una variabile finale statica, JVM è necessaria per il controllo delle condizioni in linea.

3

In Java è necessario farlo in fase di esecuzione.

String[] myArray; 
if (something) 
    myArray = new String[]{"A", "B"}; 
else 
    myArray = new String[]{"A", "B, "C"} 

questo sta per essere il più simile al codice C++. E, se la tua condizione è garantita per essere vera in fase di compilazione, Java ottimizzerà la chiamata.

Ci sono altre opzioni disponibili, ma non assomigliano a una versione C++.

+0

Grazie, funzionerà sicuramente - il compilatore ottimizzerà la parte else se "qualcosa" è sempre vero ?? –

+1

In realtà si. Se hai quel qualcosa così è sempre vero, ottimizzerà il 'if' – jjnguy

+0

(E molto più chiaramente scritto rispetto alla versione di stepancheg) –

1

Un approccio consiste nel ricreare un file Constants.java nella prima fase del tuo script di build (formica, salvatore o qualsiasi altra cosa tu usi). A seconda di quanto sia complesso quel file, puoi farlo manualmente o usare qualcosa di più pesante come Velocity.

Ho usato qualcosa di simile in passato per inserire la versione e creare informazioni all'interno delle classi java.

1

Utilizzare un motore di template (qualcosa come Velocity) per eseguire un passo di pre-elaborazione. Lo script di build potrebbe eseguire il modello applicando le proprietà dall'ambiente di generazione per generare il codice sorgente Java che viene infine compilato. Questo è, in sostanza, cosa fanno i preprocessori C/C++.

La mia ipotesi è che qualcuno abbia già codificato un compito ant per farlo, ma sono troppo pigro per Google per te.

1

Se si utilizza una var/const come una direttiva di compilazione personalizzata in Java, non renderla definitiva. Potresti ricevere molti avvertimenti a causa delle condizioni "sempre vere" e roba del genere.

public static boolean ABC = true; // or false 
+1

Punto giusto per gli avvertimenti, ma se non si dispone di tale variabile essere finale, il compilatore non può ottimizzare il blocco if/else. – sharakan

0

Non si può davvero farlo ... il modo migliore sarebbe quella di utilizzare un motore di template ... anche alcuni compilatori metterà il codice nel file di classe di fine - quelli meglio sarebbe rimuovere il codice se non è richiesto ... È necessario rendere definitive le costanti e inoltre è necessario impostarle su un valore assoluto affinché il compilatore possa rimuovere il codice.

public static final boolean ABC = true // This will be enough for the compiler to remove code 

public static final boolean ABC = [any method call] // This is not enough to work and will leave the code in there 

Anche in questo caso, alcuni compilatori possono ancora mettere il codice in là, anche se non è raggiungibile (è per questo che alcuni IDE vi avvertirà che il codice non è raggiungibile in modo di rimuovere il codice che non è necessario)

Tuttavia,

Le direttive sono cattive e molto probabilmente è necessario utilizzare un'implementazione di un'interfaccia invece di una direttiva! utile per la codifica di basso livello quando necessario (per ridurre al minimo la memoria del footprint) - alcuni dispositivi speciali come i pacemaker e simili, ma perché dovresti usarli in java?