Ich fange an, in Java zu programmieren, und frage mich, ob das Äquivalent zu C ++ #define
existiert.
Eine schnelle Suche bei Google sagt, dass dies nicht der Fall ist, aber kann mir jemand sagen, ob es in Java etwas Ähnliches gibt? Ich versuche, meinen Code lesbarer zu machen.
Stattdessen myArray[0]
möchte ich myArray[PROTEINS]
zum Beispiel schreiben können .
Antworten:
Nein, weil es keinen Precompiler gibt. In Ihrem Fall könnten Sie jedoch Folgendes erreichen:
class MyClass { private static final int PROTEINS = 0; ... MyArray[] foo = new MyArray[PROTEINS]; }
Der Compiler wird bemerken, dass
PROTEINS
sich dies niemals ändern kann, und wird es auch inline setzen, was mehr oder weniger das ist, was Sie wollen.Beachten Sie, dass der Zugriffsmodifikator für die Konstante hier unwichtig ist. Er kann also
public
oderprotected
nicht privat sein, wenn Sie dieselbe Konstante für mehrere Klassen wiederverwenden möchten .quelle
Der Kommentarbereich ist zu klein, daher finden Sie hier weitere Informationen zur Verwendung von
static final
. Wie ich in meinem Kommentar zur Antwort von Andrzej sagte , nur primitiv undString
werden als Literale direkt in den Code kompiliert. Versuchen Sie Folgendes, um dies zu demonstrieren:Sie können dies in Aktion sehen, indem Sie drei Klassen (in separaten Dateien) erstellen:
public class DisplayValue { private String value; public DisplayValue(String value) { this.value = value; } public String toString() { return value; } } public class Constants { public static final int INT_VALUE = 0; public static final DisplayValue VALUE = new DisplayValue("A"); } public class Test { public static void main(String[] args) { System.out.println("Int = " + Constants.INT_VALUE); System.out.println("Value = " + Constants.VALUE); } }
Kompilieren Sie diese und führen Sie Test aus, der Folgendes druckt:
Int = 0 Value = A
Ändern Sie nun, um
Constants
für jede Klasse einen anderen Wert zu haben, und kompilieren Sie einfach die KlasseConstants
. Wenn SieTest
erneut ausführen (ohne die Klassendatei neu zu kompilieren), wird weiterhin der alte Wert für gedruckt,INT_VALUE
jedoch nichtVALUE
. Zum Beispiel:public class Constants { public static final int INT_VALUE = 2; public static final DisplayValue VALUE = new DisplayValue("X"); }
Führen Sie den Test aus, ohne ihn neu zu kompilieren
Test.java
:Int = 0 Value = X
Beachten Sie, dass jeder andere Typ, der mit verwendet
static final
wird, als Referenz beibehalten wird.Ähnlich wie bei C / C ++
#if
/#endif
führt ein konstantes oderstatic final
mit Primitiven definiertes Literal , das in einer regulären Java-if
Bedingung verwendet und ausgewertet wird,false
dazu, dass der Compiler den Bytecode für die Anweisungen innerhalb desif
Blocks entfernt (sie werden nicht generiert).private static final boolean DEBUG = false; if (DEBUG) { ...code here... }
Der Code unter "... Code hier ..." würde nicht in den Bytecode kompiliert. Aber wenn Sie
DEBUG
zutrue
dann wechseln würden, wäre es.quelle
enum
s nicht dasselbe tut .static final int PROTEINS = 1 ... myArray[PROTEINS]
Normalerweise würden Sie "Konstanten" in die Klasse selbst einfügen. Beachten Sie außerdem, dass ein Compiler Verweise darauf optimieren darf. Ändern Sie ihn daher nur, wenn Sie alle verwendenden Klassen neu kompilieren.
class Foo { public static final int SIZE = 5; public static int[] arr = new int[SIZE]; } class Bar { int last = arr[Foo.SIZE - 1]; }
Bearbeiten Zyklus ...
SIZE=4
. KompilierenBar
Sie auch, weil Ihr Compiler im letzten Kompilierungszyklus möglicherweise gerade "4" geschrieben hat!quelle
Java hat keine Allzweck-
define
Präprozessor-Direktive.Bei Konstanten wird empfohlen, diese
static finals
wie in zu deklarierenprivate static final int PROTEINS = 100;
Solche Deklarationen würden von den Compilern eingefügt (wenn der Wert eine Konstante zur Kompilierungszeit ist).
Bitte beachten Sie auch, dass öffentliche statische Endkonstantenfelder Teil der öffentlichen Schnittstelle sind und sich ihre Werte nicht ändern sollten (da der Compiler sie einfügt). Wenn Sie den Wert ändern, müssen Sie alle Quellen neu kompilieren, die auf dieses konstante Feld verweisen.
quelle
static finals
sind nicht wirklich ein Teil der öffentlichen Schnittstelle. :) Dafürpublic static finals
ist das allerdings wahr.Es gibt einen Präprozessor für Java, der Anweisungen wie #define, #ifdef, #ifndef und viele andere bereitstellt. Das PostgresJDBC-Team verwendet ihn beispielsweise, um Quellen für verschiedene Fälle zu generieren und keinen Code zu duplizieren.
quelle
Die am besten lesbare Lösung ist der statische Import . Dann müssen Sie nicht verwenden
AnotherClass.constant
.Schreiben Sie eine Klasse mit der Konstante als
public static
Feld.package ConstantPackage; public class Constant { public static int PROTEINS = 1; }
Verwenden Sie dann einfach den statischen Import, wo Sie die Konstante benötigen.
import static ConstantPackage.Constant.PROTEINS; public class StaticImportDemo { public static void main(String[]args) { int[] myArray = new int[5]; myArray[PROTEINS] = 0; } }
Weitere Informationen zum statischen Import finden Sie in dieser Frage zum Stapelüberlauf .
quelle
Die einfachste Antwort lautet "Keine direkte Methode, um sie zu erhalten, da es keinen Pre-Compiler gibt". Sie können dies jedoch selbst tun. Verwenden Sie Klassen und definieren Sie Variablen als final, damit sie im gesamten Programm als konstant angenommen werden können.
Vergessen Sie nicht, final und variable als public oder protected not private zu verwenden, da Sie sonst nicht von außerhalb dieser Klasse darauf zugreifen können
quelle
Java Primitive Spezialisierungen Generator unterstützt
/* with */
,/* define */
und/* if */ ... /* elif */ ... /* endif */
Blöcke , die eine Art von Makro - Generation zu tun , in Java - Code in erwähnt, ähnlich wie Java-Kommentar-Präprozessor erlauben diese Antwort .JPSG hat Maven- und Gradle-Plugins.
quelle
Der als Javac-Compiler-Plugin implementierte Manifold Preprocessor wurde ausschließlich für die bedingte Kompilierung von Java-Quellcode entwickelt. Es verwendet den bekannten C / C ++ - Direktivenstil: #define, #undef, #if, #elif, #else, #endif, #error. und #warning.
Es hat Maven und Gradle Plugins.
quelle