JavaBeans и самоанализ - испортились о булевых и индексированных свойствах?

Мой бывший коллега полчаса назад начал обсуждение JavaBeans и почему они не работают в JSF так, как он хочет. Частный случай касается логических свойств.

1 . Для логического свойства с именем isUrl Eclipse генерирует это

private boolean isUrl;
public boolean isUrl() {..}
public boolean setUrl(boolean url) {..}

. Но это не работает в JSF. Он заставил это работать, добавив public boolean getIsUrl () Реализация могла быть ошибочной, поэтому давайте убедимся, кто прав, с помощью API интроспекции. :

BeanInfo info = Introspector.getBeanInfo(ClassTest.class);
for (PropertyDescriptor pd : info.getPropertyDescriptors()) {
      System.out.println(pd.getName() + ": " + pd.getReadMethod() + 
       " : " + pd.getWriteMethod());
}

Для приведенного выше кода это печатает оба метода - т.е. Eclipse прав, JSF ошибочен. Но это показалось мне подозрительным, поскольку спецификация ничего не упоминает о двойном «is».

Но, просматривая спецификацию, я увидел то, что никогда не использовал - так называемый индексированные свойства. У вас может быть приватная строка [] bar , а затем публичная строка getBar (int idx) . Итак:

2 . Я попробовал это с помощью Introspector , и он не нашел метода чтения для бара. Результатом приведенного выше кода было: bar: null: null . Поэтому я подумал - теперь интроспектор не следует спецификации. Возможно, в предыдущем случае этого не последовало, и в конечном итоге JSF прав. Фактически, индексированные свойства могут иметь два метода чтения для данного свойства. А это невозможно с классом PropertyDescriptor API интроспекции.

К чему это привело - у нас есть, возможно, неисправный API, который не соответствует спецификации. Это приводит к другим реализациям спецификации (очевидно, в JSF используется пользовательский вариант). Это ведет к дальнейшим недоразумениям и недоразумениям.

Замечание по поводу того, что меня беспокоило - в спецификации JavaBeans соглашения об именах для методов называются «шаблонами проектирования». Мне это кажется неправильным.

Итак, теперь к вопросам:

  1. - это четкая спецификация JavaBeans
  2. - правильный API интроспекции
  3. - это новая спецификация JavaBeans, необходимая, по крайней мере, для разъяснения поведения логических значений (это в некоторой степени субъективно)

Обновление. похоже, что используется JSF bean.isUrl , а не bean.url . Поэтому лучше всего не работать с аксессором isUrl () .

PS JDK 1.6.0_20, JSF 1.2, MyFaces

8
задан laurent 19 February 2012 в 08:25
поделиться