我在编译时得到了一个我没想到的匿名类。相关代码如下,然后是更详细的解释:
整个 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 {};
}