Enum Abfrage ohne if, for, while oder switch

Xalo

Mitglied
Hallo Leute, ich habe Bald meine Klausur in Programmieren und mache gerade eine Altklausur als vorbereitung für meine Klausur, in einer Aufgabe muss ich ein Enum erstellen mit verschiedenen Farben und muss dann eine Methode schreiben, die mir True ausgeben soll wenn es einer der beiden Farben ist. Ich darf aber kein if, for, while oder switch benutzen. Kann mir jemand einen Tipp geben wie man das machen kann, ich habs zwar mit einer Do While probiert, aber das würde auch abzüge geben in der Klausur.

Das ist die konkrete Aufgabestellung:
Das enum soll ein eine
Methode boolean isMetallic() besitzen, die true zurückliefert, wenn es sich um
BLUE_METALLIC oder RED_METALLIC handelt. Sie dürfen Ihrer Enum-Implementierung kein if,
for, while oder switch verwenden.

Code:
public enum CarColor {

    BLUE,

    BLUE_METALlIC,

    RED,

    RED_METALLIC,

    WHITE,

    BLACK;


    public boolean isMetallic(CarColor carColor){

        do {


            return true;


        } while (carColor == BLUE_METALlIC | carColor == RED_METALLIC);


    }
 

Jw456

Top Contributor
Eine Möglichkeit könnte sein mit try and catch zu arbeiten.
Erstelle einen String und weise im das übergebe enum zu. Ist der String nicht dem Enum enthalten sollte eine Exception geworfen werden.

 

KonradN

Super-Moderator
Mitarbeiter
Also da ist wirklich die Frage, was denn da genau gefragt / gefordert ist. Aber ehe ich auf paar Möglichkeiten eingehe kurz eine Rückmeldung zu Deiner "Lösung":
Das ist so natürlich absoluter Quatsch (Nicht als Angriff gegen Dich / Deine Person gedacht. Das bezieht sich nur auf den Code!):
  • Die Methode gibt immer true zurück.
  • Die Signatur ist so Unsinn. Entweder ist es nicht statisch - dann wird aber keine CarColor zurückgegeben sondern die Methode wird auf einer aufgerufen. Oder sie ist statisch, dann muss ein Parameter übergeben werden.

Aber kommen wir zu Möglichkeiten, dies zu lösen:

a) Du kannst die Bedingung direkt zurück geben
return this == BLUE_METALLIC || this == RED_METALLIC;
(Das ist hier die Lösung denke ich - alles was folgt nur als weitere Ideen, die hier nicht anzuwenden sind!)

b) Ternaerer Operator. Dann wäre das etwas wie:
return (this == BLUE_METALLIC || this == RED_METALLIC) ? true : false;
Das ist zwar hier so auch relativer Quatsch, aber ich will es Dir nur kurz zeigen, da dies manchmal eine mögliche Lösung ist bei so Aufgaben. (Aber aus meiner Sicht ist das auch wie ein if!)

c) Man kann sich immer ein neues Kriterium schaffen - also z.B. den enum Wert als String nehmen und schauen, ob "METALLIC" im Namen vorkommt. Das hätte den Vorteil, dass es auch sofort funktioniert, wenn man weitere Werte hinzufügt.

d) Man kann zusätzliche Datenstrukturen schaffen. Die Enum Instanzen können eine boolean Instanzvariable haben, die angibt, ob etwas metallic ist. Dann braucht es nur noch den Konstruktor, der diese Variable setzt, jeder Wert bekommt in Klammern die Initialisierung und man hat ein Getter isMetallic().

d2) Eine andere Datenstruktur könnte sein, dass man sich eine Datenstruktur schafft, die alle Metallic Farben enthält. Also sowas wie Set.of (RED_METALLIC, BLUE_METALLIC) - und dann nutzt man die contains Methode zur Abprüfung.

...

Das einfach mal so als ein paar Ideen, was bei so Themen alles möglich ist.
 

KonradN

Super-Moderator
Mitarbeiter
Eine Möglichkeit könnte sein mit try and catch zu arbeiten.
Erstelle einen String und weise im das übergebe enum zu. Ist der String nicht dem Enum enthalten sollte eine Exception geworfen werden.

Nur eben geht es nicht um ein Parsen von String in eine Enum Instanz. Die Methode wird ja bereits auf der Enum aufgerufen.
 

httpdigest

Top Contributor
Außerdem denke ich, dass die Signatur der in seiner Lösung vorgeschlagenen Methode falsch ist. Warum sollte die Methode eine Instanz von CarColor übergeben bekommen. Man ruft sie ja auf einer CarColor auf...
Das ist die konkrete Aufgabestellung:
Das enum soll ein eine Methode boolean isMetallic() besitzen, die true zurückliefert, wenn es sich um
 

KonradN

Super-Moderator
Mitarbeiter
Außerdem denke ich, dass die Signatur der in seiner Lösung vorgeschlagenen Methode falsch ist. Warum sollte die Methode eine Instanz von CarColor übergeben bekommen. Man ruft sie ja auf einer CarColor auf...
Ja, das hatte ich ja auch schon erwähnt. Wobei ich die beiden Optionen genannt hatte - die Aufgabe aber recht deutlich ist:
boolean isMetallic()
Damit ist ja dann die Signatur eigentlich schon gegeben.
 

httpdigest

Top Contributor
Oh sorry @KonradN , das hatte ich bei dir leider überlesen.
Dann gäbe es aus meiner Sicht nur zwei mögliche sinnvolle Lösungen: Eine wie von dir vorgeschlagen oder eine mit Subclassing der beiden Enum-Literale mit Überschreiben der isMetallic() Methode per return true
Also:
Java:
public enum CarColor {
  BLUE,
  BLUE_METALlIC {
    public boolean isMetallic() { return true; }
  },
  RED,
  RED_METALLIC {
    public boolean isMetallic() { return true; }
  },
  WHITE,
  BLACK;
  public boolean isMetallic() { return false; }
}
 

KonradN

Super-Moderator
Mitarbeiter
So Subclassing ist ein interessanter Ansatz, aber das habe ich so noch nicht wirklich in einem Projekt gesehen.

Da wäre mir die Idee mit der Instanzvariable (Meine Option d) lieber:
Java:
public enum CarColor {
    BLUE(false),
    BLUE_METALlIC(true),
    RED(false),
    RED_METALLIC(true),
    WHITE(false),
    BLACK(false);

    private boolean metallic;
    
    CarColor(boolean metallic) { this.metallic = metallic; }

    public boolean isMetallic() { return metallic; }
}

Aber das ist wohl geschmackssache.
 

Neumi5694

Top Contributor
Alternativ zum Boolean Parameter:
Java:
public enum CarColor {
    BLUE, BLUE_METALlIC, RED, RED_METALLIC, WHITE, BLACK;

    public boolean isMetallic(CarColor carColor){
        return metallics.contains(this);
        //wenn man die Variable lokal halten will, dann EnumSet.of(CarColor.BLUE_METALLIC,CarColor.RED_METALLIC).contains(this);
    }
    //Habe das Set per unmodifiable geschützt, geht natürlich auch ohne.
    private static final Set<CarColor> metallics = Collections.unmodifiableSet(EnumSet.of(CarColor.BLUE_METALLIC,CarColor.RED_METALLIC));
}

Besser finde ich allerdings die von KonradN genannte Methode mit dem Boolean-Parameter, da es sich um eine Eigenschaft der Farbe handelt, die also auch mit in den Konstruktor gehört.
Das ist nur eine programmtechnische Alternative, die dann interessant wird, wenn es mehrer solcher Boolean-Auswertungen gibt. Anstatt dann für jede eigenSchaft einen Boolean-Wert im Konstruktor zu haben, kann so die einzelnen Kategorien anlegen und abfragen.
 
Zuletzt bearbeitet:

Xalo

Mitglied
So Subclassing ist ein interessanter Ansatz, aber das habe ich so noch nicht wirklich in einem Projekt gesehen.

Da wäre mir die Idee mit der Instanzvariable (Meine Option d) lieber:
Java:
public enum CarColor {
    BLUE(false),
    BLUE_METALlIC(true),
    RED(false),
    RED_METALLIC(true),
    WHITE(false),
    BLACK(false);

    private boolean metallic;
   
    CarColor(boolean metallic) { this.metallic = metallic; }

    public boolean isMetallic() { return metallic; }
}

Aber das ist wohl geschmackssache.
Danke @KonradN und den anderen für eure Hilfe, hat mir extrem weitergeholfen und ich konnte meine Aufgabe damit erledigen :)
 

temi

Top Contributor
Java:
public boolean isMetallic(CarColor carColor){
    return carColor == BLUE_METALLIC || carColor == RED_METALLIC;
}
 

httpdigest

Top Contributor
Ich hab das etwas anders gemacht,
Java:
public boolean isMetallic(){
    return this == BLUE_METALLIC || this == RED_METALLIC ? true: false;
}
Das Ergebnis von this == BLUE_METALLIC || this == RED_METALLIC ist bereits boolesch, also kannst du den ternären Operator auch einfach weglassen.
Jegliche Form von <expression> ? true : false ist überflüssig und kann zu <expression> geändert werden.
 

KonradN

Super-Moderator
Mitarbeiter
Ich hab das etwas anders gemacht,
Dann bitte ohne ternaeren Operator! Der ist einfach unnötig. Der Ausdruck ergibt doch bereits true bzw. false. Du gibst also das Ergebnis des Ausdrucks zurück und daher kannst (und solltest Du auch!) das Ergebnis direkt zurück geben. Das hatte ich eigentlich doch auch genau so beschrieben:

a) Du kannst die Bedingung direkt zurück geben
return this == BLUE_METALLIC || this == RED_METALLIC;
(Das ist hier die Lösung denke ich - alles was folgt nur als weitere Ideen, die hier nicht anzuwenden sind!)

Und bezüglich des Ternaeren Operators hatte ich auch deutlich geschrieben:
b) Ternaerer Operator. Dann wäre das etwas wie:
return (this == BLUE_METALLIC || this == RED_METALLIC) ? true : false;
Das ist zwar hier so auch relativer Quatsch, aber ich will es Dir nur kurz zeigen, da dies manchmal eine mögliche Lösung ist bei so Aufgaben. (Aber aus meiner Sicht ist das auch wie ein if!)
 

Xalo

Mitglied
Yes habs auch so gemacht, hab das von oben kopiert gehabt und vergessen zu löschen :)
Dann bitte ohne ternaeren Operator! Der ist einfach unnötig. Der Ausdruck ergibt doch bereits true bzw. false. Du gibst also das Ergebnis des Ausdrucks zurück und daher kannst (und solltest Du auch!) das Ergebnis direkt zurück geben. Das hatte ich eigentlich doch auch genau so beschrieben:



Und bezüglich des Ternaeren Operators hatte ich auch deutlich geschrieben:
 

Neumi5694

Top Contributor
Wenn's mal etwas flexibler sein darf, kannst du ja so was wie Tags verwenden

Java:
//Konstruktor
CarColor(CoatingProperty... properties) {
    ...
}

public boolean is(CoatingProperty prop) {
    return prop != null && coatingProperties.contains(prop);
}
private EnumSet<CoatingProperty> coatingProperties = ...;
 

httpdigest

Top Contributor
Das ist ja das, was ich in #9 geschrieben hatte. Nur ist bei mir die Methode nicht abstrakt, weil nur zwei der Enumliterale eine von return false abweichende Implementierung haben und somit ein guter Default schon angegeben werden kann.
Es gibt also keinen Grund, warum wirklich jedes Enumliteral die Methode überschreiben muss.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Enum-Variabel-Abfrage funktioniert nicht? Java Basics - Anfänger-Themen 2
P Enum oder normale Klasse? Java Basics - Anfänger-Themen 10
volcanos enum und switch (neu): falschen Wert mit IllegalArgumentException oder mit EnumConstantNotPresentException abfangen ? Java Basics - Anfänger-Themen 51
U Warum kann ich die Methode in der ENUM Klasse nicht aufrufen? Und warum geht die Switch nicht? Java Basics - Anfänger-Themen 8
D Frage bzgl. Enum-Handhabung Java Basics - Anfänger-Themen 16
S Java Enum Java Basics - Anfänger-Themen 2
I Validation, ob String ein Wert aus einem Enum enthält Java Basics - Anfänger-Themen 3
V Enum Java Basics - Anfänger-Themen 1
C Farben als Enum Java Basics - Anfänger-Themen 3
N enum Attribut von Objekten einer Hashmap ausgeben Java Basics - Anfänger-Themen 6
I JAXB und Enum Java Basics - Anfänger-Themen 7
M Enum-Variable HashMap zuweisen Java Basics - Anfänger-Themen 5
B Enum innerhalb einer Klasse / anderes Konzept Java Basics - Anfänger-Themen 8
N Enum Typen, was passiert intern mit ihnen? Java Basics - Anfänger-Themen 2
A enum Java Basics - Anfänger-Themen 6
O Enum Array Rekursiv abarbeiten Java Basics - Anfänger-Themen 44
B ENUM to List<String> konvertieren Java Basics - Anfänger-Themen 2
N Java Enum converter Methode Java Basics - Anfänger-Themen 5
F Enum von Ländern Java Basics - Anfänger-Themen 8
J Klassen Enum als Informationsträger Java Basics - Anfänger-Themen 10
T Datentypen enum static Chaos (blutiger anfänger) Java Basics - Anfänger-Themen 5
R Enum ist das gleiche wie? Java Basics - Anfänger-Themen 15
P Klassen Richtige Anwendung einer Enum-Klasse Java Basics - Anfänger-Themen 11
E Datentypen Problem beim Speichern von enum. Java Basics - Anfänger-Themen 10
J Compiler-Fehler class interface or enum expected Java Basics - Anfänger-Themen 1
E Objektvergleich Enum Java Basics - Anfänger-Themen 7
kilopack15 Euromünzen in enum als Liste ausgeben Java Basics - Anfänger-Themen 11
N Enum als generischer Typ Java Basics - Anfänger-Themen 4
H Datentypen Fehler bei Verwendung von enum Java Basics - Anfänger-Themen 9
lBlKha0s Fehlermeldung : class interface or enum expected Java Basics - Anfänger-Themen 9
T error: class, interface, or enum expected Java Basics - Anfänger-Themen 5
S Menüauswahl per Enum Java Basics - Anfänger-Themen 12
F Enum via String definieren Java Basics - Anfänger-Themen 2
L Compiler-Fehler error: class, interface or enum expected Java Basics - Anfänger-Themen 2
M java.lang.Enum.valueOf(Unknown Source) Java Basics - Anfänger-Themen 2
P Fallunterscheidung mit Überprüfung (enum) Java Basics - Anfänger-Themen 11
H enum Type Java Basics - Anfänger-Themen 6
F Operatoren Enum aus Textdabei laden Java Basics - Anfänger-Themen 3
P enum: cannot be resolved to a type Java Basics - Anfänger-Themen 2
kaoZ Variablen Konstantensammlung vs. Enum Java Basics - Anfänger-Themen 9
H Enum außerhalb einer Klasse? Java Basics - Anfänger-Themen 2
K OOP Aufzählungstypen! enum Currency!!! Java Basics - Anfänger-Themen 5
F ENUM als Variable Java Basics - Anfänger-Themen 4
M Enum: Zugriff auf Konstanten Java Basics - Anfänger-Themen 7
W Enum Konstruktor Type Java Basics - Anfänger-Themen 2
A Erste Schritte ENUM - Werte zurückgeben Java Basics - Anfänger-Themen 5
D Enum als Parameter Java Basics - Anfänger-Themen 6
B Variablen Instanz von Enum zur Laufzeit erstellen und zuweisen Java Basics - Anfänger-Themen 2
B Datentypen Enum vererben/gruppieren? Java Basics - Anfänger-Themen 6
F Datentypen enum Java Basics - Anfänger-Themen 5
J Enum zählen Java Basics - Anfänger-Themen 8
D Einlesen eines Enum-Wertes per console Java Basics - Anfänger-Themen 3
K String mit ENUM vergleichen? Java Basics - Anfänger-Themen 6
N enum vergleiche Klammern? Java Basics - Anfänger-Themen 5
J public enum? in Java Java Basics - Anfänger-Themen 9
D Erste Schritte Enum - das unbekannte Wesen Java Basics - Anfänger-Themen 3
Y ENUM auslesen (Name des ENUM als Variable) Java Basics - Anfänger-Themen 4
P Compiler-Fehler "class, interface, or enum expected" Java Basics - Anfänger-Themen 5
K class, interface or enum expected Java Basics - Anfänger-Themen 14
pg1337 enum-Aufgabe Java Basics - Anfänger-Themen 5
N was sagt enum aus? Java Basics - Anfänger-Themen 3
S Methoden Enum Parameter in Methode Java Basics - Anfänger-Themen 7
G Datentypen enum Frage Java Basics - Anfänger-Themen 3
R Probleme mit Enum Java Basics - Anfänger-Themen 10
B Enum: Instanzen Java Basics - Anfänger-Themen 10
B Generic? Enum - So lösbar? Java Basics - Anfänger-Themen 8
T class, interface, or enum expected Java Basics - Anfänger-Themen 2
M Vererbung Enum Vererbung/Polymorphie Java Basics - Anfänger-Themen 2
P Enum Attribut in Konstruktoren Java Basics - Anfänger-Themen 10
4 Enum Problem Java Basics - Anfänger-Themen 2
turmaline Bindestrich in enum? Java Basics - Anfänger-Themen 5
T Enum - Key als Value ermitteln Java Basics - Anfänger-Themen 7
X enum Fehlermeldung "The public type Day must be defined in its own file" Java Basics - Anfänger-Themen 8
T ist enum.ordinal keine Konstante? Java Basics - Anfänger-Themen 7
R State machine mit enum Java Basics - Anfänger-Themen 9
L enum aus Integer umwandeln Java Basics - Anfänger-Themen 3
C Klasseninstanzierung mit enum-Parameter erzwingen Java Basics - Anfänger-Themen 2
I Enum in String Java Basics - Anfänger-Themen 4
N enum richtig verwenden Java Basics - Anfänger-Themen 5
M for(Enum..., ButtonGroup.getElements()... Java Basics - Anfänger-Themen 3
StrikeTom Fragen zu enum Java Basics - Anfänger-Themen 4
A Was ist performanter für Konstanten, enum oder static variablen Java Basics - Anfänger-Themen 5
L String zu Enum parsen Java Basics - Anfänger-Themen 8
J Datentypen Array in enum, ?? Wozu ?? Java Basics - Anfänger-Themen 3
S OOP Durch ein Enum iterieren... Java Basics - Anfänger-Themen 47
K Datentypen enum und liste Java Basics - Anfänger-Themen 7
S String - Enum Java Basics - Anfänger-Themen 3
H Eine enum switchen? Java Basics - Anfänger-Themen 7
G enum für Typsicherheit Java Basics - Anfänger-Themen 9
J class, interface, or enum expected - finde Fehler nicht. Java Basics - Anfänger-Themen 4
J OOP enum Java Basics - Anfänger-Themen 2
O Problem (Enum) Java Basics - Anfänger-Themen 14
S Enum als Index Java Basics - Anfänger-Themen 5
H Enum --> int ?? Java Basics - Anfänger-Themen 3
tanja enum in java Java Basics - Anfänger-Themen 3
D class, interface or enum expected Java Basics - Anfänger-Themen 2
A OOP Übergabe eines Wertes an den enum Konstruktor Java Basics - Anfänger-Themen 12
T Simple Enum Fragen Java Basics - Anfänger-Themen 6
J class, interface, or enum expected Java Basics - Anfänger-Themen 4
R Enum und dann setter Setzen? Java Basics - Anfänger-Themen 44

Ähnliche Java Themen

Neue Themen


Oben