Objeto se auto-destruir

Alguém conhece uma forma de se fazer isso?
Existe um objeto que é uma agenda, e quando sua última tarefa acabar, a agenda não deve mais existir. Por exemplo:

[code]public class Agenda {
int vezesRestantes = 10;

public Tarefa getProximaTarefa() {
    ... // cria nova tarefa
    vezesRestantes--;
    return tarefa;
}

}[/code]

A idéia é que quando vezesRestantes chegasse a 0 o objeto não mais existisse. A única maneira que eu vi de fazer isso é tendo uma referência dentro da própria agenda a todos os objetos agenda criados. E antes de retornar agenda, ele fazer um remove(this) desta coleção. Porém não adiantaria este objeto ser um static Collection e o construtor de Agenda se auto colocasse lá. Afinal, externamente pode existir uma referência ao objeto, como no próprio DAO. A idéia é que ele removesse “do DAO” e acho que o objeto ser o próprio DAO não é uma boa agenda.

Ilustrando:

[code]public class Agenda {
private static Collection<Agenda> agendas = new ArrayList<Agenda>();
int vezesRestantes = 10;

public Agenda() {
    agendas.add(this);
}

public Tarefa getProximaTarefa() {
    ... // cria nova tarefa
    vezesRestantes--;
    if (vezesRestantes &lt;= 0) agendas.remove(this);
    return tarefa;
}

}[/code]

não funcionaria, afinal:

Agenda a = new Agenda(); ... a.getProximaTarefa(); // vamos supor que aqui vezesRestantes ficou 0 e ele rodou o agendas.remove(this)

O objeto a ainda existe. Ele apenas não se encontra no Agenda.agendas.

Não tem como fazer o que você quer.

O que você pode fazer é colocar um código dentro da Agenda, que impeça ela de ser usado se vezesRestantes chegar a 0.
Você também pode notificar o objeto Agendas que de as vezes restantes chegou a zero.

Exemplo:

public Tarefa getProximaTarefa() {  
   if (vezesRestantes == 0)
      throw new IllegalStateException("vezesRestantes= 0!");

   vezesRestantes--;
   if (vezesRestantes == 0)
       agendas.remove(this);

   return tarefa;
}

Bem que eu desconfiei. :frowning:
Eu pensei nisso da exceção, mas achei que pudesse ter uma solução mais robusta, rs.

Obrigado de qualquer forma!

Se vc apenas precisar de uma única instancância de Agenda, podes pensar em um singleton. O singleton te dá o controle total da única instância de agenda, vc precisa de mais de uma instância?

Sim. Eu precisaria…

Acho que vou ter que adotar a exceção mesmo. Na verdade já estou adotando, rs. E estou pensando em por um isValid() para na GUI não mostrar as agendas vencidas.

No Java, o Singleton é uma opção perigosa. Especialmente se você utilizar lazy loading, ou mais de um ClassLoader.
Há várias formas de “quebrar” o padrão, e um Singleton inadvertidamente deixar de ser Singleton.

Procure se informar antes de usar o padrão.
Na maior parte das aplicações comerciais, que já tem um framework de DI, ele é mais seguramente substituído pelos métodos fábrica desse framework.