我可以在Java源文件中拥有宏吗?

2022-08-31 17:42:06

在我的程序中,我正在多次从控制台中读取整数。每次,我都需要键入此行。

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

我习惯于C / C++我想知道我是否可以定义类似的东西

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

然后,在我的java程序中的每个地方,我都可以将表单控制台读取为

int a = new READINT;

但是我读过Java不支持宏的表单书籍。

有人请解释一下为什么会这样,我可以通过任何其他方式做到这一点。


答案 1

你可以,但你不应该

不应该部分:

不应该这样做,因为以这种方式使用预处理器被认为是不好的做法,并且有更好,更像Java的方法来解决这个用例。


部分:(*)

Java本身不支持宏。另一方面,您可以通过C预处理器(简称CPP)通过管道传输源代码,就像C/C++编译链一样。

下面是一个演示:

来源/测试.java

#define READINT (new java.util.Scanner(System.in).nextInt())

class Test {
    public static void main(String[] args) {
        int i = READINT;
    }
}

cpp 命令:

$ cpp -P src/Test.java preprocessed/Test.java

结果:

class Test {
    public static void main(String[] args) {
        int i = (new java.util.Scanner(System.in).nextInt());
    }
}

编译:

$ javac preprocessed/Test.java


更好的解决方法:

您可以使用静态方法编写自己的实用程序类:

import java.util.Scanner;
class StdinUtil {
    public final static Scanner STDIN = new Scanner(System.in);
    public static int readInt() {
        return STDIN.nextInt();
    }
}

当您想要使用它时,可以静态导入该方法:readInt

import static StdinUtil.readInt; 

class Test {
    public static void main(String[] args) {
        int i = readInt();
    }
}

(或做并使用 。static import StdinUtil.STDIN;STDIN.nextInt()


最后,一个轶事

我自己在Java代码上使用过CPP预处理方法一次!我正在为一门课程创建编程作业。我希望能够轻松地从参考解决方案中提取代码框架。所以我只是用了几个s来过滤掉解决方案的“秘密”部分。这样,我就可以维护参考解决方案,并轻松重新生成代码框架。#ifdef


这篇文章已经重写为一篇文章在这里


(*)因为我讨厌用“你不应该”来回答问题。此外,一些未来的读者可能有充分的理由想要将cpp与Java源代码结合使用!


答案 2

不。Java(语言)不支持任何类型的宏。

但是,某些构造可以被伪造或包装。虽然这个例子很愚蠢(为什么你每次都创建一个新的扫描仪!?!?!),但下面显示了如何实现它:

int nextInt() {
   return new Scanner(System.in).nextInt(); 
}
...
int a = nextInt();
int b = nextInt();

好多了

Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();

快乐编码。


评论:

可以调用静态方法,而无需对象来调用它们。但是,在大多数情况下,一个已经在对象中。考虑:

public class Foo {
   static int nextIntStatic() {
     return 13;
   }

   int nextInt() {
     return 42;
   }

   void realMain () {
     // okay to call, same as this.nextInt()
     // and we are "in" the object
     int ni = nextInt();
   }

   public static void main(String[] args) {
      // okay to call, is a static method
      int nis = nextIntStatic();
      Foo f = new Foo();
      f.realMain();
   }
}

推荐