2017-11-30 19 views
2

내 프로젝트에 Lombok을 사용하고 있습니다. 나는 다음 작업을 수행 할Lombok Builder 주석으로 UnsupportedOperationException이 throw됩니다.

@Builder 
@Data @AllArgsConstructor 
public class ScreenDefinitionDTO { 
    @Singular 
    private List<ScreenDeclaration> screens; 
} 

: 같은 내 모델은 보이는

인스턴스가 생성됩니다
String screenName = ctx.screenName().getText(); 
ScreenDeclaration declaration = ParsingUtils 
       .buildScreenDeclaration(StringUtils.trim(screenName)); 

:

public static ScreenDefinitionDTO buildEmptyScreenDTO() { 
    return ScreenDefinitionDTO.builder() 
      .screens(new ArrayList<>()) 
      .build(); 
} 

을 마지막으로, 내가 가진 :

Exception in thread "main" java.lang.UnsupportedOperationException 
    at java.util.AbstractList.add(AbstractList.java:148) 
    at java.util.AbstractList.add(AbstractList.java:108) 

내가 cr을 바꿨을 때 롬복 빌더 패턴 모든 것을하지 않고 인스턴스를 먹는 것은 괜찮 :

public static ScreenDefinitionDTO buildEmptyScreenDTO() { 
    return new ScreenDefinitionDTO(new ArrayList<>()); 
} 

나는 롬복의 빌더 패턴에 어떤 문제가 있는지 이해할 수 없었다?

+0

나는 스택 추적에서 더 볼 것이있다. 'Collection $ UnmodifiableList' 또는 비슷하게 설명하는 것과 같은 것입니다. – maaartinus

+0

@maaartinus 이런 종류의 출력과 관련된 것을 보지 못했습니다. –

+0

내가 틀렸어. 'lombok.singular.useGuava = true'를 설정하고 java.lang.UnsupportedOperationException을 얻습니다. \t com.google.common.collect.ImmutableCollection.add (ImmutableCollection.java:221)'에 있지만'Collections'는 단순히 상속에 의존합니다. 던지는 방법. – maaartinus

답변

3

인해 guthub issue

롬복 @Builder은 주로 당신이 더 들어 UnsupportedOperationException

이 이유 Collections.unmodifiableList 또는 구아바의 ImmutableList

중 하나 immutables에 대한 의미 (및 사용합니다 예외가있는 곳에서 확실한 코드 패턴을 재생산하십시오.

+0

해결 방법이 있습니까? 롬복의 건축업자를 건너 뛰는 것은 일하고있다, 그러나, 그것은 매우 편리하지 않다. –

+0

@nazar_art AFAIK 아니요,하지만 불변 개체를 사용하는 것은 어떻습니까? 때로는 나쁜 생각이지만 때로는 그렇지 않습니다. 'toBuilder' (당신이'@ Builder' 주석에 그것을 허용했다면)도 있습니다. 이것은 당신에게 가변 객체를 다시줍니다. – maaartinus

0

@ fbokovikov에 의하면 @Builder annotation은 immutables를 사용하므로 목록에 요소를 추가하려고하면 예외가 발생합니다.

dto.getScreens().add(new ScreenDeclaration()) // throws java.lang.UnsupportedOperationException 

당신은 그 형태가 Collections$EmptyList입니다 볼 수 있습니다 dto.getScreens()에 의해 반환 된 값을 볼 중단 점을 설정합니다. DTO 생성자를 사용하는 경우 형식은 ArrayList이고 예외는 throw되지 않습니다.