Domanda

Non intendo gli errori di compilazione perché ho commesso un errore di sintassi o altro.In C++ possiamo creare errori in fase di compilazione in base a condizioni come nell'esempio seguente:

template<int> struct CompileTimeError;
template<> struct CompileTimeError<true> {};

#define STATIC_CHECK(expr, msg) { CompileTimeError<((expr) != 0)> ERROR_##msg; (void)ERROR_##msg; }

int main(int argc, char* argv[])
{
    STATIC_CHECK(false, Compile_Time_Failure);
    return 0;
}

In VS 2005 verrà prodotto:

------ Build started: Project: Test, Configuration: Debug Win32 ------
Compiling...
Test.cpp
f:\temp\test\test\test.cpp(17) : error C2079: 'ERROR_Compile_Time_Failure' uses undefined struct 'CompileTimeError<__formal>'
        with
        [
            __formal=0
        ]
Build log was saved at "file://f:\temp\Test\Test\Debug\BuildLog.htm"
Test - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

C'è un modo per raggiungere questo obiettivo in Java?

È stato utile?

Soluzione

Non c'è modo di farlo in Java, non nello stesso modo in cui funziona in C++.

Potresti forse usare le annotazioni ed eseguire adatto prima o dopo la compilazione per controllare le tue annotazioni.

Per esempio:

@MyStaticCheck(false, "Compile Time Error, kind-of")
public static void main(String[] args) {
    return;
}

E poi scrivi il tuo AnnotationProcessorFactory che ha cercato le annotazioni @MyStaticCheck e fa qualcosa con gli argomenti.

Nota:Non ho giocato molto con apt, ma dalla documentazione sembra che sia fattibile.

Altri suggerimenti

Non è possibile produrre azioni basate sulla logica in fase di compilazione in Java senza l'uso di uno strumento separato.Tecnicamente lo è possibile per utilizzare il preprocessore C su Java, ma dovresti stare attento ai suoi presupposti incorporati sul linguaggio sottostante.Se fossi in te, troverei un modo migliore per realizzare qualunque cosa tu stia cercando di fare con questo errore in fase di compilazione.Se necessario, potresti anche scrivere il tuo preprocessore (possibilmente usando APP) se è davvero così inevitabile.

Come ha risposto Matt Quail sopra, annotazioni, insieme a XDoclet, sono adatti a soddisfare le vostre esigenze.Queste combinazioni consentono un bel po' di preelaborazione, generazione di codice, ecc.

Sebbene la domanda sia stata posta qualche tempo fa, ho deciso di pubblicare la mia risposta, perché ho risolto (in una certa misura) un problema leggermente simile.

Lo specifico del mio compito richiede che due applicazioni con set di funzioni diverse siano create da un'unica libreria principale (e materiale inutilizzato da non collegare).La selezione del set di funzioni viene effettuata da public static final boolean bandiere.Il problema è che voglio garantire che ciascuna delle applicazioni sia costruita con un flag appropriato impostato nella libreria principale.E nel caso in cui siano abilitate funzioni improprie, l'applicazione non dovrebbe essere compilata dando un errore in fase di compilazione.

L'unica soluzione che ho trovato finora è dichiarare nella libreria le variabili finali insieme ai flag: public static final int functionSet1 = 0;, eccetera.

Nel pacchetto dell'applicazione ho aggiunto una classe fittizia con il checkup

ConditionalBuild.functionSet1 = 1;

Di tutte le variabili functionSetX solo una è stata resa non finale in una build specifica.Quindi solo un'applicazione può superare il processo di compilazione senza l'errore.Esiste un modo migliore per raggiungere questo obiettivo?Per favore fatemelo sapere nei commenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top