列表仅存储最后添加的值

时间:2013-07-02 06:52:58

标签: java

我遇到以下代码的问题:

首先,我有一个内部阶级:

public class TraceMessage{
        private String messageType;
        private String tracedIdentifier;
        private List<String> content;



        TraceMessage(){
            content = new ArrayList<String>();
            messageType="";
            tracedIdentifier="";
        }

        TraceMessage(String messageType, String identifier ,List<String> content){
            this.messageType = messageType;
            this.tracedIdentifier = identifier;   
            this.content = content;
        }

它具有3属性的getter和setter。我的问题是:

我有这个消息的列表:

private List<TraceMessage> messages = new ArrayList<TraceMessage>();

我试图像这样添加新元素:

messages.add(new TraceMessage(temp.messageType,temp.tracedIdentifier,temp.content));

其中temp是TraceMessage对象。

所以我的问题是当我向List添加一个类型的消息类型对象时,值很好我甚至将printout放到了构造函数中,它也显示了良好的值。但后来当我尝试使用该List时,列表中的所有元素都具有相同的内容(最后一个)。可能是什么问题?

以下是我添加消息的完整部分:

String fileName="tracefile.MTR";
        BufferedReader br = new BufferedReader(new FileReader(fileName));
        try {   
            String line;
            TraceMessage temp = new TraceMessage();
            while ((line=br.readLine()) != null) {
                if(line.contains("MSCi")){
                     temp.content.clear();
                     temp.content.add(line);
                }
                else if(line.contains("CALL PHASE")){
                     temp.messageType = line.substring(60);
                     temp.content.add(line);
                }

                else if(line.contains("CALL ID")){
                     temp.tracedIdentifier = line.substring(22);
                     temp.content.add(line);
                }
                else if(line.contains("END OF REPORT")){
                    temp.content.add(line); 
                    messages.add(new TraceMessage(temp.messageType,temp.tracedIdentifier,temp.content));          
                }
                else{
                    temp.content.add(line);
                }


            }   

        } finally {
            br.close();



        } 

3 个答案:

答案 0 :(得分:0)

我会重写第二个构造函数来获取列表

的副本
TraceMessage(String messageType, String identifier ,List<String> content){
    this.messageType = messageType;
    this.tracedIdentifier = identifier;   
    this.content = new ArrayList<String>(content);
}

这将复制您在temp.content循环中重复使用的while。对于在课堂外执行的内容收集操作,实例将是安全的。

答案 1 :(得分:0)

TraceMessage temp = new TraceMessage(); 在while循环中

并更改messages.add(new TraceMessage(temp.messageType,temp.tracedIdentifier,temp.content));

messages.add(temp);

好的,如果你不能那样做

替换messages.add(new TraceMessage(temp.messageType,temp.tracedIdentifier,temp.content));messages.add(temp); messages = new TraceMessage();

答案 2 :(得分:0)

更改您的代码:

...
try {   
    String line;

    List<String> content = new ArrayList<String>();
    String messageType = "";
    String tracedIdentifier = "";

    while ((line=br.readLine()) != null) {
        if (line.contains("MSCi")){
            content.clear();
            content.add(line);
        }
        else if (line.contains("CALL PHASE")) {
            messageType = line.substring(60);
            content.add(line);
        }
        else if (line.contains("CALL ID")) {
            tracedIdentifier = line.substring(22);
            content.add(line);
        }
        else if (line.contains("END OF REPORT")) {
            content.add(line); 
            messages.add(new TraceMessage(messageType, tracedIdentifier, content);          
        }
        else {
            content.add(line);
        }
    }   
} finally {
    br.close();
}

不使用temp对象,而是将属性保存在外部变量中(在while循环之外),然后使用这些变量将新对象添加到messages列表中。