83 votes

#define in Java

Je commence à programmer en Java et je me demande si l’équivalent du C ++ #define existe.

Une recherche rapide sur Google indique que ce n'est pas le cas, mais est-ce que quelqu'un pourrait me dire si quelque chose de similaire existe en Java? J'essaie de rendre mon code plus lisible.

Au lieu de myArray [0], je veux pouvoir écrire myArray [PROTEINS] par exemple.

110voto

Andrzej Doyle Points 52541

Non, car il n'y a pas précompilateur.

Cependant, Hotspot est assez étonnamment bonne à optimiser si possible, donc dans votre cas, vous pouvez obtenir la même chose comme suit:

class MyClass
{
    private static final int PROTEINS = 0;

    ...

    MyArray[] foo = new MyArray[PROTEINS];

}

Le compilateur remarquerez qu' PROTEINS ne peut jamais, jamais changer et ne sera donc inline, ce qui est plus ou moins ce que vous voulez.

Notez que le modificateur d'accès sur la constante n'a pas d'importance ici, de sorte qu'il pourrait être public ou protected au lieu de privé, si vous souhaitez réutiliser la même constante entre plusieurs classes.

48voto

Kevin Brock Points 4695

Commentaire de l'espace trop petit, donc, voici quelques informations pour vous sur l'utilisation de l' static final. Comme je l'ai dit dans mon commentaire à l'Andrzej réponse, seule primitive et de la Chaîne sont compilées directement dans le code comme des littéraux. Pour démontrer cela, essayez les solutions suivantes:

Vous pouvez le voir en action par la création de 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 et exécuter le Test, qui s'imprime:

Int = 0
Valeur = Un

Maintenant, changez Constants à avoir une valeur différente pour chacun et viens de compiler la classe Constants. Lorsque vous exécutez Test (sans avoir à recompiler le fichier de classe) elle affiche toujours l'ancienne valeur de INT_VALUE mais pas la VALEUR. Par exemple:

public class Constants {
    public static final int INT_VALUE = 2;
    public static final DisplayValue VALUE = new DisplayValue("X");
}

Exécuter le Test sans avoir à recompiler Test.java:

Int = 0
Valeur = X

Notez que n'importe quel autre type utilisé avec static final est gardé comme référence.

Similaire à C/C++ #si/#endif, une constante littérale ou de celui défini par static final avec les primitives utilisées dans une Java ordinaire if condition et l'évalue à l' false entraîne le compilateur à la bande de byte code pour les instructions à l'intérieur de l' if bloc (ils ne seront pas générés).

private static final boolean DEBUG = false;

if (DEBUG) {
    ...code here...
}

Le code "" code ici..." ne devrait pas être compilé en byte code. Mais si vous avez changé d' DEBUG de true alors qu'il serait.

6voto

extraneon Points 13362
 static final int PROTEINS = 1
...
myArray[PROTEINS]
 

Vous auriez normalput "constantes" dans la classe elle-même. Et notez qu’un compilateur est autorisé à optimiser les références, donc ne le changez pas à moins de recompiler toutes les classes qui utilisent.

 class Foo {
  public static final int SIZE = 5;

  public static int[] arr = new int[SIZE];
}
class Bar {
  int last = arr[Foo.SIZE - 1]; 
}
 

cycle d'édition ... SIZE = 4. Compilez également Bar car votre compilateur vient peut-être d'écrire "4" dans le dernier cycle de compilation!

4voto

notnoop Points 30218

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 en tant que 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).

Veuillez noter également que le public static final champs constants font partie de l'interface publique et leurs valeurs ne changent pas (comme le compilateur inlines eux). Si vous ne modifiez pas la valeur, vous avez besoin de recompiler toutes les sources de référence à champ constant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X