Mei*_*eir 68 java preprocessor c-preprocessor
我开始用Java编程,我想知道是否#define存在与C++相当的东西.
谷歌的快速搜索说它没有,但任何人都可以告诉我,如果Java中存在类似的东西吗?我正在努力让我的代码更具可读性.
而不是myArray[0]我想能够写myArray[PROTEINS]例如.
And*_*yle 92
不,因为没有预编译器.
但是,Hotspot在可能的情况下非常擅长优化,因此在您的情况下,您可以实现以下相同的功能:
class MyClass
{
private static final int PROTEINS = 0;
...
MyArray[] foo = new MyArray[PROTEINS];
}
Run Code Online (Sandbox Code Playgroud)
编译器会注意到PROTEINS永远不会改变,所以会内联它或多或少你想要的内容.
请注意,常量上的访问修饰符在这里并不重要,因此如果您想在多个类中重用相同的常量,它可以是public或protected不是私有的.
Kev*_*ock 38
评论空间太小,所以这里有一些关于使用的更多信息static final.正如我在对Andrzej的回答中所说的那样,只有原始的并且String直接编译成代码作为文字.要证明这一点,请尝试以下方法:
您可以通过创建三个类(在单独的文件中)来查看此操作:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
编译这些并运行Test,它打印:
Int = 0
Value = A
Run Code Online (Sandbox Code Playgroud)
现在,更改Constants为每个都有一个不同的值,只需编译类Constants.Test再次执行时(不重新编译类文件)它仍会打印旧值INT_VALUE但不打印VALUE.例如:
public class Constants {
public static final int INT_VALUE = 2;
public static final DisplayValue VALUE = new DisplayValue("X");
}
Run Code Online (Sandbox Code Playgroud)
运行测试而不重新编译Test.java:
Int = 0
Value = X
Run Code Online (Sandbox Code Playgroud)
请注意,使用的任何其他类型static final都将作为参考.
与C/C++ #if/ 类似#endif,常量文字或通过static final原语定义的常量文字,在常规Java if条件中使用并且求值false将导致编译器剥离if块中语句的字节代码(它们将不会生成).
private static final boolean DEBUG = false;
if (DEBUG) {
...code here...
}
Run Code Online (Sandbox Code Playgroud)
"......这里的代码......"中的代码不会被编译成字节代码.但如果你改变了DEBUG,true那就是.
static final int PROTEINS = 1
...
myArray[PROTEINS]
Run Code Online (Sandbox Code Playgroud)
你通常会把"常量"放在类中.请注意,允许编译器优化对它的引用,因此除非重新编译所有使用的类,否则不要更改它.
class Foo {
public static final int SIZE = 5;
public static int[] arr = new int[SIZE];
}
class Bar {
int last = arr[Foo.SIZE - 1];
}
Run Code Online (Sandbox Code Playgroud)
编辑循环... SIZE=4.还要编译,Bar因为编译器可能在最后一个编译周期中写了"4"!