2016-09-19 20 views
0

私の質問は静的メソッドを使用した非静的フィールド初期化についてです。 は基本的に私のコードは、私がmyListは(すべてのメソッド呼び出しで)この文の後にnullであるというのが私のスポックのテスト中に見つける非静的フィールドの初期化

@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 
    } 

です。私はコンストラクタで初期化を解決しましたが、なぜそれがnullであるのか分かりません。誰も私にこの動作をexplaneすることができます、可能であれば、静的メソッドでフィールドの初期化をよりよく理解するために私にいくつかの参照を与えますか? ありがとう

私は皆さんに同意しますが、ここで何がうまくいかないのか分かりません。私はこのCallableインスタンスを作成するためにlombok builderを使用しています。私はここでの問題は、このテストをデバッグするとき、私は(刺激法では)それがnullである同期リストを使用する場合、それは、NullPointerExceptionがスローということに気づくことである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() 
    } 

には、このようなスポックのテストを実行します。

ビルダーを通常のインスタンス作成とフィールド注入で置き換えようとしましたが、すべてがアスペクトとして機能します。私はロンボクの建築業者の行動を調査する必要があります。

スタックトレース:

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

あなたのコードをもう少し投稿して、それがヌルであることを確認できますか? – Aelexe

答えて

0

上のforeachループです。 @Builderを使用しており、すべてのフィールドを設定できます。そして、それはそれを行います。何が起きているか見るにはdelombokを試してください。

私は詳細についてはよく分からないが、それはこの線に沿って行く: - あなたの@Builder@AllArgsContructor を使用しています - あなたは、ビルダーにmyListを設定していないので、null まま - nullはあなたに渡されます@AllArgsContructor - whoは新しく作成されたオブジェクト(*)にコピーします。

これはissue 916です。正確にはバグではなく、驚くべき動作です。あなたが問題のない、本当に必要な場所に限り、immutablesにのみ@Builderを使用することをお勧めします。


(*)Javaでは、初期化子の式の後にコンストラクタのコードが実行されます。

+0

こんにちは、あなたの説明のおかげで。私はdelombokを使いました。その行動はあなたが説明した通りです。詳細とリンクに感謝します。 – Raffaele

関連する問題