#define en Java
je commence à programmer en Java et je me demande si l'équivalent du C++ #define
existe.
une recherche rapide de google dit que ce n'est pas le cas, mais quelqu'un pourrait-il me dire si quelque chose de similaire existe à Java? j'essaie de rendre mon code plus lisible.
au lieu de myArray[0]
je veux pouvoir écrire myArray[PROTEINS]
par exemple.
7 réponses
non, parce qu'il n'y a pas de précompilateur.
cependant, Hotspot est tout à fait étonnamment bonne à optimiser lorsque possible, de sorte que dans votre cas, vous pourriez obtenir la même chose comme suit:
class MyClass
{
private static final int PROTEINS = 0;
...
MyArray[] foo = new MyArray[PROTEINS];
}
le compilateur remarquera que PROTEINS
ne peut jamais, ne peut jamais changer et donc sera en ligne qui est plus ou moins ce que vous voulez.
notez que le modificateur d'accès sur la constante n'est pas important ici, donc il pourrait être public
ou protected
au lieu de privé, si vous vouliez réutiliser la même constante à travers plusieurs classes.
Commentaire de l'espace trop petit, donc, voici quelques informations pour vous sur l'utilisation de static final
. Comme je l'ai dit dans mon commentaire à la réponse D'Andrzej , seulement primitif et String
sont compilés directement dans le code comme littéraux. Pour le démontrer, essayez ce qui suit:
vous pouvez le voir en action en créant trois classes (dans des fichiers séparés):
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);
}
}
compiler ces et lancer le Test, qui imprime:
Int = 0
Value = A
maintenant, changez Constants
pour avoir une valeur différente pour chacun et compilez simplement la classe Constants
. Quand vous exécutez à nouveau Test
(sans recompiler le fichier de classe) il affiche toujours l'ancienne valeur pour INT_VALUE
mais pas VALUE
. Par exemple:
public class Constants {
public static final int INT_VALUE = 2;
public static final DisplayValue VALUE = new DisplayValue("X");
}
essai D'exécution sans recompilation Test.java
:
Int = 0
Value = X
noter que tout autre type utilisé avec static final
est conservé comme un référence.
similaire à C/C++ #if
/ #endif
, une constante littérale ou une définie par static final
avec des primitives, utilisée dans un Java régulier if
condition et évalue à false
provoquera le compilateur à rayer le code octet pour les énoncés dans le bloc if
(ils ne seront pas générés).
private static final boolean DEBUG = false;
if (DEBUG) {
...code here...
}
Le code "...code ici..."ne serait pas compilé dans le code octet. Mais si vous changé DEBUG
en true
alors il serait.
static final int PROTEINS = 1
...
myArray[PROTEINS]
vous mettez normalement "constantes" dans la classe elle-même. Et notez qu'un compilateur est autorisé à optimiser les références, donc ne le modifiez que si vous recompilez toutes les classes d'utilisation.
class Foo {
public static final int SIZE = 5;
public static int[] arr = new int[SIZE];
}
class Bar {
int last = arr[Foo.SIZE - 1];
}
Modifier le cycle... SIZE=4
. Compilez aussi Bar
parce que vous venez peut-être d'écrire" 4 " dans le dernier cycle de compilation!
Java ne dispose pas d'un usage général define
directive de préprocesseur.
Dans le cas des constantes, il est recommandé de les déclarer comme static finals
, comme dans
private static final int PROTEINS = 100;
Ces déclarations seraient intégrées par les compilateurs (si la valeur est une constante de compilation).
s'il vous plaît noter aussi que les champs publics statiques finaux constants font partie de l'interface publique et leurs valeurs ne devraient pas changer (comme le compilateur les simplifie). Si vous changez la valeur, vous devrez recompiler toutes les sources qui ont référencé ce champ constant.
il y a préprocesseur pour Java qui fournit des directives comme #define, #ifdef, #ifndef et beaucoup d'autres, par exemple L'équipe PostgresJDBC l'utilise pour générer des sources pour différents cas et pour ne pas dupliquer le code.
la réponse la plus simple est "pas de méthode directe pour l'obtenir parce qu'il n'y a pas de pré-compilateur"
Mais vous pouvez le faire par vous-même. Utilisez les classes et définissez ensuite les variables comme final de sorte qu'elle puisse être considérée comme constante tout au long du programme
N'oubliez pas d'utiliser final et variable comme public ou protégé non privé sinon vous ne pourrez pas y accéder de l'extérieur de cette classe
Plus lisible la solution est d'utiliser Statiques Import . Alors vous pas besoin d'utiliser AnotherClass.constant
.
écrire une classe avec la constante comme public static
champ.
package ConstantPackage;
public class Constant {
public static int PROTEINS = 1;
}
alors il suffit d'utiliser importation statique où vous avez besoin de la constante.
import static ConstantPackage.Constant.PROTEINS;
public class StaticImportDemo {
public static void main(String[]args) {
int[] myArray = new int[5];
myArray[PROTEINS] = 0;
}
}
pour en savoir plus sur L'importation statique s'il vous plaît voir cette question de débordement de pile .