java 8 부터 추가된 stream API 의 peek, map을 사용하던 도중 sonaLint를 통하여 peek사용과 map 사용이 잘못된 부분을 확인함. 해당 API를 이런식으로 사용한 이유는 객체의 내부 값을 순차적으로 적용하고 싶었음. 하지만 문제가 발생할 수 있다는 점을 sonaLint에서 발견함.
static <T> ClassModel[] createClassModels(Class<T> clazz) {
Function<Field, ClassModel> classModelSupplier = ClassModel::new;
SheetStyleConfigurer sheetStyle = ClassModel.createSheetStyle(clazz);
AtomicInteger atomicInteger = new AtomicInteger(0);
return ReflectionUtils.getDeclaredFields(clazz)
.stream()
.filter(field -> field.isAnnotationPresent(Column.class))
.map(classModelSupplier)
.map(ClassModel :: setColumn)
.map(ClassModel :: setDefaultValue)
.map(ClassModel :: setFieldName)
.map(classModel -> classModel.setPriority(atomicInteger.getAndIncrement()))
.map(classModel -> classModel.setSheetStyleConfigurer(sheetStyle))
.map(ClassModel :: setCellStyleConfigurer)
.map(ClassModel :: setCellFormat)
.toArray(ClassModel[] :: new);
}
Java
복사
해당 코드
해당 API의 사용이 문제가 되는 이유
private List<Structure> createStructures(Class<?> clazz) {
AtomicInteger atomicInteger = new AtomicInteger(0);
return ReflectionUtils.getDeclaredFields(clazz)
.stream()
.filter(Structure ::existsColumnAnnotation)
.map(field -> new Structure(clazz, field, atomicInteger.getAndIncrement()))
.collect(Collectors.toList());
}
Java
복사
수정 코드