Łańcuch zobowiązań

Łańcuch zobowiązań
K3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
0

Witam,

próbuję zaimplementować łańcuch zobowiązań. Niestety nie działa on prawidłowo. Problem polega na tym, że w poniższym przykładzie dla

Kopiuj
handler2.getAnimal()

na wyjściu otrzymuję wartość null. Z góry dziękuję za każdą pomoc.

Kopiuj
public class Main {
    static Handler getChain(){
        DogHandler dog = new DogHandler();
        CatHandler cat = new CatHandler();
        dog.setSuccesor(cat);
        return dog;
    }
    public static void main(String[] args) {
        Handler handler = getChain();
        handler.loadAnimal("dog");
        System.out.println(handler.getAnimal());// output "dog"

        Handler handler2 = getChain();
        handler2.loadAnimal("cat");
        System.out.println(handler2.getAnimal());//output null
    }
}
Kopiuj
public interface Chainable {
     void setSuccesor(Handler succesor);
     Handler getSuccesor();
}
Kopiuj
abstract class Handler implements Chainable{
    private Handler succesor;
    private String animal;

    @Override
    public void setSuccesor(Handler succesor) {
        this.succesor = succesor;
    }

    @Override
    public Handler getSuccesor() {
        return this.succesor;
    }

    protected void forward(String request){
        if(this.succesor != null){
            this.getSuccesor().loadAnimal(request);
        }
    }
    abstract void loadAnimal(String request);

    public String getAnimal() {
        return animal;
    }

    public void setAnimal(String animal) {
        this.animal = animal;
    }
}
Kopiuj
public class DogHandler extends Handler {
    @Override
    void loadAnimal(String request) {
        if(request.equals("dog")){
            setAnimal("dog");
        }else{
            forward(request);
        }

    }
}

Kopiuj
public class CatHandler extends Handler {
    @Override
    void loadAnimal(String request) {
        if(request.equals("cat")){
            setAnimal("cat");
        }else{
            forward(request);
        }
    }
}

KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 168
0

Podejrzewam, że handler2 jest typu DogHandler i nie została w nim ustawiona zmienna animal na "cat". "cat" wyświetli się jak handler2.getSuccessor.getAnimal()
Podejrzewam, że brakuje w getAnimal() sprawdzenia czy nie należy szukać wartości w kolejnym elemencie łańcucha (ale nie wiem co chciałeś uzyskać).

Btw. Zamiast request.equals("dog") lepiej pisać "dog".equals(request) wtedy nie powinno być problemów z null pointerami request.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.