2

我对以下代码有疑问:

首先我有一个内部类:

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 对象。

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

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

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();



        } 
4

3 回答 3

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使用这些变量将新对象添加到列表中。

于 2013-07-02T07:17:21.287 回答
0

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

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

这将复制temp.content您正在while循环重用的内容。实例将不受在类外执行的内容集合操作的影响。

于 2013-07-02T06:57:11.057 回答
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();

于 2013-07-02T07:01:11.913 回答