55 votes

Puis-je avoir des macros dans les fichiers source Java

Dans mon programme, je lis plusieurs fois des entiers depuis la console. A chaque fois, je dois taper cette ligne.

 new Scanner(System.in).nextInt(); 

Je suis habitué au C/C++ et je me demande si je peux définir quelque chose comme

 #define READINT Scanner(System.in).nextInt(); 

et puis, à chaque endroit de mon programme java, je peux lire la console de formulaire comme

 int a = new READINT;

Mais je lis des formulaires Java ne prend pas en charge les macros.

Quelqu'un s'il vous plaît expliquez-moi pourquoi il en est ainsi, et puis-je le faire d'une autre manière.

3voto

Chris Thompson Points 18375

Java ne prend pas en charge les macros simplement parce que les concepteurs de Java ont choisi de ne pas inclure cette fonctionnalité. La réponse plus longue est que Java n'a pas de préprocesseur comme le fait C/C++ et ne peut pas exécuter cette fonctionnalité que le préprocesseur ferait normalement. La façon dont j'implémenterais cela consiste simplement à créer une classe wrapper qui termine les appels de constructeur Scanner Peut-être quelque chose comme

 public static int readInt(){
  return new Scanner(System.in).nextInt();
}

Ou, mieux encore,

 public class ScannerWrapper{
  private static Scanner instance = null;

  public static int readInt(){
   if (instance == null){
     instance = new Scanner(System.in);
   }

   return instance.nextInt();
 }

1voto

Lawrence Dol Points 27976

Java ne prend pas en charge les macros. IIRC, les concepteurs du langage ont estimé que les macros et le préparateur résultant étaient une complication inutile et indésirable.

Utilisez plutôt une fonction :

 public int readInt(Scanner inp) {
    return inp.nextint();
    }

Autre part:

 Scanner input=new Scanner(System.in);

...


int a=readInt(input);

Notez également que je crée le scanner une fois et le réutilise.

0voto

leventov Points 2552

Vous pouvez le faire, par exemple, avec Java Primitive Specializations Generator :

 /* define READINT //
new Scanner(System.in).nextInt();
// enddefine */

...

int a = /* READINT */0/**/;

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