Java中的#define

我开始用Java编程,我想知道是否存在与C##define等价的东西。

谷歌的一个快速search说,它没有,但任何人都可以告诉我,如果类似的东西在Java中存在? 我试图让我的代码更具可读性。

而不是myArray [0]我想能够写myArray [PROTEINS]为例。

不,因为没有预编译器。

但是,Hotspot在可能的情况下非常好地优化,所以在你的情况下你可以达到如下的效果:

class MyClass { private static final int PROTEINS = 0; ... MyArray[] foo = new MyArray[PROTEINS]; } 

编译器会注意到, PROTEINS永远不会改变,所以将它内联,这或多或less是你想要的。

请注意,常量上的访问修饰符在这里是不重要的,所以如果您想在多个类中重复使用相同的常量,它可以是publicprotected而不是私有的。

评论空间太小,所以这里有一些关于static final的使用方面的更多信息。 正如我在对Andrzej的回答的评论中所说的,只有原始string和string以文字的forms直接编译到代码中。 为了演示这一点,请尝试以下操作:

您可以通过创build三个类(在单独的文件中)来看到这一点:

 public class DisplayValue { private String value; public DisplayValue(String value) { this.value = value; } public String toString() { return value; } } public class Constants { public static final int INT_VALUE = 0; public static final DisplayValue VALUE = new DisplayValue("A"); } public class Test { public static void main(String[] args) { System.out.println("Int = " + Constants.INT_VALUE); System.out.println("Value = " + Constants.VALUE); } } 

编译这些并运行testing,打印:

 Int = 0
值= A

现在,改变Constants为每个不同的值,只是编译类Constants 。 当您再次执行Test (不重新编译类文件)时,仍然会打印旧值INT_VALUE而不是VALUE。 例如:

 public class Constants { public static final int INT_VALUE = 2; public static final DisplayValue VALUE = new DisplayValue("X"); } 

运行testing,不用重新编译Test.java

 Int = 0
值= X

请注意,任何其他使用static finaltypes都将保留作为参考。

与C / C ++#if / #endif类似,一个常量字面量或通过static final定义的,在常规的Java if条件中使用并计算为false将导致编译器去除if块中语句的字节码(他们不会被生成)。

 private static final boolean DEBUG = false; if (DEBUG) { ...code here... } 

“… code here …”中的代码不会被编译到字节码中。 但是,如果您将DEBUG更改为true ,则会是。

 static final int PROTEINS = 1 ... myArray[PROTEINS] 

你会正常input类中的“常量”。 并且请注意,允许编译器优化对其的引用,所以除非您重新编译所有使用的类,否则不要更改它。

 class Foo { public static final int SIZE = 5; public static int[] arr = new int[SIZE]; } class Bar { int last = arr[Foo.SIZE - 1]; } 

编辑循环… SIZE = 4。 另外编译Bar,因为你的编译器在上一个编译周期中可能只写了“4”!

Java没有define预处理器指令的通用目的。

在常量的情况下,build议将它们声明为static finals ,如in

 private static final int PROTEINS = 100; 

这些声明将由编译器内联(如果该值是编译时常量)。

另请注意,公共静态最终常量字段是公共接口的一部分,它们的值不应该改变(因为编译器内联它们)。 如果确实要更改该值,则需要重新编译引用该常量字段的所有源。

最简单的答案是“没有直接的方法来获取它,因为没有预编译器”,但你可以自己做。 使用类,然后将variables定义为final,以便在整个程序中假定它是不变的
不要忘记使用final和variable作为public或protected而不是private,否则你将无法从该类之外访问它