Java C++;样式编译器指令
我有一个Java数组:Java C++;样式编译器指令,java,c++,Java,C++,我有一个Java数组: String[] myArray = {"1", "2"}; 根据编译时已知的条件,我希望分配不同的值: String[] myArray = {"A", "B", "C"}; 在C++中,我会使用类似< < /P>的东西。 #ifdef ABC // ABC stuff here #else // 123 stuff here #endif 但是在Java中该怎么做呢 String[] myArray; if (ABC) myArray
String[] myArray = {"1", "2"};
根据编译时已知的条件,我希望分配不同的值:
String[] myArray = {"A", "B", "C"};
在C++中,我会使用类似< < /P>的东西。
#ifdef ABC
// ABC stuff here
#else
// 123 stuff here
#endif
但是在Java中该怎么做呢
String[] myArray;
if (ABC)
myArray = ...
else
myArray = ...
ABC是静态的最终变量,JVM需要进行内联条件检查。在Java中,您需要在运行时进行检查
String[] myArray;
if (something)
myArray = new String[]{"A", "B"};
else
myArray = new String[]{"A", "B, "C"}
<>这将是与C++代码最相似的。而且,如果您的条件在编译时被保证为true,Java将优化调用
还有其他选项,但是它们看起来一点也不像C++版本。
< P>一种方法是在生成脚本的第一个阶段(Ant、Maven或其他任何使用)中重新生成一个Stangest.java文件。根据文件的复杂程度,您可以手动执行,也可以使用更重的工具,如Velocity 在过去,我使用类似的方法将版本和构建信息放入java类中class Foo {
static final boolean ABC = true;
public void someMehod() {
if (ABC) { // #ifdef ABC
} else { // #else
} // #endif
}
}
由于ABC是静态的和最终的,编译器在编译时对其进行评估,就像预处理器一样有效。使用模板引擎(类似Velocity)来执行预处理步骤。构建脚本可以运行模板,应用构建环境中的属性来输出最终编译的Java源代码。这本质上就是C/C++预处理器所做的
我的猜测是,有人已经编写了一个ant任务来完成这项任务,但我太懒了,无法为您搜索它。如果您在Java中使用var/const作为自定义编译器指令,请不要将其设置为最终指令。你可能会收到很多警告,因为条件总是“真实”之类的
public static boolean ABC = true; // or false
你不能真的这样做…最好的方法是使用模板引擎…甚至有些编译器会将代码放入最终类文件中-如果不需要,更好的编译器会删除代码…你必须将常量设置为最终值,并且必须将其设置为绝对值,编译器才能删除代码
public static final boolean ABC = true // This will be enough for the compiler to remove code
public static final boolean ABC = [any method call] // This is not enough to work and will leave the code in there
同样,一些编译器可能仍然将代码放在那里,即使它是不可访问的(这就是为什么一些IDE会警告您代码是不可访问的,以便您删除不需要的代码)
但是,
指令是令人讨厌的,很可能您需要使用接口的实现而不是指令!适合在需要时进行低级编码(以尽量减少内存足迹)-某些特殊设备,如起搏器等,但为什么要在java中使用它们?不确定,但是我认为您可以使用
-Dname=value
将这些内容传递给jvm,然后使用System.getProperty
获取name
的值。谢谢,这肯定会起作用-如果“某物”始终为真,编译器会优化掉其他部分吗?实际上是的。如果你有这样的东西,那么它总是正确的,它会优化掉If.
当然……我完全有资格投下否决票。谢谢你的关注!!使用这个我得到了“数组常量只能在初始值设定项中使用”,但是myArray=新字符串[]{“A”,“B”};解决了问题。使用libt在评论中的想法。使用System.getProperty(“…”)为警告指定ABC.Fair point,但如果没有将该变量设为final,则编译器无法优化if/else块。