# Test$1.class mit dem javac compiler



## ben33 (10. Aug 2011)

ich hab hier ein kleines problem, bei dem ich nicht ganz mitkomme. das kompilieren einer klasse (siehe unten) mit dem befehl "javac Test.java" erzeugt 3 dateien:

Test.class
Test$1.class
Test$State.class

die datei Test$1.class scheint auf dem ersten blick eine annonyme klasse zu sein, es ist aber mit ziemlicher sicherheit der switch block, denn wenn ich diesen entferne, wird jene datei nicht erzeugt. eclipse hingegen erzeugt sowohl in eigenen bin verzeichnis als auch beim jar export nur die beiden dateien "Test.class" und "Test$State.class". und genau DAS will ich vom javac compiler auch.

warum also lagert javac den switch block in eine eigene class datei aus und wie kann ich das verhindern? was macht eclipse anders?

Test.java

```
public class Test implements Runnable {
	
	private State state;
	
	public Test() {
		this.state = State.NEW;
	}
	
	public void run() {
		loop: while (true) {
			switch (this.state) {
			case NEW:
				this.initialize();
				break;
				
			case S1:
				this.processState1();
				break;
				
			case S2:
				this.processState2();
				break;
				
			case S3:
				this.processState3();
				break;
				
			case FINISHED:
				this.finish();
				break loop;
			}
		}
	}
	
	public void initialize() {
		System.out.println("initialize");
		this.state = State.S1;
	}
	
	public void processState1() {
		System.out.println("state1");
		this.state = State.S2;
	}
	
	public void processState2() {
		System.out.println("state2");
		this.state = State.S3;
	}
	
	public void processState3() {
		System.out.println("state3");
		this.state = State.FINISHED;
	}
	
	public void finish() {
		System.out.println("finish");
	}

	public static void main(String[] args) {
		new Thread(new Test()).start();
	}

	public enum State {
		NEW,
		S1,
		S2,
		S3,
		FINISHED;
	}
}
```


----------



## AlexSpritze (10. Aug 2011)

Schau doch mit dem Java-Decompiler cavaj in die *.class Dateien rein. Dann siehst du was es wirklich ist.

PS: Wahrscheinlich wäre es sinnvoll das Enum in ein statisches Enum zu ändern, nur eine Vermutung: dann verschwindet auch die mysteriöse $1-Klasse


----------



## ben33 (10. Aug 2011)

der java decompiler ermittelt für die datei "Test$1.class" nur einen leeren klassenrahmen, aus dem von der witch-anweisung aus referenziert wird:

Test$1.class

```
class Test$1
{
}
```

Test.class

```
...
      switch (Test.1.$SwitchMap$Test$State[this.state.ordinal()]) {
      ...
```

die umwandlung in ein statisches enum bewirkt diesbezüglich rein gar nix... die frage also bleib wie kann ich diese datei-trennung verhinden (was eclipse ja schon tut)? hab ich ein compiler-flag übersehen?


----------



## SlaterB (10. Aug 2011)

vielleicht stehts hier
Java enum and additional class files - Stack Overflow

Suche '$SwitchMap java'


----------



## ben33 (10. Aug 2011)

verstehe ich das richtig? eclipse nutzt selbst den javac compiler gar nicht sonder hat was eigenes dabei?


----------



## musiKk (10. Aug 2011)

AlexSpritze hat gesagt.:


> PS: Wahrscheinlich wäre es sinnvoll das Enum in ein statisches Enum zu ändern, nur eine Vermutung: dann verschwindet auch die mysteriöse $1-Klasse



Ein nested Enum ist immer static. Vermutung: Ausprobieren ist besser als vermuten...



ben33 hat gesagt.:


> verstehe ich das richtig? eclipse nutzt selbst den javac compiler gar nicht sonder hat was eigenes dabei?



Korrekt.


----------



## SlaterB (10. Aug 2011)

das stimmt, man muss Java auch gar nicht installieren, nur Eclipse downloaden und starten


----------



## musiKk (10. Aug 2011)

SlaterB hat gesagt.:


> das stimmt, man muss Java auch gar nicht installieren, nur Eclipse downloaden und starten



Das ist etwas allgemein ausgedrückt. Ein JDK braucht man nicht, ein JRE natürlich schon.


----------

