É possível esconder uma ou mais opções de um menu tendo em conta o estado de uma determinada entidade. Por exemplo, podemos querer que a opção de mostrar os números já inseridos (concretizado pelo comando ListNumbers) não seja apresentada se não houver nenhum número para apresentar.

Esta funcionalidade já é suportada pela framework de interacção da seguinte forma. É possível criar um comando com um parâmetro adicional do tipo ValidityPredicate<T> que tem a responsabilidade de indicar se o comando deve ser visível ou não. Cada vez que um menu tem que apresentar as suas opções (ou seja os comandos presentes no menu), antes de apresentar cada opção, o menu verifica se o comando associado à opção é visível ou não. Se não for visível, então a opção não é apresentada.
Este parâmetro adicional deverá substituir o método bolean isValid()

A visibilidade do comando deve estar definida no método boolean isValid() de ValidityPredicate. O constructor da super-classe isValid(). recebe um parâmetro que deverá referenciar a entidade cujo estado afecta a visibilidade do comando.  Esta entidade depois pode ser acedida no método isValid através do atributo _receiver (o qual foi inicializado no construtor).

Para concretizar este novo requisito, precisamos de criar um ValidityPredicate cuja concretização do método isValid() devolva true quando a entidade IntegerManager tenha pelo manos um número e devolva false quando está vazia:

new ValidityPredicate<IntegerManager>(manager) {
      @Override
      public boolean isValid() {
        return _receiver.getNumbers().size() > 0;
      }
    }


em que manager é uma referência para a entidade do domínio que gere a lista de números a a apresentar.

Assim, devemos alterar a construção do comando ListNumbers para passar um parâmetro adicional do tipo ValidityPredicate na invocação do construtor da superclasse. Esta classe deverá passar a ter a seguinte concretização:

package ex.app.main;

import java.util.List;
import ex.core.IntegerManager;
import pt.tecnico.po.ui.Input;
import pt.tecnico.po.ui.Command;
import pt.tecnico.po.ui.DialogException;
import pt.tecnico.po.ui.ValidityPredicate;

public class ListNumbers extends Command<IntegerManager> {        
  //Constructor
  public ListNumbers(IntegerManager ent) {
    super("Listar Números", ent,
          new ValidityPredicate<IntegerManager>(ent) {
            @Override
            public boolean isValid() {
              return _receiver.getNumbers().size() > 0;
            }
          });
  }

  protected void execute() { // executed when this option is selected
    List<Integer> list = _receiver.getNumbers();
    
    for (Integer number : list)
      _display.addLine(number.toString());
    _display.display();
  }
}