Un mio ex collega ha iniziato una discussione mezz'ora fa su JavaBeans e sul perché non ha funzionato nel modo in cui lo desidera in JSF. Il caso particolare riguarda le proprietà booleane.JavaBeans e introspezione: incasinato su proprietà booleane e indicizzate?
. Per una proprietà booleana denominata isUrl
Eclipse genera questo
private boolean isUrl;
public boolean isUrl() {..}
public boolean setUrl(boolean url) {..}
Ma questo non funziona in JSF. Egli ha reso il lavoro con l'aggiunta di public boolean getIsUrl()
L'implementazione potrebbe essere buggy, quindi cerchiamo di fare in modo chi ha ragione, utilizzando l'API di introspezione .:
BeanInfo info = Introspector.getBeanInfo(ClassTest.class);
for (PropertyDescriptor pd : info.getPropertyDescriptors()) {
System.out.println(pd.getName() + ": " + pd.getReadMethod() +
" : " + pd.getWriteMethod());
}
Per il codice di cui sopra, viene stampato entrambi i metodi - vale a dire Eclipse è giusto, JSF è sbagliato. Ma mi sembrava sospetto, dal momento che lo the specification non menziona nulla sul doppio "è".
Ma guardando le specifiche, ho visto qualcosa che non ho mai usato, le cosiddette proprietà indicizzate. È possibile avere private String[] bar
e quindi public String getBar(int idx)
. Quindi:
. L'ho provato con lo Introspector
e non ho trovato un metodo di lettura per barra. Il risultato del codice precedente era: bar: null : null
. Così sono arrivato a pensare - ora l'introspettore non segue le specifiche. Forse non l'ha seguito nel caso precedente, e alla fine, JSF ha ragione. In effetti, le proprietà indicizzate possono essere create in modo tale che vi siano due metodi di lettura per una determinata proprietà. E questo non è possibile con la classe PropertyDescriptor
dell'API di introspezione.
A cosa ci conduce? Un'API probabilmente non funzionante non conforme alle specifiche. Il che porta ad altre implementazioni delle specifiche (ovviamente JSF usa uno personalizzato). Il che porta a ulteriori equivoci e confusioni.
Un sidenote per qualcosa che mi ha infastidito - nelle specifiche JavaBeans chiamano le convenzioni di denominazione per i metodi "schemi di progettazione". Mi sembra sbagliato.
Così, ora sulle domande:
- è il JavaBeans spec chiaro
- è l'API di introspezione corretta
- è una specifica nuovi JavaBeans necessario, almeno per chiarire il comportamento di booleani (che è soggettiva in misura)
Aggiornamento. sembra che l'utilizzo di JSF sia bean.isUrl
piuttosto che bean.url
. Il che fa sì che i perfetti non lavorino con l'accessorio isUrl()
.
P.S. JDK 1.6.0_20, JSF 1.2, MyFaces
forse qualcosa come le proprietà di C# tornerà utile. – Bozho
Dopo aver letto il codice introspector, isXxxx dovrebbe funzionare. Il nome del campo utilizzato non ha importanza. Hai provato Java 6 aggiornamento 23? –