[英]Reference to Public Enum results in Anonymous Class
我在編譯時得到一個我沒想到的匿名類。 相關代碼如下,然后更詳細的解釋:
CircuitType.java的整體:
public enum CircuitType { V110A20, V110A30, V208A20, V208A30 }
來自Auditor.java,第3-9行:
public class Auditor {
private String[] fileNames;
private int numV110A20;
private int numV110A30;
private int numV208A20;
private int numV208A30;
來自Auditor.java,第104-121行:
[...]
switch (newCircuit.getType()) {
case V110A20:
this.numV110A20++;
break;
case V110A30:
this.numV110A30++;
break;
case V208A20:
this.numV208A20++;
break;
case V208A30:
this.numV208A30++;
break;
default:
System.err.println("An Error Has Occured.");
System.exit(-1);
break;
}
[...]
從Circuit.java,第1-5行:
public class Circuit {
private CircuitType myType;
public CircuitType getType() {
return this.myType;
}
[...]
當命令
javac *.java
執行時,會生成一個匿名類Auditor $ 1.java。 顯然,這些文件在一個不包含其他內容的文件系統目錄中彼此相鄰。
當注釋掉行104-121時,不會生成任何匿名類。
我起初認為這是一個包問題,所以把這三個類放在一個包中,但我對包沒有足夠的了解才能使它工作。 如果它確實是一個包問題,有人可以指導我完全如何標記它們嗎? 不過,如果我不需要,我寧願不用打包它們。
除了這些類通常表示命名空間問題這一事實之外,匿名類是一個問題的原因是它破壞了我用於自動編譯的Makefile。
更新
附件是一個控制台會議,我希望可以闡明這個謎:
% javap 'Auditor$1'
Compiled from "Auditor.java"
class Auditor$1 extends java.lang.Object{
static final int[] $SwitchMap$CircuitType;
static {};
}
我已經開始構建一個包含你發布的源代碼的小項目,並且只有足夠的框架來編譯它。 我有3個類文件:Circuit.class,CircuitType.class和Auditor.class - 正如預期的那樣。
所有這些都在Java 1.6下。 但正如其他人所指出的那樣,我認為你對這個問題的診斷是不對的。
匿名類很容易意外生成:通常是一個類似的結構
Circuit myCircuit = new Circuit() {
public CircuitType getCircuitType() {
return XXX;
}
}
例如,將創建一個。 鑒於您的代碼更多,優秀的SO人員可能能夠找出您的錯誤。
使用javap
或更好的“真正的”Java反匯編程序(如JD
反匯編類文件可能會很有趣,也很有啟發性。
更新
添加了您的新Auditor代碼到我的...沒有變化。 沒有匿名課程。
你的代碼當然是正確的(我們可以看到它),但設計不是很好。 有些人會指出,每次出現新電路類型時,您都必須擴展計數器聲明和switch
語句。
你也沒有充分利用枚舉的“特殊功能”。 我有一個簡化版的Auditor
方法:
private int[] counters = new int[CircuitType.values().length];
public void tallySomething() {
Circuit newCircuit = new Circuit();
counters[newCircuit.getType().ordinal()]++;
}
更新2
我發現你的javap
輸出很有啟發性。 請參閱下面的評論。
我的結論:
switch
make
和使用ant
來擁抱Java的匿名類和其他奇怪的東西。 由於你的非標准編譯設置只會遇到問題,我會選擇最后一個解決方案並在那里解決問題。
確實似乎(至少在某些情況下)將為switch語句生成內部類:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.