# Methodenaufrufe in einer Queue



## ResidentSleeper (15. Jan 2021)

Hey, 
ich hätte da nur eine Frage unzwar habe ich eine Queue mit Befehlen als Elemente. Wenn man diese Befehle aufruft, bekomme ich einen boolean zurück.

Die Frage ist jetzt, kann ich sowas überhaupt direkt in einere Queue speichern und wenn ja, wie führe ich dann diese Befehle aus ? 

Viele Grüße


----------



## LimDul (15. Jan 2021)

Zeig mal Code.

Im Prinzip so wie immer. Du hast eine Queue, die Objekte vom Typ Command/Befehl enthält, du kannst über die iterieren mit einer ganz normalen Schleife und den Befehl über seine Execute Methode ausführen.


----------



## kneitzel (15. Jan 2021)

Also was ist ein Befehl? In der Regel wirst Du da ein Interface oder so haben. Und das Interface hat dann ein execute() oder so.
Dann kannst Du natürlich die Queue durchgehen und für jeden Befehl execute() aufrufen.

Und da es ein funktionales Interface ist, kannst Du da alles mögliche speichern;
a) Selbstverständlich Instanzen von Klassen, die Befehl implementieren, also sowas wie class MyClass implements Befehl { ... }
b) Du kannst Lambda Ausdrücke verwenden
c) Du kannst Methodenreferenzen übergeben

Also Da sind Dir keine Grenzen gesetzt.


----------



## ResidentSleeper (15. Jan 2021)

[CODE lang="java" title="Robot"]import java.util.*;
import java.util.function.Function;

public class Robot implements Command{
    private Queue<Command> todo;
    private Function<Robot, List<Command>> program;

    public void setProgram(Function<Robot, List<Command>> newProgram){
        program = newProgram;
    }
    private void think(){
        List<Command> temp;
        temp = program.apply(this);
        for(int i = 0; i < temp.size() - 1; i++){
            todo.add(temp.get(i));
        }
    }
    private void act(){
        if(todo.peek() != null || todo.peek().execute(this) != false){
            //Befehl muss ausgeführt werden
            act();
        }
    }
    @Override
    public boolean execute(Robot robot) {
        //execute muss initialisiert werden
    }[/CODE]

[CODE lang="java" title="Command Interface"]public interface Command {
    boolean execute(Robot robot);
}[/CODE]


----------



## ResidentSleeper (15. Jan 2021)

und die Befehle sind in der Robot-Klasse noch drin

[CODE lang="java" title="Commands"] /// Pre-programmed Commands
    public boolean go(double distance) {
        //step can be negative if the penguin walks backwards
        double sign = Math.signum(distance);
        distance = Math.abs(distance);
        //penguin walks, each step being 0.2m
        while (distance > 0) {
            position.moveBy(sign * Math.min(distance, 0.2), direction);
            world.resolveCollision(this, position);
            distance -= 0.2;
        }
        return true;
    }

    public boolean turnBy(double deltaDirection) {
        direction += deltaDirection;
        return true;
    }

    public boolean turnTo(double newDirection) {
        direction = newDirection;
        return true;
    }

    public boolean say(String text) {
        world.say(this, text);
        return true;
    }

    public boolean paintWorld(Position pos, char blockType) {
        world.setTerrain(pos, blockType);
        return true;
    }[/CODE]


----------



## temi (15. Jan 2021)

Hast du jetzt noch eine Frage dazu?


----------



## ResidentSleeper (15. Jan 2021)

temi hat gesagt.:


> Hast du jetzt noch eine Frage dazu?


Ich muss das erst noch ausprobieren aber wenn ich was nicht verstehe frage ich nochmal nach


----------



## kneitzel (15. Jan 2021)

Eine einfache Frage: Ist Robot ein Command?
Muss Robot Command implementieren?

Das musst Du Dir überlegen...

Und diese Commands im Robot - eigentlich hätte ich hier erwartet, dass man das entsprechend objektorientiert abbildet. Also das könnte man als eigenständige Klassen schreiben.

Das geht dann ja etwas Richtung Strategy Pattern....


----------



## MoxxiManagarm (15. Jan 2021)

ResidentSleeper hat gesagt.:


> private Queue<Command> todo;


Was mir noch auffällt, du deklarierst z.B. eine Queue, aber initialisierst sie nie?!


----------

