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是你想要的。
请注意,常量上的访问修饰符在这里是不重要的,所以如果您想在多个类中重复使用相同的常量,它可以是public
或protected
而不是私有的。
评论空间太小,所以这里有一些关于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 final
types都将保留作为参考。
与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,否则你将无法从该类之外访问它