我想实现一个EAN128条形码分析器。简而言之,EAN128条码由一个或多个字段构成,每个字段由一个字符串标识符和一个值组成。有一百个不同的标识符,每个值具有固定或可变长度(数字或字母数字)取决于标识符。可变长度值以名为FNC1的特殊字符结束。
我想从条形码中获取所有标识符及其值。
我的设计基于枚举,每个代码标识符都有一个字段。有很多字段的枚举设计
public enum IDENT_EAN128 {
// Identifier 8003 that has a value composed by 14 numeric chars and 1 to 20 alphanumeric chars
IDENT_8003 ("8003", FixedParser(14, NUMERIC), VariableParser(20, ALPHANUMERIC)),
IDENT_00 ("00", FixedParser(18, NUMERIC)),
.... // hundred identifiers
private IDENT_EAN128 (String code, Parser... parsers) {
...
}
public static IDENT_EAN128 search (String code) {
// loop IDENT_EAN128.values() to search code identifier
}
}
public class Main {
public static void test() {
String id1 = "8003";
String field1 = "123456789";
String field2 = "12345" + FNC1;
String id2 = "00";
String field3 = "123456789";
String barcode = id1 + field1 + field2 + id2 + field3;
for (int posBarcode; posBarcode < barcode.length(); posBarcode++) { // loop chars of barcode
char[] buffer ...
IDENT_EAN128 idEAN = IDENT_EAN128.search(buffer)
if (idEAN != null) {
// loop Parsers for get identifier value
// move posBarcode to the first barcode position of next identifier
}
....
}
}
}
解析器返回标识符值,验证其长度并且该值具有正确的字符类型(数字或字母数字)。 这个设计的问题是,当第一次被调用时,它会创建数百个新对象(每个标识符和它的解析器)。大多数时候条形码只有3或4个标识符。所以,我认为这是时间和记忆的一种滋味。我搜索解析器的“懒惰inizialitation”设计,但我还没有找到与我的问题相对应的东西。有更好的设计吗?或者我的担心是没有用的。
谢谢
那么“存储”映射中的值实际上会被读取和返回吗? 'search'方法是否只返回'INSTANCE'? – 2014-09-02 14:37:15
使用地图存储解析器对象似乎是一个好主意,我只有两个Parser对象的对象实例。但它是否安全?正如马特所说,我没有看到如何从搜索方法中获得标识符。 – user1151816 2014-09-02 15:04:46
请参阅我的文章的编辑。我澄清了搜索功能中的逻辑。因此,如果代码包含在地图中,则返回所需的内容,否则将其初始化。对于线程安全来说,锁现在保护对hashmap的访问。 – Esquive 2014-09-02 15:18:35