2016-09-19 2 views
0

내 질문은 정적 메서드를 사용하여 비 정적 필드 초기화에 관한 것입니다. 기본적으로 내 코드는비 정적 필드 초기화

@NoArgsConstructor 
@Builder 
public class MyClass implements Callable<MyResultClass>{{ 

     @Setter private MyService service; 

     List<MyType> myList = 
     Collections.synchronizedList(new ArrayList<MyType>()); 

    //.... other fields methods and so on 
    } 

내가 myList는 (모든 메소드 호출에서)이 문 뒤에 널 나의 스팍 테스트 중에 발견이다. 생성자에서 초기화를 해결했지만 null 인 이유를 알아낼 수 없습니다. 아무도 나 에게이 동작 explane 수 있고, 가능한 경우, 정적 메서드를 사용하여 필드 초기화를 더 잘 이해할 수있는 몇 가지 참조를 제공합니까? 감사합니다.

여러분 모두 동의합니다. 여기서 잘못된 점을 이해하지 못합니다. 이 Callable 인스턴스를 생성하기 위해 lombok 빌더를 사용하고 있습니다. 여기 intellij2016

class InboundMessageListenerSpec extends Specification{ 
     private MyService service = Mock(MyService) 

     given: 
     def myClassObject = MyClass.builder().service(service).build() 
     ....other objects 

     when: 
     //stimulus that also starts the thread 

     then: 
     1 * service.myMethod() 
    } 

에 문제 이런 스팍 테스트 실행이 시험 디버깅 때 그것은 널 동기화 된 목록을 사용하여이 (자극 방법) NullPointerException이 언제 발생 알 수 있다는 것이다.

정상적인 인스턴스 작성 및 필드 주입으로 빌더를 대체하려고 시도했지만 모두 aspected로 작동합니다. 나는 롬복 건축업자의 행동에 대해 조사 할 필요가있다.

스택 추적 :

java.lang.NullPointerException: null 
    at org.fw.adapters.secondary.NetworkInventoryDataAdapter.deleteCvlanRows(NetworkInventoryDataAdapter.java:111) 
    at org.fw.kernel.flows.executors.StartMigrationExecutor.call(StartMigrationExecutor.java:114) 
    at org.fw.kernel.flows.executors.StartMigrationExecutor.call(StartMigrationExecutor.java:34) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) 
    at java.lang.Thread.run(Thread.java:662) 

라인 (111)은 상기에서 잘 알려진 문제이다

+2

불가능합니다. 증거 좀주세요. 초기화 프로세스는 [Java 언어 사양 # 12.5] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.5)에 정의되어 있습니다. – EJP

+0

'mylist' 결과는 새로운 'MyClass'를 작성할 때 빈 목록이됩니다. – passion

+1

어떻게하면 코드가 더 이상 널 (null)인지 확인 할 수 있습니까? – Aelexe

답변

0

에 foreach 루프이다. @Builder을 사용 중이므로 모든 입력란을 설정할 수 있습니다. 그리고 그것을합니다. 어떤 일이 일어나는지 보려면 delombok을 시도하십시오.

나는 세부 사항에 대한 모르겠지만,이 라인을 따라 간다 : - 당신의 @Builder@AllArgsContructor 사용 - 당신이 빌더에서 myList를 설정하지 않은, 그래서 null 유지 - null이 전달됩니다 당신의 @AllArgsContructor - 누가 새로 생성 한 개체 (*)에 복사합니까

그건 issue 916입니다. 정확하게 버그는 아니며 단지 놀라운 행동입니다. 당신은 문제가없고 어디에서 정말로 필요로하는지, immutables에만 대해서 @Builder을 사용하는 것이 좋습니다.


(*) Java에서 생성자 코드는 초기화 프로그램 표현식 다음에 실행됩니다.

+0

안녕하세요, 설명해 주셔서 감사합니다. 내가 delombok을 사용하고 행동은 당신이 묘사 한 것과 똑같습니다. 세부 사항 및 링크에 대해 감사드립니다. – Raffaele

관련 문제