@vi0

Как именовать два метода один из которых выбрасывает исключение?

Есть два метода с одинаковой сингатурой, но второй может выбрасывать исключение.
Как бы вы именовали подобные методы?
Или может быть решаете вопрос по другому?
public Optional<Entity1> findById(String id) {
    return repository.findById(id);
}

public Entity1 findById(String id)  {
    return repository.findById(id).orElseThrow(
            () -> new UncheckedException1("error1")
    );
}
  • Вопрос задан
  • 186 просмотров
Пригласить эксперта
Ответы на вопрос 6
@Mercury13
Программист на «си с крестами» и не только
findById и requireById.
В данном случае.
Ответ написан
Комментировать
@Px2
Что у вас за кейс? Почему обязательно нужны оба метода?
Я бы оставил какой-то один.
Ответ написан
xez
@xez Куратор тега Java
TL Junior Roo
0. Так оно у вас не соберется. Компилятор скажет "findById(String) is already defined in ..."
1. Исключение предполагает какой-то элемент неожиданности. Если вы хотите назвать метод "получитьАйДиИлиБроситьИсключение" предполагается, что это исключение должно быть уже как-то обработано, т.е. бросать вы должны проверяемое исключение, а проверяемые исключения (checked exeption) предполагают какую-то логику, а это уже все вместе вырастает в антипатерн "логики на эксепшенах".
2. Если у вас все-же метод бросает какое-то непроверяемое исключение (ну так вышло), то ничего о нем сообщать дополнительно не требуется (оно же непроверяемое!).
3. Буква S в слове SOLID означает Single Reponsibility. Никакой метод, кроме специально для этого предназначенного, не должен никак реагировать на исключения. Реагировать на исключения - это дополнительная обязанность. Если у вас, по какой-то досадной случайности появился чекд-эксепшен, самое лучшее, что вы с этим можете сделать - поставить над методом аннотацию ломбока @SneakyThrows
Ответ написан
@artem-dainov
Php, java, js. Boot spring, jquery, git
1. На лицо перегрузка. Первый метод возвращает entity обернутый в Optional, а второй возвращает просто entity, с проверкой на исключение.
2. Их можно оставить как есть, а по возвращаемому типу понимать, что один из них вернет исключение.
3. В первом можно подтянуть метод .isPresent()
4. Второй метод я бы назвал findByIdAndException
5. id как string не самый лучший вариант. Помните о том, что String не изменяем и может привести к загруженности памяти.
Ответ написан
@gsaw
"find" как бы подразумевает, что можно и не найти, а "get" имхо звучит жёстче.
getById (Checked)
findById (Optional)
Ответ написан
Комментировать
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Тут можно по-разному поступить. Вот, как это делаю я:

Способ 1: название методов get* & find*
User getUserById(Long id) {
	return userRepository.getReferenceById(id);
}

Optional<User> findUserById(Long id) {
	return userRepository.findById(id)
		.orElseThrow(() -> new NotFoundException());
}


Способ 2 - я вообще из сервисов не возвращаю Optional никогда. Ведь, по сути если вы будете этот слой сервиса использовать в другом сервисе, то скорее всего вам понадобится сама сущность, а не Optional, а если данной сущности нет, то какой смысл дальше его сеттить, а значит нужно выбросить исключение. Обратите внимание, что второй метод возвращает DTO
User findById(Long id) {
	return userRepository.findById(id)
			.orElseThrow(() -> new NotFoundException());
}

UserDTO findUserById(Long id) {
	return userMapper.toDTO(findById(Long id));
}


Способ 3: Если не хотите, чтобы исключение выбрасывалось например.
Допустим, у вас первый сервисный слой PostService вызывает второй AuthorService, чтобы выполнить findById и засеттить его значение к записи. Если вы выполните это на уровне сервисов, то исключение будет брошено. Но можно сделать это на уровне мапперов и в случае отсутствия записи засеттить null. Если память не изменяет, такое работает в MapStruct с NullValuePropertyMappingStrategy

Cпособ 4
Создаю 2 метода. Первый возвращает сущность или выбрасывает исключение, а второй возвращает сущность или нулл
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы