2017-09-28 9 views
1

プロジェクトでは、メール送信機能を担当しましたが、問題が発生したときにキューを使用していました。 list.Iの最後の要素の内容はキュー内の要素が同じ理由

private void createReportEmail() 
{ 
    try 
    { 
     List<Map> list = emailMapper.getToAddress(); 
     System.out.println(list); 
     MailSenderInfo mailSenderInfo = new MailSenderInfo(); 
     mailSenderInfo = CreateEmailService.sendReportMail(emailMapper); 
     InternetAddress address = new InternetAddress(); 
     for (int i = 0; i < list.size(); i++) 
     { 
      if (list.get(i).get("address").toString() != null && list.get(i).get("address").toString() != "") 
       address = new InternetAddress(list.get(i).get("address").toString()); 
      MailSenderInfo mailSenderInfo2 = new MailSenderInfo(); 
      mailSenderInfo2 = mailSenderInfo; 
      mailSenderInfo2.setAddress(address); 
      queue.offer(mailSenderInfo2); 
     } 
     for(int i =0;i<list.size();++i) 
     { 
      System.out.println(queue.poll().getAddress()); 
     } 

    } catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

は、今私はリスト内の要素が互いに異なっていると確信しているが、すべてのことは、キューに格納されている理由

+0

'(list.get(i).get(" address ")。toString()!= null && list.get(i).getに対して' StringUtils.isBlank() 'クラスを使用しないでください。 ( "アドレス")。toString()!= "") '。 これは、両方の条件を 'isBlank()'メソッドでチェックします。ありがとうございました:) –

答えて

3

を知りたいですループの各反復で新しいMailSenderInfoインスタンスを作成していますが、それは正しいことですが、既存のMailSenderInfoインスタンス(ループの前に-で作成されたもの)に置き換えます。したがって、常に同じMailSenderInfoインスタンスを追加しますキューに:

for (int i = 0; i < list.size(); i++) { 
     ... 
     MailSenderInfo mailSenderInfo2 = new MailSenderInfo(); 
     mailSenderInfo2 = mailSenderInfo; // remove this 
     mailSenderInfo2.setAddress(address); 
     queue.offer(mailSenderInfo2); 
    } 
+0

はい、私はアドレス 'を変更すると'アドレス 'を変更しますが、私はそれらのすべてが同じであることがわかりました。 – Vayne

+1

@Vayneそれは問題ではありません。キューに同じオブジェクトを複数回追加すると、 'mailSenderInfo2.setAddress(address)'を呼び出すと、キューのすべての要素のアドレスが変更されます。 – Eran

+0

ええ、たぶん私は理由を知っているでしょう。キューはポインタに格納されていて、私が変更したのは唯一のオブジェクトであり、すべての要素(ポインタ)が同じオブジェクトを指しています。 – Vayne

0

私はStringUtils

if (StringUtils.isNotBlank(list.get(i).get("address").toString())) 
     address = new InternetAddress(list.get(i).get("address").toString()); 
     MailSenderInfo mailSenderInfo2 = new MailSenderInfo(); 
     mailSenderInfo2.setAddress(address); 
     queue.offer(mailSenderInfo2); 

ifブロックで別の変更を提案し、ラインmailSenderInfo2 = mailSenderInfo;を削除します。古いオブジェクト参照を含むmailSenderInfoが含まれているためです。

+0

良いアイデアです。ありがとうございました! – Vayne

関連する問題