Exercício em Java

Olá pessoal!

Poderia me ajudar com esse exercício em Java?

Sou iniciante em Java e estou tentando fazer basicamente um quadro de projetos ágeis, ou seja, tenho duas tarefas e elas precisam passar pelas seguintes fases: BACKLOG - TODO - DOING - DONE.

A saída deverá ser algo assim:

BACKLOG
Tarefa 1
Tarefa 2

TODO

DOING

DONE


BACKLOG
Tarefa 2

TODO
Tarefa 1

DOING

DONE


BACKLOG
Tarefa 2

TODO

DOING
Tarefa 1

DONE


BACKLOG
Tarefa 2

TODO

DOING

DONE
Tarefa 1

E o mesmo acontecer com a Tarefa 2

Implementei as seguintes classes:

Classe Quadro:

class Quadro {
    static int BACKLOG = 0;
    static int TODO = 1;
    static int DOING = 2;
    static int DONE = 3;
    String labelFases[] = {"BACKLOG", "TODO", "DOING", "DONE"};
    Fase fase[] = new Fase[4];

    public Quadro() {
        for (int i=0; i<4; i++)
            fase[i] = new Fase();
    }
    public void adiciona (Cartao c) {
        fase[BACKLOG].adiciona(c);
    }
    public void prepara (Cartao c) {
        fase[BACKLOG].remove(c);
        fase[TODO].adiciona(c);
    }
    public void inicia (Cartao c) {
        fase[TODO].remove(c);
        fase[DOING].adiciona(c);
    }
    public void encerra (Cartao c) {
        fase[DOING].remove(c);
        fase[DONE].adiciona(c);
    }
    public String toString() {
        String saida = "";
        for (int i=0; i<4; i++)
            saida += labelFases[i] + "\n" + fase[i].toString() + "\n";
        return saida;
    }
}

Classe Fase:

class Fase{
Cartao cartao[] = new Cartao[99];

    void adiciona(Cartao c){
        cartao[Quadro.BACKLOG] = c;
    }

    void prepara(Cartao c){
        cartao[Quadro.TODO] = c;
    }
    void inicia(Cartao c){
        cartao[Quadro.DOING] = c;

    }
    void encerra(Cartao c){
        cartao[Quadro.DONE] = c;
    }
    void remove(Cartao c){
        cartao[-1] = c;
    }
}

Classe Cartao:

class Cartao{
    String nome;
    public Cartao(String nome){
        this.nome = nome;
    }
}

Classe QuadroGeral:

public class QuadroGeral {
    public static void main(String[] args) {
        Quadro quadroGeral = new Quadro();
        Cartao tarefa1 = new Cartao("Tarefa 1");
        quadroGeral.adiciona(tarefa1);
        Cartao tarefa2 = new Cartao("Tarefa 2");
        quadroGeral.adiciona(tarefa2);
        System.out.println(quadroGeral);
        quadroGeral.prepara(tarefa1);
        System.out.println(quadroGeral);
        quadroGeral.inicia(tarefa1);
        System.out.println(quadroGeral);
        quadroGeral.encerra(tarefa1);
        System.out.println(quadroGeral);
    }
}

Estou tendo a seguinte saída:

BACKLOG
Fase@60e53b93
TODO
Fase@5e2de80c
DOING
Fase@1d44bcfa
DONE
Fase@266474c2

BACKLOG
Fase@60e53b93
TODO
Fase@5e2de80c
DOING
Fase@1d44bcfa
DONE
Fase@266474c2

BACKLOG
Fase@60e53b93
TODO
Fase@5e2de80c
DOING
Fase@1d44bcfa
DONE
Fase@266474c2

BACKLOG
Fase@60e53b93
TODO
Fase@5e2de80c
DOING
Fase@1d44bcfa
DONE
Fase@266474c2

Poderiam me ajudar?

@MSSantana
Bom dia campeão.
Espero que isso ajude mesmo tanto tempo depois.
Mudei algumas coisas mas mantive a estrutura que foi montada, acredito que se fazer uma refatoração o código pode ficar muito mais simples.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class QuadroGeral {

public static void main(String[] args) {
    new QuadroGeral().start();
}

public void start() {
    Fase backlog = new Fase(FASES.BACKLOG.name()).add(new Tarefa("Tarefa 1"), new Tarefa("Tarefa 2"));
    Fase todo = new Fase(FASES.TODO.name());
    Fase doing = new Fase(FASES.DOING.name());
    Fase done = new Fase(FASES.DONE.name());
    new Quadro(backlog, todo, doing, done).execute();
}

public enum FASES {

    BACKLOG(0), TODO(1), DOING(2), DONE(3);

    private final int value;

    FASES(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public static FASES valueOf(int value) {
        return FASES.values()[value];
    }

}

public class Quadro {

    private List<Fase> fases = new ArrayList();

    public Quadro(Fase... fase) {
        fases.addAll(Arrays.asList(fase));
    }

    public void execute() {
        System.out.println(this.toString());
        int tarefas = fases.get(FASES.BACKLOG.value).countTarefas();
        while (fases.get(FASES.DONE.value).countTarefas() != tarefas) {
            for (int f = 0; f < fases.size() - 1; f++) {
                Tarefa tarefa = fases.get(f).getFirstTarefa();
                if (tarefa != null) {
                    fases.get(f + 1).add(tarefa);
                }
                System.out.println(this.toString());
            }
        }
        System.out.println("***********ALL TASKS SUCCESS EXECUTED***********");
    }

    @Override
    public String toString() {
        return fases.stream().map(Fase::toString).collect(Collectors.joining());
    }

}

public class Fase {

    private String fase;
    private List<Tarefa> tarefas = new ArrayList();

    public Fase(String fase) {
        this.fase = fase;
    }

    public Fase add(Tarefa... tarefa) {
        tarefas.addAll(Arrays.asList(tarefa));
        return this;
    }

    public int countTarefas() {
        return tarefas.size();
    }

    public Tarefa getFirstTarefa() {
        if (tarefas.size() > 0) {
            Tarefa tarefa = tarefas.get(0);
            tarefas.remove(tarefa);
            return tarefa;
        }
        return null;
    }

    @Override
    public String toString() {
        return tarefas.stream()
                .map(Tarefa::toString)
                .collect(Collectors.joining("\n", fase + "\n", "\n"));
    }

}

public class Tarefa {

    private String nome;

    public Tarefa(String nome) {
        this.nome = nome;
    }

    @Override
    public String toString() {
        return nome;
    }

}

}