Это может не отвечать на ваш вопрос напрямую, но оно исходит из нескольких замечаний, которые я получил от участников Stackoverflow по схожим темам.
Вместо того, чтобы возвращать null, если foo не найден, я должен вызвать исключение? Имеет ли это значение, и есть ли идиома «лучших практик» по этому вопросу? Кстати, я знаю, что мой пример немного надуман, но я надеюсь, что вы поняли идею ... "
Из того, что я понял, исключения должны быть выброшены из метода, когда исключение касается параметра, данного методу. Например, метод, принимающий экземпляры File, будет генерировать исключение NullPointerException или IOException. Это следует из идеи, что между вызывающим абонентом и вызываемым абонентом существует договор о том, что вызывающий должен отправить действительные объекты и позаботиться о них, если они недействительны.
Кроме того, вам необходимо решить, обрабатывать ли предварительные и постусловия. Вы можете установить охрану в начале метода для обработки параметров, и это сэкономит немало кода. Однако некоторые считают это неправильным подходом, так как некоторые проверки, скажем, в пользовательском интерфейсе, должны быть выполнены заранее.
Чтобы завершить, вполне допустимо вернуть нулевой объект, если целью является получение одного экземпляра. Это перефразирует, что объект не был найден или не существует. Когда дело доходит до групп объектов, я думаю, что соглашение состоит в том, чтобы просто возвращать пустую коллекцию / список.