Ссылка на Общедоступное Перечисление приводит к Анонимному классу

Я получаю анонимный класс во время компиляции, что я не ожидаю. Соответствующие нормы следуют, затем более подробное объяснение:

Полнота 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 {};
}
12
задан Maarx 4 January 2010 в 20:17
поделиться

2 ответа

Я создал небольшой проект, содержащий размещенный вами исходный текст и достаточно фреймворка вокруг него, чтобы заставить его скомпилироваться. У меня есть 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 достаточно информативен. См. мой комментарий ниже.

Мои выводы:

  1. Да, очевидно, ваш Java имплант использует класс anon для переключателя. Отстойно, но законно.
  2. У вас есть следующие варианты:
    • устранить переключатель
    • использовать другую реализацию Java
    • жить с анонимным классом; ditch make и использовать ant, чтобы охватить аноновые классы и другие странности Java.

Так как у вас проблемы только из-за вашей нестандартной установки компиляции, я бы пошел с последним решением и атаковал бы проблему там.

4
ответ дан 2 December 2019 в 23:07
поделиться

Похоже, что (по крайней мере, в некоторых случаях) для оператора переключения будет сгенерирован внутренний класс:

Java enum и дополнительные файлы классов

3
ответ дан 2 December 2019 в 23:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: