Адаптация методов, которые возвращают true/false

Как лучше всего адаптировать функции в стиле C, которые возвращают true/false для Java?

Вот простой способ, чтобы проиллюстрировать, в чем заключается проблема.

public static boolean fileNameEndsWithExtension( String filename, String fileExtension)  { 
    return filename.endsWith( fileExtension );
}

Обратите внимание, что, вероятно, существует более элегантный способ фильтрации файлов (не стесняйтесь комментировать его). В любом случае, если имя файла является значением null, делает одно:

  1. Вернуть false, если имя файла равно null? Если да, то как отличить случай, когда имя файла null, и случай, когда String или имя файла не заканчивается данным расширением файла?
  2. Измените тип возвращаемого значения на логический класс-оболочку, который допускает значение null.
  3. Бросить Exception и заставить программиста убедиться, что значение null никогда не передается методу?
  4. Использовать другое решение?

person James P.    schedule 04.04.2010    source источник
comment
См. stackoverflow.com/questions /135845/ для возможного варианта (4)   -  person skaffman    schedule 05.04.2010


Ответы (4)


Вы должны создать исключение NullPointerException или IllegalArgumentException, если имя файла равно null. Я позволю вам решить, что лучше. Есть хорошая дискуссия о том, что использовать в вопросе: IllegalArgumentException или NullPointerException для нулевого параметра?

person GaryF    schedule 04.04.2010
comment
+1, конечно, если вы просто оставите все как есть, вы уже получите соответствующий NullPointerException; Я бы, наверное, больше не стал делать. Варианты 1 и 2 ужасны, так как они откладывают ошибку до более позднего момента, когда ее может быть сложнее отладить. - person bobince; 05.04.2010
comment
Что касается NPE и IAE: я бы рекомендовал NPE, так как он широко используется в стандартной библиотеке, чтобы сигнализировать о том, что аргумент был незаконным null. Java 7 даже представит java.util.Objects, у которого будет служебный метод для однострочной проверки и присваивания анти-нулевых значений (предоставление NPE, если аргумент равен нулю). NPE просто стали способом сделать это. Связанный RFE: bugs.sun.com/view_bug.do?bug_id=6889858 - person gustafc; 05.04.2010
comment
Приятно это слышать. Это спасло бы наличие служебного метода для проверки нулевых значений. - person James P.; 05.04.2010

Вы делаете то, что имеет смысл в предметной области вашего конкретного приложения:

  1. Если есть смысл сказать, что пустой набор имен файлов заканчивается каким-либо расширением, вернуть true.
  2. Если есть смысл сказать, что пустой набор имен файлов заканчивается без расширения, верните false.
  3. Если есть смысл сказать, что никто и никогда не должен задавать этот вопрос, пусть код кинет.
  4. Если имеет смысл получить результат с тремя значениями, конечно, используйте Boolean.
  5. Или сделать трехзначное перечисление и вернуться из ТО.

В большинстве случаев вариант 3 будет разумным, но здесь никто не может исключить применимость других к вашему приложению. Если вы по уважительной причине передаете много осмысленных нулевых имен файлов, возможно, имеет смысл выбрать одно из других.

person bmargulies    schedule 04.04.2010

Я бы использовал либо 1, либо 3. Предпочтительно, чтобы я выдавал исключения NullPointerException или, по крайней мере, использовал утверждать.

Возврат нулевых логических значений обычно вызывает больше проблем, чем пользы, у вас есть проверка на нули и т. д. Кроме того, fileNameEndsWithExtension() выглядит как функция, которую вы будете использовать только тогда, когда знаете, что у вас есть действительное имя файла.

Также не забывайте, что fileExtension также может быть нулевым.

person Juha Syrjälä    schedule 04.04.2010

  1. вернуть истинное имя файла IFF.endsWith(fileExtension)

Я бы вернул false, если имя файла равно null, и не беспокоился бы о различии между null и любыми другими несовпадающими значениями.

Если нулевое имя файла является отдельным состоянием, которое необходимо проверить и обработать особым образом, то его следует проверять отдельно, предпочтительно перед проверкой endWith(), но при этом сохранять нулевую проверку в endWith() для предотвращения ненужных исключений во время выполнения.

Причина, по которой я бы выбрал поведение null = false, вероятно, связана с влиянием реляционных баз данных. Следующий запрос будет возвращать только те строки, которые соответствуют условию, все остальное (пустые значения и несоответствия) будет проигнорировано.

select * from filenames
 where filename like '&fileExtension';
person crowne    schedule 04.04.2010
comment
Я понимаю рассуждение, поскольку это то, к чему я привык раньше. Между прочим, getResult() с JQL/JPA/Hibernate также вернет нулевое значение (обычно выделенное для списка). - person James P.; 05.04.2010