Menüauswahl per Enum

sMuve

Mitglied
Hallo liebe Java-Freunde,

ich hänge momentan bei einer Aufgabe fest. Ich weiß allerdings nicht ob ich grade einfach nicht verstehe, was genau verlangt wird oder ich einfach keine realisierbare Lösung finde.

Bevor ich mit meinem Problem beginne, möchte ich noch sagen, dass ich nur die Grundlagen der OOP kenne (Vererbung, Interfaces und co.), da ich mich grade am Anfang meines Studiums befinde.

Wir sollen für einen Shop ein Enum erstellen, dass quasi die bisherige Menüauswahl (List, Register, Adjust_stock, exit) ersetzt.

Das würde dann ja quasi wie folgt aussehen:
Java:
public enum MenuOption {
LIST, REGISTER, ADJUST_STOCK, EXIT;
}

Nun ist aber folgendes gefragt:
Implementieren Sie in MenuOption eine Methode optionForNumber, welche einem Parameter vom Typ int ein EnumObjekt zuordnet.

Wie ordne ich also einem Parameter vom Typen int ein EnumObjekt per Methode zu ?
Ich weiß zwar, dass man den Enums einen beliebigen Index zuweisen kann indem man hinter das Enum in () eine Zahl schreibt, jedoch ist hier ja gefordert, dass man eine Methode nutzen soll.
 
Zuletzt bearbeitet von einem Moderator:

JStein52

Top Contributor
So was:

Java:
static int optionForNumber(String name ){
  try{
    return MenuOption.valueOf( name ).ordinal();
  }
  catch(IllegalArgumentException e ){
    return–1;
  }}
 

JStein52

Top Contributor
Oder so:

Java:
        public enum MenuOption {a, b;
            static public MenuOption optionForNumber(int id) {
                if (a.ordinal() == id)
                    return a;
                else if (b.ordinal() == id)
                    return b;
                else
                    return null;
            }
        }

Aber auch da verstehe ich den Sinn nicht. :):)

Obwohl .... du kannst jetzt MenuOption.optionForNumber(2) aufrufen und erhätlst die zugehörige Option. Also das was verlangt war
 
Zuletzt bearbeitet:

sMuve

Mitglied
Naja als Parameter soll ja nen int-Wert übergeben werden und dem ein EnumObjekt zugewiesen werden, daher wäre der 2. Vorschlag näher dran denke ich. Das ganze soll so gemacht werden weil wir danach folgendes machen sollen
Passen Sie nun die main-Methode der Klasse ProductManager so an, dass intern
MenuOption-Objekte statt ints verwendet werden, die Funktionalität aber unverändert
bleibt. Verwenden Sie hierbei die optionsForNumber-Methode, um die eingegebenen
int-Werte umzuwandeln.

Vorher hatten wir im ProductManager:
Java:
public class ProductManager {

    public static final int LIST = 0;
    public static final int REGISTER = 1;
    public static final int ADJUST_STOCK = 2;
    public static final int EXIT = 3;

    /**
     * Provides a command line interface to interact with the product management
     * system for an online shop
     *
     * @param args
     */
    public static void main(String[] args) {
        Warehouse warehouse = new Warehouse();
        warehouse.registerProducts(Warehouse.preloadInitialDataSet());
        System.out.println("Welcome to the online shop product management");
        boolean running = true;
        while (running) {
            System.out.println("Please, enter one of the following commands:" + "\n0 to list all products"
                    + "\n1 to register a new product" + "\n2 to adjust stock levels" + "\n3 to exit.");
            int command = IOTools.readInt();
            switch (command) {
                case LIST :
                    warehouse.printInventory();
                    break;
                case REGISTER :
                    Product p;
                    switch (IOTools.readChar("Do you want to add a book (b) or a television (t)?")) {
                        case 'b' :
                        case 'B' :
                            p = Book.createBookFromUserinput();
                            break;
                        case 't' :
                        case 'T' :
                            p = Television.createTelevisionFromUserinput();
                            break;
                        default :
                            continue;
                    }
                    warehouse.registerProducts(p);
                    System.out.println("The following product has been added to the catalog:\n" + p.toString());
                    break;
                case ADJUST_STOCK :
                    int id = IOTools.readInt("Please, enter product id:");
                    int stock = IOTools.readInt("Please, enter new stock level:");
                    warehouse.setStockForProductById(id, stock);
                    break;
                case EXIT :
                    running = false;
                    break;
                default :
                    System.out.println("Unknown command: " + command);
                    break;
            }
        }
        System.out.println("Byebye!");
    }
}

Somit müssten wir dann ja
Java:
  int command = IOTools.readInt();
ändern und die Klassenvariablen, welche wir durch Enums ersetzt haben, weglassen
 
Zuletzt bearbeitet von einem Moderator:

sMuve

Mitglied
okay, hab es so hinbekommen :)

Da ich allerdings 5 "if-Fälle" habe, wäre hier noch die Frage ob man das gescheit mit nem switchCase machen könnte.
Die ordinal von enum beginnen ja immer mit 0, also würde nur sowas wie
Code:
switch(selection){
case 0:
return LIST; break;
case 1:
return REGISTER; break;
etc.....}
möglich sein oder ?
Damit würde die Methode ja immer noch den übergebenen int-Wert in ein Enum-Objekt vom Typ MenuOption umwandeln oder ?
 

JStein52

Top Contributor
Das mit dem Switch hatte ich auch überlegt aber nicht gewusst wie das zu bewerkstelligen ist. Du musst doch nacheinander die ordinal-Zahl der einzelnen Options abfragen ??!! Und ich weiss nicht ob man vorraussetzen kann dass die von 0 ... irgendwas lückenlos durchnummeriert sind ? Was ist denn selection bei dir ?
 

sMuve

Mitglied
Java:
    public static MenuOption operationForNumber(int selection)
    {
        switch(selection){
        case 0:
            return LIST; break;
        case 1:
            return REGISTER; break;
        case 2:
            return ADJUST_STOCK; break;
        case 3:
            return SHIP; break;
        case 4:
            return EXIT; break;
        }

selection ist also der int-Wert, den die Methode übergeben kriegt.

Die Methode funktioniert auch von 0-4 ohne Probleme, allerdings nur wenn ich die breaks weglasse, welche aber da sein sollten ^^

Enums hatte ich ja grad erst, aber so wie ich es der Vorlesung entnehmen konnte, beginnen die ordinal-Werte immer bei 0 und werden dann immer mit n+1 fortgesetzt, so dass man von einer lückenlosen Durchnummerierung ausgehen kann.
 
Zuletzt bearbeitet von einem Moderator:

JStein52

Top Contributor
Ja ok. Dann passt es so. Da vor dem break eh ein return steht ist es egal. Aber ein default mit return null solltest du schon einbauen. Was ist wenn jemand die Methode mit dem Wert 10 aufruft ?
 

sMuve

Mitglied
Was passiert, wenn man einen Wert außerhalb des Enum Bereiches aufruft wird nirgends beschrieben. Meine Idee war, dafür einfach ein SysO mit "Wert nicht vorhanden" oder ähnlichem einzubauen. Allerdings ist unser return Typ ja MenuOption und somit kein SysO möglich oder ?

EDIT:
Java:
    public static MenuOption operationForNumber(int selection)
    {
        switch(selection){
        case 0:
            return LIST; break;
        case 1:
            return REGISTER; break;
        case 2:
            return ADJUST_STOCK; break;
        case 3:
            return SHIP; break;
        case 4:
            return EXIT; break;
        default:
            return null;
        }
Alle break; werden als unreachable markiert von eclipse. Allerdings ist der Syntax so doch korrekt.
 
Zuletzt bearbeitet von einem Moderator:

JStein52

Top Contributor
Du kannst schon was mit System.out.... ausgeben. Aber der Aufrufer deiner Methode sollte ja auch in dem Fall einen definierten Wert zurückkriegen, deshalb return null;
 

sMuve

Mitglied
Es läuft nun alles :) Die breaks sind unreachable, weil man ja durch das return schon aus dem Block raus kommt ^^

Danke für die Hilfe!
 

X5-599

Top Contributor
Noch als weitere Möglichkeit. Man könnte es auch so machen:
Java:
public enum MenuOption {
    LIST, REGISTER, ADJUST_STOCK, EXIT;
   
    public static MenuOption optionForNumber(int i)
    {
        MenuOption[] v = MenuOption.values();
        return ((i >= 0) && (i < v.length)) ? v[i] : null;
    }
}

Will heißen, man kann sich von einer Enum-Klasse alle Instanzen in einem Array geben lassen. (EnumKlasse.values())
Java:
System.out.println(MenuOption.optionForNumber(0));
System.out.println(MenuOption.optionForNumber(1));
System.out.println(MenuOption.optionForNumber(2));
System.out.println(MenuOption.optionForNumber(3));
System.out.println(MenuOption.optionForNumber(4));
Ausgabe:
LIST
REGISTER
ADJUST_STOCK
EXIT
null

Falls ihr noch keinen Ternary Operator hattet, oder du ihn nicht schön findest, kann man es natürlich auch so schreiben: (Der Ternary Operator ist die: BOOLEAN_AUSDRUCK ? DANN_DAS : SONST_DAS Anweisung)
Java:
public static MenuOption optionForNumber(int i) {
    MenuOption[] v = MenuOption.values();
    if((i >= 0) && (i < v.length))
    {
        return v[i];
    }
    return null;
}
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
X Enum Abfrage ohne if, for, while oder switch Java Basics - Anfänger-Themen 21
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
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
M Enum-Variabel-Abfrage funktioniert nicht? 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