Maa*_*arx 12 java enums anonymous anonymous-class switch-statement
我在编译时得到一个我没想到的匿名类.相关代码如下,然后更详细的解释:
CircuitType.java的整体:
public enum CircuitType { V110A20, V110A30, V208A20, V208A30 }
Run Code Online (Sandbox Code Playgroud)
来自Auditor.java,第3-9行:
public class Auditor {
private String[] fileNames;
private int numV110A20;
private int numV110A30;
private int numV208A20;
private int numV208A30;
Run Code Online (Sandbox Code Playgroud)
来自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;
}
[...]
Run Code Online (Sandbox Code Playgroud)
从Circuit.java,第1-5行:
public class Circuit {
private CircuitType myType;
public CircuitType getType() {
return this.myType;
}
[...]
Run Code Online (Sandbox Code Playgroud)
当命令
javac *.java
Run Code Online (Sandbox Code Playgroud)
执行时,会生成一个匿名类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 {};
}
Run Code Online (Sandbox Code Playgroud)
我已经继续构建了一个小项目,其中包含您发布的源代码以及足够的框架来使其编译。我得到了 3 个类文件:Circuit.class、CircuitType.class 和 Auditor.class - 正如预期的那样。
这一切都在 Java 1.6 下进行。但正如其他人指出的那样,我认为你对问题的诊断是错误的。
匿名类很容易意外生成:通常是这样的构造
Circuit myCircuit = new Circuit() {
public CircuitType getCircuitType() {
return XXX;
}
}
Run Code Online (Sandbox Code Playgroud)
例如,将创建一个。如果你有更多的代码,优秀的 SO 人员也许能够查明你的错误。
使用javap或者更好的“真正的”Java 反汇编器(如JD.
更新
将您的新审核员代码添加到我的...没有变化。没有匿名类。
你的代码当然是正确的(在我们可以看到的范围内)但是设计不是很OO。switch有些人会指出,每次出现新的电路类型时,您都必须扩展您的反声明和声明。
您也没有充分利用枚举的“特殊功能”。我有一个你的Auditor方法的简化版本:
private int[] counters = new int[CircuitType.values().length];
public void tallySomething() {
Circuit newCircuit = new Circuit();
counters[newCircuit.getType().ordinal()]++;
}
Run Code Online (Sandbox Code Playgroud)
更新2
我发现你的javap输出很有启发性。请参阅下面我的评论。
我的结论:
switchmake并使用antJava 的匿名类和其他奇怪的东西。由于您仅因非标准编译设置而遇到问题,因此我会采用最后一个解决方案并解决那里的问题。