Eingabe als Befehl ausführen in Java?

1 Antwort

Du suchst eine Art eval-Methode.

Die einfachste Lösung wäre es, dem Nutzer ein bestimmtes Format und eine gewisse Auswahl vorzugeben und daraufhin nach Eingabe zu prüfen.

Ein Beispiel: Du gibst dem Nutzer die Möglichkeit, eine Ausgabe tätigen zu lassen. Dazu soll er erst den print-Befehl eingeben und dann, getrennt mit einem Leerzeichen, das Argument.

print hello

Mit String-Funktionen (schau in die API Referenz) könntest du nun nach dem ersten Leerzeichen suchen und bis dahin den Substring herausziehen, um das erste Wort zu ermitteln (den Befehl). Die Argumente dahinter erlangst du mit weiteren String-Funktionen.

Via if-else / switch-case prüfst du daraufhin, ob du den Befehl unterstützt. Wenn ja, führst du ihn selbst aus.

Beispiel:

switch (command) {
  case "print":
    System.out.println(getArgument(input));
    break;
  case "sum":
    int[] arguments = getIntArguments(input);
    int sum = getSum(arguments);
    System.out.println(sum);
    break;
  // etc. ...
  default:
    System.err.println("Command does not exist!");
}

Hier würden die Befehle print und sum unterstützt werden. Die verwendeten Methoden getArgument und getIntArguments müsstest du dir natürlich noch selbst implementieren.

Sofern du das noch einfach hältst, bleibt es auch einfach. Für komplexere Anforderungen wäre ein Expression Evaluator / Tree nicht verkehrt. Entweder du schreibst dir selbst einen (das ist meines Erachtens keine Aufgabe für einen Programmieranfänger), oder du suchst dir eine Bibliothek wie JEval oder JEL.

Es gibt zudem noch die Möglichkeit, sich kurz selbst eine Java Datei zu schreiben und die zur Laufzeit an den Compiler zu verfüttern (dieser Artikel sollte darauf eingehen), um sie danach auch auszuführen. Dies wäre ein etwas teurer Prozess hinsichtlich des Aufwands.

Bei solchen Aktionen solltest du allerdings noch eines beachten: Wenn du Eingaben von außen nicht in irgendeiner Form kontrollierst, können sie dein Programm zum Absturz bringen. Ob du dies handhabst oder nicht und wie mächtig du deinen Nutzer generell machen möchtest, musst du selbst entscheiden.