Адаптация методов, которые возвращают true / false - PullRequest
0 голосов
/ 05 апреля 2010

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

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

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

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

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

Ответы [ 4 ]

7 голосов
/ 05 апреля 2010

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

3 голосов
/ 05 апреля 2010

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

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

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

2 голосов
/ 05 апреля 2010

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

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

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

1 голос
/ 05 апреля 2010
  1. вернуть true IFF filename.endsWith (fileExtension)

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

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

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

select * from filenames
 where filename like '&fileExtension';
...