Если ваши методы findById
и getUserPass
исходят из интерфейсов (а метод findById
возвращает интерфейс, из которого поступает getUserPass
), то вы можете просто сделать:
private boolean check(FindByIdInterface repository,
Long id,
String password) {
return repository.findById(id)
.map(result ->
passwordEncoder.matches(
result.getUserPass(), password))
.orElse(false);
}
И затем просто назовите его там, где вы выбираете repository
для передачи на основе вашей переменной isBoard
. isBoard ? boardRepository : replyRepository
Если они не происходят из общего интерфейса (ов), то вы можете эффективно «притвориться», что они делают, используя некоторые из функциональных интерфейсов java .
/* R = repository type, T = return type of 'findById' */
private <R, T> check(Function<R, Optional<T>> getByIdMapper,
Function<T, String> getUserPassMapper,
R repository,
Long id,
String password) {
return getByIdMapper.apply(repository)
.map(result ->
passwordEncoder.matches(
getUserPassMapper.apply(result),
password))
.orElse(false);
}
А затем назовите его примерно так:
if (isBoard) {
return check(BoardRepository::getById,
Board::getUserPass,
boardRepository, id, password);
} else {
// ...
}
Обратите внимание, что ни в одном случае AtomicBoolean
не требовалось.