Java C++;样式编译器指令

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

我有一个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 = ...
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块。