Java-Äquivalent von #ifdef, das nicht kompilierbaren Code erlaubt

8

Ist es in Java möglich, eine Art #ifdef-Sache zu machen, wie in C / C ++?

Beispiel:

%Vor%

Beachten Sie, dass, auch wenn ANDROID false ist, wie im Beispiel immer noch versucht wird, den Code innerhalb von if zu kompilieren, obwohl er nicht kompiliert wird (und nicht kompiliert werden sollte) / p>

Ich suche nach einer Möglichkeit, bedingte Kompilierung durchzuführen - der Compiler sollte nicht einmal am if sehen, wenn ANDROID ist false .

Der Kontext meiner Frage ist, dass ich eine Verarbeitungsanwendung in Eclipse habe. Ich benutze beide normale Verarbeitung und Verarbeitung für Android in zwei separaten Projekten, aber ich möchte in der Lage sein, den Quellcode der Projekte untereinander ohne Compilerfehler zu verschieben. Ich möchte zum Beispiel Quellcode-Dateien haben, die ich vom Android-Projekt in das Desktop-Projekt verschieben kann und nur einige Dinge ändern muss - zum Beispiel ANDROID = true in ANDROID = false ändern.

Ich brauche wirklich eine bedingte Kompilierung, denn wenn ich den Quellcode vom Android-Projekt in das Desktop-Projekt kopiere, werden die Desktop-Bibliotheken offensichtlich keine Android-Bibliotheken enthalten, und dann wird der Quellcode nicht einmal kompiliert / p>

EDIT: Da ich jetzt weiß, dass es in Java keinen Präprozessor gibt, ist meine Frage: Gibt es eine andere Möglichkeit, diese Funktionalität in meinen Projekten zu haben (in der Lage, Quellcode von einem zum anderen nur sehr geringfügig zu kopieren) Änderungen vornehmen, ohne bestimmte Codeabschnitte manuell [un] kommentieren zu müssen und sich merken zu müssen, wo diese sind?

EDIT 2: Dies ist kein Duplikat der anderen Frage, weil meine Frage Code enthält, der Compiler-Fehler enthalten kann, während die Frage, dass dies als Duplikat geschlossen wurde, dies nicht tut. (Diese andere Frage betrifft nur Code, der auch ohne #ifdef s kompiliert würde.) Um zu erklären, spricht die am besten bewertete (und akzeptierte) Antwort für die andere Frage über Code, der kompiliert ist, aber wird einfach nicht im Bytecode emittiert . Meine Frage betrifft jedoch Code, der nicht einmal ursprünglich kompiliert werden würde.

    
Jashaszun 30.10.2013, 13:51
quelle

5 Antworten

2

Wie andere gesagt haben, ist die Antwort auf Ihre eigentliche Frage nein.

Sie können jedoch Ihr Problem angehen, indem Sie den Android- oder Desktop-Code isolieren. Sie können dies tun, indem Sie drei separate Projekte in Eclipse haben:

  • Core: Dies ist der "geteilte" Code, der zwischen beiden Versionen existiert.
  • Android: Enthält nur den Code, der auf Android läuft.
  • Desktop: Dieser enthält nur den Code, der auf dem Desktop ausgeführt wird.

Sowohl Ihre Android- als auch Ihre Desktop-Projekte enthalten das Core-Projekt in ihren Klassenpfaden. In Eclipse würden Sie dies tun, indem Sie zu Ihrem Java-Build-Pfad gehen, dann auf die Registerkarte Projekte klicken und dann das Core-Projekt zur Liste "Erforderliche Projekte" hinzufügen.

Dann würden Sie Ihren Code so einrichten, dass Ihre Android- und Desktop-Projekte tatsächlich bereitgestellt werden, und Ihr Core-Projekt enthält den Code, der zwischen ihnen geteilt wird. Hier ist ein einfaches Beispiel. Nehmen wir an, wir haben eine Beispielklasse, die folgendermaßen aussieht:

%Vor%

Sie könnten dies umgehen, indem Sie Ihren Code umgestalten, um den "Kern" -Code zu isolieren, der sowohl auf dem Desktop als auch auf Android funktioniert. Etwas wie das:

%Vor%

Dann würden Sie den Code isolieren, der nur auf dem Desktop funktioniert:

%Vor%

Und der Code, der nur mit Android funktioniert:

%Vor%

Beachten Sie, dass dies nur ein Beispiel ist und ich weiß, dass sowohl System.out.println() als auch Log.v() auf beiden Plattformen funktionieren können. Aber die Idee ist die gleiche: Teilen Sie Ihr Projekt in mehrere Projekte auf und verwenden Sie Schnittstellen, um das Verhalten, das zwischen den Plattformen wechselt, wegzuspulen.

    
Kevin Workman 30.07.2015, 11:55
quelle
3

Da Java keinen Präprozessor nativ enthält, müßten Sie vor dem Kompilieren manuell einen ausführen. Der c-Präprozessor ist m4, den Sie selbst ausführen können.

    
nobody 30.10.2013 13:55
quelle
1

Es gibt keine Präprozessoren in Java wie C, C ++ usw. Sie können nur den Code auskommentieren.

    
Anup Cowkur 30.10.2013 13:52
quelle
0

Verwenden Sie #ifdef und Freunde wie in C und führen Sie die Java-Quellen durch den C-Preprozessor aus, bevor Sie sie kompilieren.

Bei gcc heißt der Preprozessor cpp, bei VC cl.exe mit der Option /P .

    
alk 30.10.2013 18:30
quelle
0

Nein, in Java gibt es keinen Preprozessor, der Codeabschnitte in der JVM verstecken kann.

BEARBEITEN: Während Sie natürlich jedes Programm gegen Ihre Code-Basis laufen lassen könnten, um es vorzuverarbeiten, denken Sie darüber nach, ob Sie das wirklich wollen. Der Android-Code wird sich mehr und mehr von dem anderen Java-Code unterscheiden und Ihr Code wird mit diesen # ifdef-ähnlichen Anweisungen übersät sein. Ihre IDE wird sie auch weiterhin sehen und Ihnen Fehler in beiden Codebereichen geben. In diesem Fall ist es viel einfacher, nur zwei Projekte daraus zu machen oder, und das ist mein Rat, erstelle eine plattformunabhängige Bibliothek, die du in beide Projekte einfügst und die Funktionalität enthält, die du brauchst.

    
Sietse van der Molen 30.10.2013 13:52
quelle

Tags und Links