2010-04-04 2 views
0

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

Вот простой способ проиллюстрировать, где проблема.

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

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

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

См http://stackoverflow.com/questions/135845/are-booleans-as-method-arguments-unacceptable/135871#135871 для возможного варианта (4) – skaffman

+0

Спасибо skaffman. –

ответ

7

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

+1

+1, конечно, если вы просто оставите его как есть, вы уже получите соответствующее 'NullPointerException'; Я, вероятно, больше не стал бы беспокоиться. Варианты 1 и 2 являются ужасными, так как они откладывают ошибку до более поздней точки, где ее сложнее отлаживать. – bobince

+1

О NPE против IAE: Я бы рекомендовал NPE, поскольку он широко используется через стандартную библиотеку, чтобы сигнализировать, что аргумент был незаконно «null». Java 7 даже представит 'java.util.Objects', который будет иметь метод утилиты для однострочной проверки и присвоения null-null (предоставление NPE, если аргумент равен NULL). NPE просто стали способом сделать это. Связанные RFE: http://bugs.sun.com/view_bug.do?bug_id=6889858 – gustafc

+0

Приятно слышать. Это позволило бы сохранить метод утилиты для проверки нулевых значений. –

3

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

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

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

2

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

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

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

1
  1. return true IFF filename.endsWith (fileExtension)

Я бы вернул false, если filename имеет значение NULL, и не мешает различию между значениями NULL и любыми другими несоответствующими значениями.

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

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

select * from filenames 
where filename like '&fileExtension'; 
+0

Я понимаю рассуждения, поскольку это то, к чему я привык раньше. Кстати, getResult() с JQL/JPA/Hibernate также вернет нулевое значение (обычно выделенное для списка). –

Смежные вопросы