// FixedAmountVoucher 클래스의 메서드
public static Voucher createVoucher(CreateVoucherDto createVoucherDto) {
return new FixedAmountVoucher(createVoucherDto.getId(),
createVoucherDto.getValue(),
createVoucherDto.getCreatedAt());
}
함수 네이밍 관련
비지니스 로직을 담당하는 Service단에서 생성 메서드 이름 : create vs insert? → 의문궁금
// VoucherService 클래스의 메서드
public void insertVoucher(VoucherType voucherType, Long value) {
CreateVoucherDto createVoucherDTO = new CreateVoucherDto(value);
this.voucherRepository.insert(voucherType.create(createVoucherDTO));
}
📝 Optional 정리
orElse(new ...) 대신 orElseGet(() -> new ...)
orElse(...)에서 ...는 Optional에 값이 있든 없든 무조건 실행된다. 따라서 ...가 새로운 객체를 생성하거나 새로운 연산을 수행하는 경우에는 orElse() 대신 orElseGet()을 써야한다.
예제코드
@Test
@DisplayName("orElse vs orElseGet 차이는?")
void orElseVsOrElseGet() {
Person person = new Person("hello");
Optional<Person> opt = Optional.ofNullable(person);
// 💩 값이 빈값이 아님에도 실행된다.
opt.orElse(new Person("orElse executed"));
// ✨ 값이 빈값이면 실행되지 않는다.
opt.orElseGet(() -> new Person("orElseGet executed"));
}
class Person {
public String name;
public Person(String name) {
logger.info("created Person : {}", name); // ⚡️ 실행 여부 체크를 위한 로그
this.name = name;
}
}
↓ orElseVsOrElseGet() 실행 결과
...created Person : hello
...created Person : orElse executed