lunedì 29 dicembre 2008

Three state logic

In un applicativo che sto sviluppando mi è capitato di dover gestire una logica a tre stati:

- Vero

- Falso

- Indifferente

Nell'object model è abbastanza agevole svilupparlo con un attributo di tipo Boolean che ammette i valori: true, false, null. Ma cosa succede nell'interfaccia utente?
Non è possibile usare un check-box, perchè ammette soltanto due valori, sembra più adatto un listbox!
Per poter usare agevolmente il listbox è però più opportuno avere un'enumerazione invece del Boolean. Si possono però prendere due piccioni con una sola fava creando l'enumerazione come segue:


public enum TreStati {
VERO(Boolean.TRUE),
FALSO(Boolean.FALSE),
INDIFFERENTE(null);

private Boolean val;

private TreStati(Boolean val) {
this.val = val;
}

public Boolean getVal() {
return val;
}

public static TreStati fromBoolean(Boolean val) {
if (val == null) {
return INDIFFERENTE;
} else if (val) {
return VERO;
} else {
return FALSO;
}
}
}


A questo punto nella classe dell'object model potete usarlo così:


private Boolean attr;

public TreStati getAttr() {
return TreStati.fromBoolean(attr);
}

public void setAttr(TreStati attr) {
this.attr = attr.getVal();
}


Ovviamente, se necessario, potete anche aggiungere degli accessor method che manipolano direttamente l'attributo Boolean