Java中的#define

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永远不会改变,所以会内联它或多或少你想要的内容.

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


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那就是.

  • 绝对只是努力的+1! (2认同)

ext*_*eon 5

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"!