2017-04-03 9 views
0

非常にシンプルなものがあるかもしれませんが、基本的にはarrayListというグローバルに格納したいオブジェクトがあります。しかし、私が関数を残して、同じarrayListのオブジェクト要素にアクセスしようとすると、フィールドが上書きされていて、わかりません。ArrayListを使用しているときにオブジェクトフィールドが上書きされる[デバッグヘルプ]

問題を特定の地域に限定し、関連するコードを表示します。日付(timeSlot \ Calendar)オブジェクトがこの問題のインジケータです。

requestHandler(){ 
     Pattern pattern = Pattern.compile("*irrelevant regex*"); 
     Matcher matcher = pattern.matcher(element); 

     while(matcher.find()) { 

      int requestID = Integer.parseInt(matcher.group(1)); 

      Calendar startDate = dateHandler(matcher.group(2)); 
      Calendar endDate = dateHandler(matcher.group(3)); 

      TimeSlot timeSlot = generateTimeSlot(startDate, endDate);   
      TransmissionRequest t_Request = transmissionHandler(matcher.group(4)); 

      BookingRequest request = new BookingRequest(requestID, timeSlot, t_Request); 

      requestList.add(request); 

      // debug // 
      System.out.println(request); 
     } 
} 

デバッグの目的のために、私は出力文を最後に追加しました。正しい出力が得られます。基本的にtimeSlotをそれぞれBookingRequestの文字列として出力します。正しいtimeSlotの値を持つrequestオブジェクトは、requestListに追加されています。

OUTPUT(私は無関係なフィールドを残している)

BookingRequest:1 
Date= 11:00 Mar-25 to 12:00 Mar-26 

BookingRequest:2 
Date= 12:00 Mar-24 to 03:00 Mar-27 

BookingRequest:3 
Date= 01:00 Mar-26 to 09:00 Mar-26 

BookingRequest:4 
Date= 11:00 Mar-25 to 09:00 Mar-26 

BookingRequest:5 
Date= 11:00 Mar-26 to 09:00 Mar-27 

しかし、できるだけ早く私は、この機能を残し、ArrayListのrequestListを経由して、このまったく同じ出力を印刷しようとして、私は次のように取得します。

OUTPUT

BookingRequest:1 
Date= 11:00 Mar-26 to 09:00 Mar-27 

BookingRequest:2 
Date= 11:00 Mar-26 to 09:00 Mar-27 

BookingRequest:3 
Date= 11:00 Mar-26 to 09:00 Mar-27 

BookingRequest:4 
Date= 11:00 Mar-26 to 09:00 Mar-27 

BookingRequest:5 
Date= 11:00 Mar-26 to 09:00 Mar-27 

timeSlotオブジェクトが処理される非常に最後timeSlotオブジェクトによって上書きされていることが表示されます。私は配列に何も修正を加えておらず、requestHandler()が呼び出された直後にこの出力を得るようにしました。以下のコード。ここで

for(String element : input){ 

    // Extract requests 
    if(element.matches("^Request.*")){ 
     requestHandler(element); 
    } 

} 
for(BookingRequest request : requestList){ 
    System.out.println(request); 
} 

あなたは問題がそこにあると信じていた場合にも、関連するhandlergenerate機能です。両方ともTimeSlotCalendarの新しいインスタンスを作成するので、同じインスタンスの再割り当てに問題はないと思います。

public static Calendar dateHandler(String stringExtract){ 
    Calendar date = new GregorianCalendar(); 
    SimpleDateFormat format = new SimpleDateFormat("HH MMM dd", Locale.ENGLISH); 
    try { 
     date.setTime(format.parse(stringExtract)); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    return date;  
} 


public static TimeSlot generateTimeSlot(Calendar start, Calendar end){ 
    TimeSlot newTimeSlot = new TimeSlot(start, end); 
    return newTimeSlot; 
} 

私は、正確な問題が何であるかを理解するのに非常に時間をかけました。 matcher.find()の動作と関係があるかもしれないという気持ちがありますが、文字通り、正確な問題だけでは解決できないことを特定するためにすべてを試しています。

ご協力いただければ幸いです。

+0

あなたのご意見をお待ちしています。 –

+0

あなたのBookingRequest pojoを共有できますか? – Alekhya

+0

申し訳ありませんが、私はこれらのコメントの前に返信できませんでした、眠りに落ちました。 –

答えて

1

静的フィールドを確認する必要があります。すなわち、BookingRequest.timeSlot、またはTimeSlotです。

+0

mg。私はそれを信じていない。私は私の 'BookingRequest'コンストラクタに静的変数を持っていました。私は自分でそれをタイプしなかったと確信していますが、eclipseにはそれを作った簡単な修正オプションがありました。本当にありがとう! –

関連する問題