我在编译时得到了一个我没想到的匿名类。相关代码如下,然后进行更详细的解释:
完整的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 {};
}发布于 2009-12-28 21:03:59
实际上(至少在某些情况下)会为switch语句生成一个内部类:
https://stackoverflow.com/questions/1970713
复制相似问题