java的define,关于预处理器:Java中的#define
我開始用Java編程,我想知道是否相當于C++ EDCOX1(0)的存在。
對谷歌的快速搜索表明它沒有,但有人能告訴我是否存在類似的東西嗎?在Java中?我正在努力使我的代碼更可讀。
例如,我希望能夠編寫myArray[PROTEINS],而不是myArray[0]。
在現代C++中,應該使用一個類型化的常數,而不是一個
是的,定義為C樣式。在C++中使用const代替。參見Scott Meyers《有效C++》一書,第1條。
不,因為沒有預編譯程序。但是,在您的情況下,您可以實現以下相同的事情:
class MyClass
{
private static final int PROTEINS = 0;
...
MyArray[] foo = new MyArray[PROTEINS];
}
編譯器會注意到,PROTEINS永遠不會改變,所以會內聯它,這或多或少是您想要的。
注意,常量的access修飾符在這里并不重要,因此如果您想在多個類中重用相同的常量,那么它可以是public或protected,而不是private。
注釋空間太小,所以這里有更多關于使用static final的信息。正如我在對andrzej答案的評論中所說,只有primitive和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);
}
}
編譯這些并運行測試,其中打印:
Int ? ?= 0
Value ?= 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");
}
在不重新編譯Test.java的情況下運行測試:
Int ? ?= 0
Value ?= X
請注意,與static final一起使用的任何其他類型都作為參考。
類似于C/C++ EDCOX1,16 ED/EDOCX1,17,一個常數文字或一個通過EDCOX1(7)定義的原語,用于一個常規的Java EDCOX1×19條件,并對EDCOX1(20)進行評估,這會導致編譯器在EDCOX1×19塊內的語句中刪除字節碼(它們不會被生成)。
private static final boolean DEBUG = false;
if (DEBUG) {
...code here...
}
"…code here…"處的代碼不會編譯為字節代碼。但如果你把DEBUG改成true,那就是。
絕對是一個+1只是為了努力!
只想補充說,對于EDCOX1,2,S,Java不做同樣的事情。
static final int PROTEINS = 1
...
myArray[PROTEINS]
您通常會在類本身中放置"常量"。請注意,編譯器可以優化對它的引用,所以不要更改它,除非您重新編譯所有的使用類。
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沒有通用的EDCOX1×2預處理器指令。
對于常量,建議將其聲明為static finals,如in
private static final int PROTEINS = 100;
這樣的聲明將由編譯器內聯(如果值是編譯時常量)。
還請注意,公共靜態最終常量字段是公共接口的一部分,它們的值不應更改(因為編譯器將它們內聯)。如果確實更改了該值,則需要重新編譯引用該常量字段的所有源。
好吧,私有static finals實際上不是公共接口的一部分。:)對于public static finals來說,這是真的。
@媽媽,沒錯。我最初是公開寫的,但后來沒有更新答案就改變了。
Java有一個預處理器,它提供了諸如PostgresJDBC定義、αIFIFF、αIFNDEF等多個指令,例如,TeaStudio使用它為不同的情況生成源代碼,而不復制代碼。
Java原語專業生成器支持EDCOX1、26、EDCOX1、27和EDCOX1×28個塊,這些塊允許在Java代碼中執行某種宏生成,類似于在這個答案中提到的Java注釋預處理器。
JPSG有Maven和Gradle插件。
最可讀的解決方案是使用靜態導入。那么您就不需要使用AnotherClass.constant。
編寫一個常量為public static字段的類。
package ConstantPackage;
public class Constant {
public static int PROTEINS = 1;
}
然后在需要常量的地方使用靜態導入。
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,否則您將無法從該類外部訪問它。
總結
以上是生活随笔為你收集整理的java的define,关于预处理器:Java中的#define的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php全部公开课,PHP公开课|这篇PH
- 下一篇: java的构造函数详解,Java构造函数