我以非常高的速率从服务器检索数据,发送的数据采用类似于以下格式的消息形式:
$FMSn,par1,par2...,...,...,...,..,...,....,par20 //where n is number ranges from 1 to 12
这条消息我需要处理来解析一些数据。
但是服务器以不同的格式发送其他消息的频率较低,该消息并不重要且可以丢弃,并且它与之前描述的格式消息之间的区别在于 上一条消息以$ FMS开头,而另一条消息则不是。
要区分这些消息以了解应该处理哪一个消息,我创建了一个类FMSParser,如下所示,我检查了消息头是否
$FMS
与否。
我的问题是,我应该在接收来自服务器的消息的循环中创建FMSParser类的新对象,还是在整个中创建一个对象 程序和在接收数据的循环中我只调用isValid方法和getParam()。换句话说,在代码中:
我应该选择解决方案1还是2?
解决方案1 :
loop for messages receiving:
msg = receive message();
fmsParser = new FMSParser(msg);
if (fmsParser.isValid) {
params = fmsParser.getParam();
}
解决方案2 :
fmsParser = new FMSParser();
loop for messages receiving:
msg = receive message();
if (fmsParser.isValid(msg)) {
params = fmsParser.getParam();
}
码:
private class FMSParser {
private final static String HEADER = "$FMS"
private String[] mSplittedMsg;
FMSParser() {}
public boolean isValidMsg(String msg) {
boolean isValid = false;
this.mSplittedMsg = msg.split(",");
for (int i = 0; i < 12; i++) {
if (splittedMsg[0].equals(HEADER+i)) {
valid = true;
break;
}
}
return valid;
}
public String [] getParam() {
return this.mSplittedMsg;
}
}
答案 0 :(得分:1)
如果每次通过循环构造一个新的FMSParser,它将需要内存分配和垃圾收集。
我会选择使FMSParser不可变的选项3,这意味着它是线程安全的。
FMSParser fmsParser = new FMSParser();
while (messageIterator.hasNext()) {
String msg = messageIterator.next();
if (fmsParser.isValid(msg)) {
params = fmsParser.getParam(msg);
}
}
例如:
public class FMSParser {
public boolean isValid(String msg) {
return msg.startsWith("$FMS");
}
public String[] getParams(String msg) {
return msg.split(",");
}
}