Поведение изменилось в 3.0. От Что нового в Commons Lang 3.0? :
StringUtils.isAlpha, isNumeric и isAlphanumeric теперь все возвращают false, когда передается пустая строка. Ранее они вернули истину.
Сохранение старого ответа ниже, для справки и для пользователей до 3.0.
Это логически правильно?
У нас есть
- поведение метода
- документация о методе (которая часто рассматривается как спецификация или контракт)
- название метода
В этом случае 1 и 2 согласуются друг с другом; Все символы в пустой строке являются цифрами Unicode. (Или, что эквивалентно, никакие символы в пустой строке не являются , а не юникодными цифрами.) Это то, что логики называют пусто истинно и несколько противоречит интуиции. Это все равно что сказать, что все слоны в моей квартире зеленые . Это правда, так как в моей квартире нет слонов.
Однако пункт 3 (название метода) естественно интерпретируется как метод, который возвращает true, если данная строка представляет число.
Итак, это либо ошибка документации и реализации, либо ошибка именования. На это нет правильного или неправильного ответа.
Ошибка была зарегистрирована здесь . Сопровождающие считают, что это предполагаемое поведение.
Почему они видят пустую строку как цифру?
Хотя имя метода может заставить вас поверить, что метод должен возвращать true только для строк, представляющих число, в спецификации сказано, что он должен возвращать true, если строка содержит только цифры Unicode.
Вы говорите,
Я в замешательстве, потому что спецификация говорит: «Проверяет, содержит ли строка только юникодные цифры». Я не вижу, что "" содержит цифры ....
Обратите внимание, что пустая строка не содержит ничего, кроме цифр Юникода. Поэтому метод возвращает true.