我遇到以下代码的问题:
首先,我有一个内部阶级:
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();
}
答案 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
列表中。