Почему ArrayList не имеет getSize () вместо size ()? - PullRequest
5 голосов
/ 07 января 2012

Я активно использую ArrayList на некоторых страницах JSP. Я хотел бы получить доступ к ArrayList следующим образом:

${myArrayList.size}

Но поскольку объекты должны соответствовать стандарту JavaBean, где myArrayList.getMyPropertyName() равно ${myArrayList.myPropertyName} в JSP / JSTL, функция myArrayList.size() недоступна.

Есть ли другой класс, который я должен использовать?

Обновление:

Немного трудно согласиться с тем, что такая функция, как получение размера вашего ArrayList в JSP, исключена только для более чистых лайнеров, но, похоже, могут быть и другие причины, по которым дизайнеры выбрали .size() вместо .getSize()

Полагаю, это действительно не проблема, если у вас есть поддержка синтаксиса ${fn:length(myArrayList)} или ${myArrayList.getSize()}.

Ответы [ 3 ]

11 голосов
/ 07 января 2012

Заголовок говорит сам за себя: почему ArrayList не имеет getSize () вместо size ()?

Как объяснено в " FAQ по разработке API Java Collections ":

Почему вы не использовали «имена в стиле бобов» для согласованности?

Пока имена методов новых коллекций не придерживаются «Соглашения об именах бобов», мы считаем, что они разумный, последовательный и соответствующий их назначению. Должно следует помнить, что соглашения о присвоении имен Beans не применяются к JDK в целом; AWT принял эти конвенции, но это Решение было несколько спорным. Мы подозреваем, что API коллекций будут использоваться повсеместно, часто с несколько вызовов методов в одной строке кода, поэтому важно чтобы имена были короткими. Рассмотрим, например, Итератор методы. В настоящее время цикл над коллекцией выглядит следующим образом:

for (Iterator i = c.iterator(); i.hasNext(); )
        System.out.println(i.next());
Все аккуратно помещается на одной строке, даже если имя коллекции длинное выражение. Если мы назвали методы "getIterator", "hasNextElement" и "getNextElement", это больше не будет дело. Таким образом, мы приняли «традиционный» стиль JDK, а не Фасоль стиль.
5 голосов
/ 07 января 2012

Вы используете функцию fn:length JSTL (см. документы ).

Сначала объявите пространство имен fn в верхней части JSP:

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

, а затем:

${fn:length(myArrayList)}
1 голос
/ 08 января 2012

Последняя версия EL поддерживает вызовы методов ${collection.size()}

Два других ответа дают вам более подробную информацию

  • API коллекций специально не соответствует спецификации JavaBeans. Обратите внимание, что размер не обязательно является свойством. Некоторые реализации вычисляют это динамически. То же самое относится и к другим методам - ​​они не являются простыми свойствами, и делать их похожими на геттеры неуместно.
  • до EL 2.2 вы можете использовать ${fn:length(collection)}

Кстати, в JSP обычно не требуется size() коллекции - вы просто повторяете ее. Если вам нужно выполнить некоторые вычисления, подумайте об этом в сервлете / контроллере. Конечно, я согласен, допустимо использовать это иногда в самом jsp.

...