Domanda

sto ricevendo una classe anonima a tempo di compilazione che non mi aspetto. Codice in materia consegue, quindi una spiegazione più dettagliata:

interezza della CircuitType.java:

public enum CircuitType { V110A20, V110A30, V208A20, V208A30 }

Da Auditor.java, linee 3-9:

public class Auditor {
    private String[] fileNames;
    private int numV110A20;
    private int numV110A30;
    private int numV208A20;
    private int numV208A30;

Da Auditor.java, le linee 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;
}
[...]

Da Circuit.java, linee 1-5:

public class Circuit {
    private CircuitType myType;
    public CircuitType getType() {
        return this.myType;
    }
[...]

Quando il comando

javac *.java

viene eseguito, un anonimo classe Sindaco $ 1.java viene generato. I file, ovviamente, tutti seduti uno accanto all'altro in una directory di sistema di file che contiene niente altro.

Quando le linee 104-121 sono commentate, nessuna classe anonima viene generato.

I in un primo momento pensato che fosse un problema di pacchetto, in modo da mettere le tre classi in un pacchetto, ma non sapevo abbastanza di pacchetti per farlo funzionare. Se è veramente un problema di pacchetto, qualcuno mi può scorrere esattamente come etichettarli? Preferirei non dover confezionare loro se io non devo, però.

Il motivo della classe anonima è un problema, oltre al fatto che tali classi di solito significano un problema di spazio dei nomi, è che mi si spezza il Makefile che uso per la compilazione automatica.

Aggiorna


In allegato è una sessione di console che spero possa far luce su questo mistero:

% javap 'Auditor$1'
Compiled from "Auditor.java"
class Auditor$1 extends java.lang.Object{
    static final int[] $SwitchMap$CircuitType;
    static {};
}
È stato utile?

Soluzione

Sono andato avanti e costruito un piccolo progetto che contiene la fonte che avete inviato e appena sufficiente quadro intorno ad esso per renderlo compilazione. Ho 3 file di classe: Circuit.class, CircuitType.class e Auditor.class - come previsto

.

Tutto questo sotto Java 1.6. Ma come altri hanno indicato, credo che la tua diagnosi del problema è spento.

classi anonime sono facili da generare casualmente: in genere un costrutto come

Circuit myCircuit = new Circuit() {
   public CircuitType getCircuitType() {
      return XXX;
   }
}

creerà uno, per esempio. Dato più del vostro codice, i buoni SO persone potrebbero essere in grado di individuare il vostro errore.

Potrebbe essere interessante e istruttivo smontare i file di classe con javap o meglio ancora un "vero" disassembler Java come JD.


Aggiorna

Aggiunto il nuovo codice Auditor al mio ... nessun cambiamento. Non ci sono classi anonime.

Il codice è naturalmente corretto (nella misura in cui possiamo vederlo), ma il design non è molto OO. Alcune persone avrebbero sottolineare che dovrete estendere le dichiarazioni del contatore e la sua dichiarazione switch ogni volta che appare un nuovo tipo di circuito.

Sei anche non facendo molto uso delle "caratteristiche speciali" di enumerazioni. Ho una versione molto semplificata del metodo Auditor:

   private int[] counters = new int[CircuitType.values().length];

   public void tallySomething() {
      Circuit newCircuit = new Circuit();
      counters[newCircuit.getType().ordinal()]++;
  }

Aggiorna 2

Ho trovato il vostro uscita javap abbastanza illuminante. Vedere il mio commento qui sotto.

Le mie conclusioni:

  1. Sì, a quanto pare i tuoi impl Java sta usando una classe anon per l'interruttore. Lame, ma legittima.
  2. Sono disponibili le seguenti opzioni:
    • eliminare il switch
    • utilizzare una diversa implementazione Java
    • vivere con la classe anonima; fosso make e utilizzare ant ad abbracciare le classi anon ed altre stranezze di Java.

Dal momento che hai solo problemi a causa della configurazione di compilazione non standard, mi piacerebbe andare con l'ultima soluzione ed attaccare il problema c'è.

Altri suggerimenti

Sembra, infatti, che (in alcuni casi almeno) una classe interna sarà generato per l'istruzione switch:

Java file enum e di classe aggiuntiva

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top