Что можно было бы считать приемлемым способом работы с возвратом записи из БД со следующими тремя потенциальными результатами:
Я по большей части стремлюсь к проектированию по контракту:
class Scratch {
public User getUser(int id) {
try {
// Prepare SQL Query
PreparedStatement s = this.connection.prepareStatement(
"select * from get_user(?)"
);
// Provide SQL Parameters
s.setInt(1, id);
// Run our SQL
ResultSet rs = s.executeQuery();
rs.next();
// Extract data into Entity
User user = User.createFromDatabase(rs);
rs.close();
return user;
} catch(Exception e) {
e.printStackTrace();
}
return new User();
}
}
В ситуации, когда соединение или запрос к БД не удается, менее очевидно, что мне делать, у меня есть несколько вариантов:
Я склоняюсь к обработке исключений, поскольку это позволяет избежать ошибки на миллиард долларов, а также поддерживает дизайн по контракту в обычных ситуациях.
Однако я хотел бы знать, есть ли какие-либо очевидные подводные камни или это знакомая ситуация с хорошо установленным шаблоном для ее решения.
@Ivar спасибо Я обновил это сейчас, я открыл новый рабочий файл в IntelliJ и вставил некоторый код.




Я бы сгенерировал исключение и позволил бы пользователю узнать, что соединение не удалось. Я бы никогда не стал возвращать NULL, потому что вы не знаете, в чем проблема.
Я не знаю, почему вы должны вернуть «Новый пользовательский объект», если у вас нет подключения к базе данных. Вы не сможете спасти пользователя.
Мой выбор - выбросить исключение
Я думаю, что это наиболее подходящее решение, судя по дополнительному чтению от ivar, оно выглядит единодушным. Я также провел рефакторинг своего приложения, и это решение подходит как нельзя лучше.
Используйте опционально (пожалуйста). Это явно указывает на то, что пользователь не может быть найден в базе данных, и избегает исключений NullPointerException.
Я не согласен с вашим последним пунктом. Я не уверен, что вы имеете в виду под «клиентом», но если это конечный пользователь, вы всегда можете перехватить свое исключение в другом месте вашего приложения. Если просто продолжать, как будто ничего не случилось, это может привести к ошибкам / повреждению данных.
@Ivar это именно та причина, по которой это не сработает в моем варианте использования, я обрабатываю пакетную обработку пользователей, поэтому притворство, что все в порядке, приведет к тому, что средство пакетного обновления продолжит обработку записи вместо остановки и повторной попытки текущего пакета.
Я полагаю, что заслуживаю отрицательной оценки, не знаю, о чем я думал -_- !. Кстати, я действительно рекомендую вам использовать Optional, чтобы избежать возврата null при пустом запросе результатов.
getUserдолжен делать только одно - привлечь пользователя. Если он не может, он должен вызвать исключение. Для меня возврат null создает впечатление, что пользователя не существует. Связанный: stackoverflow.com/questions/77127/when-to-throw-an-exception