#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.

64
demandé sur Md. Abu Nafee Ibna Zahid 2009-12-18 11:58:51

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.

85
répondu Andrzej Doyle 2009-12-18 10:55:32

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.

36
répondu Kevin Brock 2018-01-02 15:00:21
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!

5
répondu extraneon 2018-01-02 14:58:39

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.

4
répondu notnoop 2009-12-18 10:05:57

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.

3
répondu Igor Maznitsa 2018-01-31 07:36:58

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

0
répondu Jitendra Nagar 2017-05-30 12:32:11

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 .

0
répondu Md. Abu Nafee Ibna Zahid 2018-01-02 13:44:08