如何在Java中提供预处理指令

33

我该如何在Java中正确地提供以下功能?

[C#]

#define PRODUCTION //Change from sandbox to production to switch between both systems.

#if SANDBOX
    using NetSuite.com.netsuite.sandbox.webservices;
#endif

#if PRODUCTION
    using NetSuite.com.netsuite.webservices;
#endif

2
看起来我不能添加答案,因为问题已经关闭了,但是我读到了一个叫做Prebop的工具(免责声明:我还没有使用过它),它可能可以做到这一点,并且显然支持Eclipse。(尽管我同意其他人的观点:在你的情况下,使用DI。-- 我只是为其他谷歌用户提供这个信息。) - BrainSlugs83
请查看此答案,https://dev59.com/cXI-5IYBdhLWcg3wSGUB#48330157 - TT--
5个回答

26

7
需要注意的是,在OP提供的例子中,他应该在C#中也使用DI/IoC -- 这基本上是一个糟糕的例子 -- 我认为问题仍然有效,而这个答案虽然对于OP的情况有效,但有点令人失望 -- (不是你的错@TimB,尽管下面关于使用cpp的答案有点有趣...) - BrainSlugs83
2
我非常不同意DI是“更灵活和更强大”的说法。类似于cpp的jpp模拟器同样可以允许文本替换,这可以在重复表达式的可读性方面带来巨大的帮助,其中你仅仅不想要一个方法调用而已。不将其包含在语言中始于一场有关潜在滥用的愚蠢争论,并且仍然如此。Java有许多关于滥用的__有效__论据(例如,禁止MI,不包含运算符重载等),但这是我认为他们搞砸的地方之一。值得庆幸的是,C#没有追随这些特定的步伐。 - alife
我来自C语言,曾经一直使用预处理器。在使用Java数十年中,我从未发现需要预处理器的情况。总有更加简洁的解决方式。尤其是有像Cucumber这样的工具可用,当你需要一个不太关注代码的方法时。 - Tim B

10

Java没有预处理器,但这并不意味着您不能通过 cpp 运行Java代码 - 尽管任何工具都不支持此操作,据我所知。


2
看起来我不能添加答案,因为问题已经关闭了,但是我读到了一个叫做Prebop的工具(免责声明:我还没有使用过它),可能可以做到这一点,并且显然支持Eclipse。(不过我同意其他人的观点:在OP的情况下,他应该使用DI。-- 我把这个放在这里给其他谷歌用户参考。) - BrainSlugs83

1
你可以使用基于<#FreeMarker>的东西。

enter image description here

来源:https://github.com/mkowsiak/jpp

然而,如果你想更改代码,这种解决方案将需要进行预编译步骤。另一方面,您仍然可以创建可在没有预处理步骤的情况下工作的代码——一种“默认”编译。


1

使用依赖注入/控制反转。根据实际需求,您可能只需要使用属性文件/环境变量来控制某些内容。

您可能可以在某些类型的初始化/代码周围使用静态定义。


1
根据帖子中的示例,DI/IoC如何帮助?从我所读的(虽然简要),似乎DI主要用于解耦而不是条件编译。我的具体用例涉及批量更改导入语句以连接到沙盒与生产系统。是否有特定的教程/文档集应该阅读? - Robert H
DI/IoC在运行时是“条件编译”。如果不知道你实际要交换的内容,我只能猜测,但你可以使用两种Web服务实现之一,例如,在开发中,它们都将被存根以返回已知值。通常出于测试目的而这样做,例如。在开发中更可能使用不同的连接参数/端点,这通常只是配置值,不需要DI。 - Dave Newton
一个解决方案是为两个版本使用相同的命名空间,将每个版本放在自己的 JAR 存档中,然后只需加载适当的版本。 - MauganRa

0
我正在使用 java-comment-preprocessor。它非常简单方便,还提供了与 Maven、Ant 和 Gradle 的集成。它使用 Java 注释,并使用预处理器根据预处理标志生成实际代码,例如:
//#if simulator
private final static int FOO = 2;
//#else
private final static int FOO = 1;
//#endif

Maven集成:
<plugin>
                <groupId>com.igormaznitsa</groupId>
                <artifactId>jcp</artifactId>
                <version>7.0.5</version>
                <executions>
                    <execution>
                        <id>preprocessSources</id>
                        <phase>process-sources</phase>
                        <goals>
                            <goal>preprocess</goal>
                        </goals>
                        <configuration>
                            <vars>
                                <simulator>${simulator}</simulator>
                            </vars>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接