# enum richtig verwenden



## nossek (22. Jul 2010)

Guten Morgen,

derzeit versuche ich mich an enums. (zB. um bei einem Konstruktor als Argument für das Geschlecht nicht "true" oder "false" übergeben zu müssen!):

```
enum Geschlecht {MAENNLICH, WEIBLICH};

public class Person {   
    final private String name;
    final private Geschlecht geschlecht;

    public Person(String name, Geschlecht geschlecht){
        this.name = name;
        this.geschlecht = geschlecht;
    }
}
```

Die Main Methode sieht dann so aus:

```
public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("Michael", Geschlecht.MAENNLICH);       
    }
}
```
Das funktioniert zwar, gefällt mir aber nicht.
1. warnt der Compiler in Zeile 7 von Person.java: "Exporting non-public type through public API".
2. Warum muß "enum Geschlecht..." VOR "class Person..." stehen? Mir erschiene es sinnvoller, das diese Aufzählung ein statisches Attribut der Klasse Person wäre - oder ist das ein Holzweg? Das habe ich jedenfals nicht hinbekommen.

(nebenbei: ist das soweit plausibel, das name und geschlecht final sind - die Möglichkeit der Geschlechtsumwandlung einmal ausgeschlossen?!)

für jeden Hinweis dankbar: nosek


----------



## Marcinek (22. Jul 2010)

Hallo,

es ist nicht plausibel, dass enum vor class steht.

Versuche mal eine public enum Geschlecht{} zu bauen. Also in eine eigenständige klasse.

Dann kann man da auch weitere Methoden einbauen ;D



Gruß,

Martin


----------



## Der Müde Joe (22. Jul 2010)

zu1

Der Konstruktor Person ist public aber die enum nicht: Es kann bei der Person nie der Konstruktor mit einem nicht null Geschlecht erstellt werden. Oder anderst gesagt: Niemand sieht das Geschlecht.

zu2:
Ein File kann nur eine public class/interface beherbergen (toplevel). Ausser du macht innere Klassen, was auch hier am besten wäre.

EDIT:
also so:

```
public class Person {

	public enum Gender {
		MALE, FEMALE
	};

	private final String name;
	private final Gender gender;

	public Person(String name, Gender gender) {
		this.name = name;
		this.gender = gender;
	}
}
```


----------



## nossek (22. Jul 2010)

Danke Marcinek und müder Joe für die schnellen Antworten!



> Versuche mal eine public enum Geschlecht{} zu bauen. Also in eine eigenständige klasse.



Werde ich bald mal versuchen, für diese Anwendung scheints mir übertrieben, wenns grad nur darum geht, im Konstruktoraufruf für das Geschlecht nicht "true" oder "false" zu schreiben (klar, true wäre dann natürlich weiblich  )

Müder Joe, das was Du vorschlägst habe ich schon versucht, leider komt dann beim Konstruktoraufruf in der Main-Methode..

```
Person p1 = new Person("Claudia", Gender.FEMALE);
```
...die Fehlermeldung "canot find Symbol, variable Gender....". Obwohl mir beim schreiben von "Gender." korrekterweise MALE und FEMALE angeboten werden.

???


----------



## Der Müde Joe (22. Jul 2010)

```
Person p1 = new Person("Claudia", Person.Gender.FEMALE);
```


----------



## nossek (22. Jul 2010)

Jaaaaa, da hätt ich auch selber drauf kommen können. Bin ich aber nicht!

Danke, Thema erledigt!


----------

