Java 源文件中可以有宏吗

2024-04-21

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

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

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

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

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

int a = new READINT;

但是我看书上说Java不支持宏。

有人请解释一下为什么会这样,我可以用其他方式做到这一点吗?


You can但是你不应该.

The 不应该 part:

You 不应该因为以这种方式使用预处理器被认为是不好的做法 https://stackoverflow.com/questions/14041453/why-are-preprocessor-macros-evil-and-what-are-the-alternatives首先,有更好、更惯用的 Java 方法来解决这个用例。

The can部分: (*)

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

这是一个演示:

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

Result:

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

Compile:

$ 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 method:

import static StdinUtil.readInt; 

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

(or do static import StdinUtil.STDIN;并使用STDIN.nextInt().)

最后,讲一个轶事

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


这篇文章已被重写为一篇文章here http://programming.guide/java/macros-in-java-source-files.html.


(*) Since I hate answering questions with "you shouldn't". Besides, some future reader may have good reasons for wanting to use the cpp in conjunction with Java sources!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 源文件中可以有宏吗 的相关文章

随机推荐

  • 通过样式更改 Android 对话框按钮文本大小

    我正在尝试通过样式放大所有应用程序对话框按钮上的文本大小 以下代码将更改按钮背景颜色 甚至更改文本大小写 但由于某种原因 textSize 项目不受支持
  • 使用soapUI中的Groovy teststep将请求/响应文件存储在本地目录中

    通过soapUI中的常规测试步骤 我希望所有请求和响应文件都存储在具有系统日期的本地目录中 SoapUI 中的常规测试步骤 def name context expand Input TG def locatie context expan
  • jQuery - 从 JSON Stringify 获取值

    我有一个表格 我需要从中获取值 var formConfig JSON stringify bookingform serializeArray 返回如下 name client id value 1 name consignee id v
  • 如何以编程方式访问 Silverlight FrameworkElement 的 ToolTipService?

    我们有一种语言机制 可以在加载 XAML 页面时递归遍历它们 检查每个元素的 Tag 属性 并使用其值来检索要应用于该元素的字符串资源 它目前不支持工具提示 我们必须在每个页面上都有特定的代码才能将语言资源应用于它们 我正在尝试将此功能添加
  • 没有公钥,GitLab 无法克隆公共存储库

    使用亚搏体育appGitLab 6 8 2 我可以以匿名方式克隆公共存储库吗 我的用户命名空间中的存储库标记为public 如果没有在 GitLab 中保存公钥 我就无法克隆它 例如 gt ssh T email protected cdn
  • svn 外部...是或否?

    我在这里读到了一些谴责使用 svn externals 的答案 我确实看到它们如何被滥用 这确实使我们更加依赖 Subversion 但我真的不认为我们的团队会很快放弃它 无论如何 这就是我的困境 我们的解决方案引用了多个项目 这些项目位于
  • 如何将 numpy 数组分成更小的块/批次,然后迭代它们

    假设我有这个 numpy 数组 1 2 3 4 5 6 7 8 9 10 11 12 我想将其分成两批 然后迭代 1 2 3 Batch 1 4 5 6 7 8 9 Batch 2 10 11 12 最简单的方法是什么 EDIT 我很抱歉我
  • 在笑话单元测试角度中显示正确的错误

    我正在 NX 角度工作区中编写单元测试 有时它会给出这样的错误 node 15320 UnhandledPromiseRejectionWarning TypeError Converting circular structure to J
  • 什么是可堆叠修改?

    我读过一本关于 Scala 的书 里面提到了可堆叠修改 using traits 什么是可堆叠修改它们的用途是什么 区分可堆叠修改 无论如何在 scala 中使用该术语 的基本品质是 super 根据特征的混合方式动态受到影响 而一般来说
  • 访问 ctypes 结构中的 np.array

    我有一个带有动态分配数组的 ctypes 结构 即 array 1d double npct ndpointer dtype np double ndim 1 flags CONTIGUOUS class Test Structure fi
  • 如何将多维 C 数组传递给函数? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至是多维 都存储在连续的内存中 因此您可以安全地将其转换为int 假设给定的数组是
  • Java、Spark 和 Cassandra java.lang.ClassCastException:com.datastax.driver.core.DefaultResultSetFuture 无法转换为阴影

    我在尝试将数据写入 Cassandra 数据库时遇到错误 我在这里得到了什么 1 字典 java package com chatSparkConnactionTest import java io Serializable public
  • Websocket-rails 不适用于 Nginx 和 Unicorn 的生产环境

    我有 Rails 3 2 应用程序和 gem websocket rails 0 7 在开发机器上 一切正常 在生产环境中 我使用 Nginx 1 6 作为代理服务器 使用 Unicorn 作为 http 服务器 Thin 用于独立模式 如
  • 如何在java中使用不同文件中的类?

    我是 Java 新手 这就是我正在尝试做的事情 我在 Windows 计算机上的此文件夹中有两个文件 d programs sims javasim src com jsim Person java Building java 在我的 Bu
  • 如何从 .t​​xt 文件中读取已知数量的未知大小的字符串并将每一行存储在矩阵的一行中(在 C 中)?

    标题是不言自明的 我几乎可以肯定 最终结果不会是一个矩阵 因为每行都有不同数量的列 所以它更像是可变大小的数组的数组 按大小对片段进行排序 最大的在前 也很有趣 这是我到目前为止所尝试过的 int main char str MAXLEN
  • 需要帮助升级我的 Rails 版本

    我是 Ruby on Rails 新手 我需要将我的rails版本从1 2 3升级到2 3 5 我在windows环境下使用mysql数据库工作 您能帮我清楚地说明升级rails版本所涉及的步骤吗 谢谢 正如您所说 您想要升级当前应用程序的
  • 在 JavaCameraView 中设置帧速率

    我想使用 JavaCameraView 将帧速率设置为 1 fps 当我打开相机时 帧速率约为 20 fps 我的目的是改变这个值 单击按钮后 1 fps 有人可以帮助我吗 我在互联网上搜索了很多 但我找不到任何有趣的东西 在文档中也htt
  • 无法在 Android 上使用 XOAUTH 连接到 Gmail IMAP

    我正在构建一个使用 Gmail 来备份一些数据的应用程序 我使用 XOAUTH 连接到 Gmail 并获取令牌和秘密 但我无法连接到 Gmail 的 IMAP 服务 我按照以下示例进行操作http code google com p goo
  • 将 HTML 作为 PHP 执行

    当我尝试将 PHP 嵌入到 HTML 文件中时 它不起作用 我编辑了 htaccess 以便将 HTML 文件视为 PHP 但是当我尝试访问 html 文件时 我的浏览器会下载它 而不是解析和显示它 编辑 我的 htaccess 内容 Ad
  • Java 源文件中可以有宏吗

    在我的程序中 我多次从控制台读取整数 每次 我都需要输入这一行 new Scanner System in nextInt 我习惯了 C C 我想知道我是否可以定义类似的东西 define READINT Scanner System in