Я получаю анонимный класс во время компиляции, что я не ожидаю. Соответствующие нормы следуют, затем более подробное объяснение:
Полнота 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 комментируются, никакой анонимный класс не сгенерирован.
Я на первый взгляд, это была проблема пакета, так помещаю эти три класса в пакет, но я не знал достаточно о пакетах для получения его работа. Если это - истинно проблема пакета, кто-то может ступить меня через точно, как маркировать их? Я не должен упаковывать их, если я не имею к, все же.
Причина анонимный класс является проблемой помимо того, что такие классы обычно показывают проблему пространства имен, состоит в том, что он повреждает мой Make-файл, который я использую для автоматической компиляции.
Обновление
Присоединенный консольная сессия, которая я надеюсь, может пролить свет на эту тайну:
% 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
.
Обновление
Добавили ваш новый код аудитора к моему... без изменений. Анонимных классов нет.
Ваш код, конечно, корректен (насколько мы его видим), но дизайн не очень OOO. Некоторые указывают на то, что вам придется расширять ваши встречные декларации и ваше switch
утверждение каждый раз, когда появляется новый тип схемы.
Вы также не очень-то пользуетесь "особыми свойствами" перечислений. У меня есть значительно упрощенная версия вашего метода Auditor
:
private int[] counters = new int[CircuitType.values().length];
public void tallySomething() {
Circuit newCircuit = new Circuit();
counters[newCircuit.getType().ordinal()]++;
}
Update 2
Я обнаружил, что ваш вывод javap
достаточно информативен. См. мой комментарий ниже.
Мои выводы:
make
и использовать ant
, чтобы охватить аноновые классы и другие странности Java.Так как у вас проблемы только из-за вашей нестандартной установки компиляции, я бы пошел с последним решением и атаковал бы проблему там.
Похоже, что (по крайней мере, в некоторых случаях) для оператора переключения будет сгенерирован внутренний класс: