需要有关设计和性能问题的建议

时间:2015-11-18 09:00:34

标签: java android class object

我以非常高的速率从服务器检索数据,发送的数据采用类似于以下格式的消息形式:

$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;
    }

}

1 个答案:

答案 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(",");
    }
}