Come definire uno snippet di codice in Java [chiuso]

2

So di static final equivalente a #define , ma non lo sto cercando

Ho usato #define REP(i,n) for(__typeof(n) i=0; i<(n); i++) in C ++ e dopo posso usare REP(i,10) invece di for(i=0; i<10; i++) nell'intero programma.

Ma c'è un modo per farlo in Java? Voglio una versione di #define REP(i,n) for(__typeof(n) i=0; i<(n); i++) in Java.

Lo provo con static final ma non riesco a capire.

    
posta Kaidul Islam 23.10.2012 - 13:25
fonte

3 risposte

6

Innanzitutto, static final è non uguale a #define . define usa il preprocessore C e aggira il codice facendo sostituzioni di testo prima che il compilatore veda il codice. Java non ha meccanismi come questo.

Invece static final è in realtà solo equivalente a static const in C ++. Significa semplicemente

  1. Esiste solo un'istanza di questo campo tra ogni istanza di questa classe
  2. Questo campo non cambierà mai.

Quindi per rispondere alla tua domanda, in java, non ci sono macro e quindi nessun modo diretto per fare quello che stai chiedendo.

Se è davvero un grosso problema, puoi utilizzare le funzioni di ordine superiore per fare ciò che stai chiedendo. La tua funzione dovrebbe essere:

void looper(int times, SomeInterface action){
    for(int i = 0; i<times; ++i)
        action.act(i);
    }
 }

Comunque penso che scoprirai che questo è eccessivo. Inoltre, questo perde molte importanti funzionalità che si desidera in un ciclo for, ad esempio la possibilità di uscirne a richiesta. La possibilità di modificare il contatore del ciclo o qualsiasi variabile che circonda il ciclo.

Sarebbe meglio fare affidamento sull'iterazione delle raccolte e per le situazioni in cui è effettivamente necessario utilizzare i numeri, prova a utilizzare una classe Range.

Java 8 (ogni volta che viene rilasciato) avrà delle chiusure, rendendo possibili molte di queste cose. Ma nel frattempo, temo che dovrai solo scriverlo.

    
risposta data 23.10.2012 - 13:33
fonte
3

No, non è possibile. Tuttavia nel tuo caso particolare non è nemmeno necessario.

Java è progettato intenzionalmente per non ridefinire nulla. Ciò rende più facile per i programmatori meno esperti la comprensione del codice e più facile per gli altri capire il codice che scrivono, perché le cose non possono essere ridefinite.

Il lato negativo è che rende il linguaggio molto meno flessibile, quindi dove un buon programmatore può rendere il codice avanzato ancora breve e leggibile in C ++, sarà inevitabilmente prolisso in Java.

Nel tuo caso particolare, però:

  • Non dovresti quasi mai ripetere l'intervallo di numeri. Iterate sulle raccolte. Questo è vero in qualsiasi lingua. C, C ++, Java, Python, qualunque cosa.
  • Java ha un ciclo per intervallo: for(ItemType i: collection)
  • Puoi creare una classe Range per iterare su un intervallo di numeri interi come: for(int i: new Range(0, 10)) . Non sembra essercene uno nella libreria standard, ma puoi provare uno dei tanti campioni che gira intorno alla rete .
risposta data 23.10.2012 - 13:37
fonte
3

Se sei un principiante con una lingua, dovresti imparare gli idiomi di quella lingua, non inventarne di tuoi.

Come sottolineato da @jozefg , le funzioni Java static final non equivalgono a #define macro in C / C ++. Funzionano in modi diversi e servono a scopi completamente diversi.

L'introduzione di una nuova sintassi arbitraria è garantita per far scappare qualsiasi sviluppatore che non abbia familiarità con il tuo codebase. Se vedo qualcosa di simile

for(int i = 0; i < 10; i++) {
  doSomethingNthTime(i);
}

allora so esattamente cosa significa. Se vedo:

REP(i, 10) { doSomethingNthTime(i); }

non è da nessuna parte ovvio. Di chi è questo rappresentante di cui stai parlando? E anche se so che per REP intendi "ripeti", quale intervallo esatto coprirà i ? Dovrò esaminare la dichiarazione macro per sapere, mentre con il semplice ciclo for la risposta è in bella vista.

Inoltre, for semplice consente cose che la tua macro REP non ha modo di esprimere. Che ne dici di quanto segue?

short i;
long j, k = 0;
for(i = 0, j = 16; i < 10; i++, j <<= 2) {
  doSomethingNthTime(i, j, &k);
}

o

int i;
for(i = 0; i < 16; i++) { ... }
i += values[z];
for(; i < 1024; i++) { ... }

Tali complesse espressioni di for (sebbene ovviamente con un corpo di loop più carnoso) non sono del tutto insolite nel codice di produzione e possono essere estremamente utili in alcune situazioni.

    
risposta data 23.10.2012 - 13:42
fonte

Leggi altre domande sui tag