簡體   English   中英

對公共枚舉的引用導致匿名類

[英]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輸出很有啟發性。 請參閱下面的評論。

我的結論:

  1. 是的,顯然你的Java impl正在使用anon類進行切換。 瘸子,但合法。
  2. 您有以下選擇:
    • 消除switch
    • 使用不同的Java實現
    • 和匿名班一起生活; ditch make和使用ant來擁抱Java的匿名類和其他奇怪的東西。

由於你的非標准編譯設置只會遇到問題,我會選擇最后一個解決方案並在那里解決問題。

確實似乎(至少在某些情況下)將為switch語句生成內部類:

Java枚舉和其他類文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM