Java Enum mit Konstruktoren verwenden

Sponny

Lt. Commander
Registriert
März 2008
Beiträge
1.046
Hallo liebe Community,

leider komme ich mit der Enum auf keinen grünen Zweig.

Code:
	enum Land {Heimat, Hul, Tam, Tamm}
	
	private Land land;
	
	Class(Land land){
			this.land = land;
	}

		Class b1 = new Class(Land.Heimat, "b1");
		Class b2 = new Class(Land.Heimat, "b2");
		
		
		System.out.println(b2.equals(b3));

Normalerweise müsste die equals Methode ein "true" liefern, da ich beide länder gleich gesetzt habe. Ich habe aber so das gefühl das ich syntaktisch irgendetwas übersehen habe und die Objektvariable daher nicht richtig initialisiert wird.
Sie liefert nämlich false...
Könnt ihr mir sagen wo mein fehler liegt. :)?
 
Hallo Sponny,

Du müsstest an dieser Stelle "equals" passend für dich überschreiben.

Ansonsten wird die "default" Implementierung von Object genommen, wo letztlich wieder nur Referenzen verglichen werden. Da das hier zwei verschiedene Objekte sind, gibt dein Vergleich "false".

Default implementation of equals() class provided by java.lang.Object compares memory location and only return true if two reference variable are pointing to same memory location i.e. essentially they are same object.

Mehr dazu hier: http://javarevisited.blogspot.in/2011/02/how-to-write-equals-method-in-java.html
 
Oh man, danke schon einmal.

Wenn ich nun aber eine Ausgabe mache:

Code:
	Tribe getTribe(){
		return this.tribe;
	}

		System.out.println(b1.getLand());

Dann bekomme ich immer als Ausgabe Heimat, obwohl ich bei der Erstellung der Objekte zwei verschiedene genommen habe. Da initialisiert er irgendwie nicht so wie gewollt.
 
Zuletzt bearbeitet:
Was um alles in der Welt machst oder versuchst Du da bitte??

im Code-Beispiel sieht man:
- einen Konstruktor für die Klasse "Class" (Ich fange gar nicht mit der Frage an, warum Du eine Klasse mit so einem elementaren, von Java selbst verwendeten Namen schreiben willst - nur so viel: eine gute Idee ist das SICHER nicht.), der einen Parameter (nämlich die oben definierte Enum) entgegennimmt.
- einen Aufruf für einen Konstruktor einer (merke: "einer", nicht "dieser" - ich vermute nämlich Du erzeugst damit eine andere "Class"-Klasse) Klasse "Class" mit ZWEI Parametern. Das ist somit sicher nicht der Konstruktor, den Du oben definiert hast.
- dann einen Aufruf der equals-Methode der erzeugten Class-Objekte. Wie transdenzentral schreibt, wird hier vermutlich die java-default-equals-Implementierung aufgerufen.

im Code-Beispiel sieht man NICHT:
- eine Enum mit Konstruktoren (wie im Titel des Threads genannt).
Sowas geht nämlich so:

Code:
public enum TestEnum {
    Type1("X"), Type2("Y");
    String innerString;
    private TestEnum(String innerString) {
        this.innerString = innerString;
    }
}
 
psychead schrieb:
Was um alles in der Welt machst oder versuchst Du da bitte??

im Code-Beispiel sieht man:
- einen Konstruktor für die Klasse "Class" (Ich fange gar nicht mit der Frage an, warum Du eine Klasse mit so einem elementaren, von Java selbst verwendeten Namen schreiben willst - nur so viel: eine gute Idee ist das SICHER nicht.), der einen Parameter (nämlich die oben definierte Enum) entgegennimmt.
- einen Aufruf für einen Konstruktor einer (merke: "einer", nicht "dieser" - ich vermute nämlich Du erzeugst damit eine andere "Class"-Klasse) Klasse "Class" mit ZWEI Parametern. Das ist somit sicher nicht der Konstruktor, den Du oben definiert hast.
- dann einen Aufruf der equals-Methode der erzeugten Class-Objekte. Wie transdenzentral schreibt, wird hier vermutlich die java-default-equals-Implementierung aufgerufen.

im Code-Beispiel sieht man NICHT:
- eine Enum mit Konstruktoren (wie im Titel des Threads genannt).
Sowas geht nämlich so:

Code:
public enum TestEnum {
    Type1("X"), Type2("Y");
    String innerString;
    private TestEnum(String innerString) {
        this.innerString = innerString;
    }
}

In meinem Code heißt die Klasse anders. Sorry das hätte ich noch dazu schreiben sollen!
Das hat mir schon sehr weitergeholfen. Ich habe mit Java auch erst vor einem Monat angefangen...^^
Eine kleine Frage habe ich da noch. Wie baue ich nun einen Konstruktor der Objekte erzeugt mit einem Enum Wert + einer anderen Objektvariable?
 
Nur ein paar Tips:
- Du kannst für eine Enum keinen Konstruktor schreiben, mit dem Du der Enum bei der Instantiierung irgendwelche Parameter mitgeben kannst. Für sowas sind Enums nicht gedacht.
- Du KANNST bei der Definition der Enum aber einen Werte an eine Enum-Ausprägung "anhängen", die Du dann nacher auch als Methode der Enum rausgeben kannst:
Code:
public enum CountryEnum {
    DEUTSCHLAND("Berlin"), ITALIEN("Rom");
    private String capitalString;
    private CountryEnum(String capitalString) {
        this.capitalString = capitalString;
    }
    public String getCapital() {
        return capitalString;
    }
}
class Runner {
    public static void main(String[] args) {
        CountryEnum e = CountryEnum.DEUTSCHLAND;
        System.out.println(e.getCapital());
    }
}
(Hinweis: Die equals-Implementierung ist von Eclipse generiert, ich hab sie dann noch gekürzt, sonst hätte sie den String auch noch für den Vergleich verwendet)

Wenn Du dagegen erreichen willst, dass Du Ausprägungen der enums mit zusätzlichen Informationen versehen willst, wobei ein "equals"-Vergleich genau dann true liefert, wenn die verwendeten enums identisch sind, könnte sowas SO aussehen:
Code:
public enum CountryEnum {
    DEUTSCHLAND, ITALIEN;
}

class CountryEnumWrapper {
    private CountryEnum e;
    private String description;
    public CountryEnumWrapper(CountryEnum e, String description) {
        this.e = e;
        this.description = description;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        CountryEnumWrapper other = (CountryEnumWrapper) obj;
        if (e != other.e)
            return false;
        return true;
    }
}
class Runner {
    public static void main(String[] args) {
        CountryEnumWrapper wrapper1 = new CountryEnumWrapper(CountryEnum.DEUTSCHLAND, "A");
        CountryEnumWrapper wrapper2 = new CountryEnumWrapper(CountryEnum.DEUTSCHLAND, "B");
        CountryEnumWrapper wrapper3 = new CountryEnumWrapper(CountryEnum.ITALIEN, "I");
        System.out.println(wrapper1.equals(wrapper2)); // liefert true
        System.out.println(wrapper1.equals(wrapper3)); // liefert false
    }
}

Das war jetzt etwas ausführlicher als die vorige Antwort - da war ich noch zu schockiert :-D
 
Zuletzt bearbeitet:
Code:
public class EineKlasse
{
  private DeinEnum deinEnum;
  private string einText;

  public EineKlasse (DeinEnum deinEnum, string einText)
  {
			    this.deinEnum = deinEnum;
    this.einText = einText;
  }
	}

Ich würde vermuten so in etwa, ohne Java wirklich zu kennen. Google sollte aber auch helfen.
 
Super Danke. Jetzt klappts einwandfrei. Hatte noch einen anderen kleinen Fehler im Konstruktor. :)
 
Zurück
Oben