我可以在 Java 源文件中使用宏吗

新手上路,请多包涵

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

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

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

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

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

int a = new READINT;

但是我读过 Java 不支持宏的形式书籍。

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

原文由 Muthu Ganapathy Nathan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 511
2 个回答

你 _可以_,但你 _不应该_。

不应该 的部分:

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

罐头 部分:(*)

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

这是一个演示:

src/Test.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 预处理方法!我正在为一门课程创建一个编程作业。我希望能够轻松地从参考解决方案中提取代码框架。所以我只使用了几个 #ifdef 来过滤掉解决方案的“秘密”部分。这样我就可以维护参考解决方案,并轻松地重新生成代码框架。


这篇文章已被重写为一篇文章 here


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

原文由 aioobe 发布,翻译遵循 CC BY-SA 3.0 许可协议

不。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();
   }
}

原文由 user166390 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题