#define in Java
我开始用Java编程,我想知道是否相当于C++ EDCOX1(0)的存在。
对谷歌的快速搜索表明它没有,但有人能告诉我是否存在类似的东西吗?在Java中?我正在努力使我的代码更可读。
例如,我希望能够编写
不,因为没有预编译程序。但是,在您的情况下,您可以实现以下相同的事情:
1 2 3 4 5 6 7 8 9 | class MyClass { private static final int PROTEINS = 0; ... MyArray[] foo = new MyArray[PROTEINS]; } |
编译器会注意到,
注意,常量的access修饰符在这里并不重要,因此如果您想在多个类中重用相同的常量,那么它可以是
注释空间太小,所以这里有更多关于使用
您可以通过创建三个类(在单独的文件中)来看到这一点:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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); } } |
编译这些并运行测试,其中打印:
1 2 | Int = 0 Value = A |
现在,将
1 2 3 4 | public class Constants { public static final int INT_VALUE = 2; public static final DisplayValue VALUE = new DisplayValue("X"); } |
在不重新编译
1 2 | Int = 0 Value = X |
请注意,与
类似于C/C++ EDCOX1,16 ED/EDOCX1,17,一个常数文字或一个通过EDCOX1(7)定义的原语,用于一个常规的Java EDCOX1×19条件,并对EDCOX1(20)进行评估,这会导致编译器在EDCOX1×19块内的语句中删除字节码(它们不会被生成)。
1 2 3 4 5 | private static final boolean DEBUG = false; if (DEBUG) { ...code here... } |
"…code here…"处的代码不会编译为字节代码。但如果你把
1 2 3 | static final int PROTEINS = 1 ... myArray[PROTEINS] |
您通常会在类本身中放置"常量"。请注意,编译器可以优化对它的引用,所以不要更改它,除非您重新编译所有的使用类。
1 2 3 4 5 6 7 8 | class Foo { public static final int SIZE = 5; public static int[] arr = new int[SIZE]; } class Bar { int last = arr[Foo.SIZE - 1]; } |
编辑周期…
Java没有通用的EDCOX1×2预处理器指令。
对于常量,建议将其声明为
1 | private static final int PROTEINS = 100; |
这样的声明将由编译器内联(如果值是编译时常量)。
还请注意,公共静态最终常量字段是公共接口的一部分,它们的值不应更改(因为编译器将它们内联)。如果确实更改了该值,则需要重新编译引用该常量字段的所有源。
Java有一个预处理器,它提供了诸如PostgresJDBC定义、αIFIFF、αIFNDEF等多个指令,例如,TeaStudio使用它为不同的情况生成源代码,而不复制代码。
Java原语专业生成器支持EDCOX1、26、EDCOX1、27和EDCOX1×28个块,这些块允许在Java代码中执行某种宏生成,类似于在这个答案中提到的Java注释预处理器。
JPSG有Maven和Gradle插件。
最可读的解决方案是使用静态导入。那么您就不需要使用
编写一个常量为
1 2 3 4 5 | package ConstantPackage; public class Constant { public static int PROTEINS = 1; } |
然后在需要常量的地方使用静态导入。
1 2 3 4 5 6 7 8 9 10 11 | import static ConstantPackage.Constant.PROTEINS; public class StaticImportDemo { public static void main(String[]args) { int[] myArray = new int[5]; myArray[PROTEINS] = 0; } } |
要了解有关静态导入的更多信息,请参阅此堆栈溢出问题。
最简单的答案是"没有直接的获取方法,因为没有预编译程序"但你可以自己做。使用类,然后将变量定义为最终变量,以便可以在整个程序中将其假定为常量
不要忘记将final和variable用作public或protected not private,否则您将无法从该类外部访问它。