我在编译时得到了一个匿名类,但我并没有预期这个结果。下面是相关代码,然后是更详细的解释:
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 {};
}
make
并不是一个适合Java开发的工具。我强烈建议使用ant
代替。随着你开发更复杂的应用程序,你会在各个地方都有匿名类,这是正确的做法。 - Carl Smotricz