我正在制作一个具有条形码扫描功能的Android应用程序,当我得到结果时,它会返回为Barcode
类的实例。对于这个问题,它具有两个我感兴趣的值:barcode.format
和barcode.valueFormat
这两个值都是整数,据我所知,这些整数与作为Barcode类定义中的静态字段的Enum基本(但不是)匹配。
因此,出于说明目的,您具有如下的Barcode类定义:
public class Barcode extends AbstractSafeParcelable {
...
public static final int ALL_FORMATS = 0;
public static final int CODE_128 = 1;
public static final int CODE_39 = 2;
public static final int CODE_93 = 4;
public static final int CODABAR = 8;
public static final int DATA_MATRIX = 16;
public static final int EAN_13 = 32;
public static final int EAN_8 = 64;
public static final int ITF = 128;
public static final int QR_CODE = 256;
public static final int UPC_A = 512;
public static final int UPC_E = 1024;
public static final int PDF417 = 2048;
public static final int AZTEC = 4096;
public static final int CONTACT_INFO = 1;
public static final int EMAIL = 2;
public static final int ISBN = 3;
public static final int PHONE = 4;
public static final int PRODUCT = 5;
public static final int SMS = 6;
public static final int TEXT = 7;
public static final int URL = 8;
public static final int WIFI = 9;
public static final int GEO = 10;
public static final int CALENDAR_EVENT = 11;
public static final int DRIVER_LICENSE = 12;
...
然后barcode
实例返回的barcode.format
为32,barcode.valueFormat
为5。
因此,在我的末端,我想让这些数字具有一个字符串'EAN_13 : PRODUCT'
,但是乍一看,这些public static final
字段并不容易获得匹配项字符串值。
我当然可以用此处显示的所有已知类型制作一个Map<int, string>
,但是我不喜欢这个想法,因为如果将来添加任何格式,我的Map
将会过时。而且我不喜欢复制已经存在的信息的想法。
那么如何在Java中以一种干净的,面向未来的方式将这些int转换为它们匹配的String值?
答案 0 :(得分:0)
我做了一个简单的ans简单示例,向您展示了如何做到这一点。当然,我建议您进行一些过滤(以防万一,在尝试解析之前,请确保它是一个int),但这超出了本POC的范围
public class Declared {
public static final int ONE = 1; // you can add any number of field here
public static final int TWO = 2; // it should still work. for private fields
// check the api to verify
public static void main(String[] args) throws Exception {
// get the fields in the Declared class, currently ONE and TWO
final Field[] declaredFields = Declared.class.getDeclaredFields();
Map<String, Integer> fields = new HashMap<>();
// add it field by field
for ( Field field : declaredFields ) {
fields.put(field.getName(), Integer.valueOf(field.getInt(null)));
}
// check the entryset for each element in your hashmap. it contains all you need
final Set<Map.Entry<String, Integer>> entries = fields.entrySet();
for ( Map.Entry<String, Integer> entry : entries ) {
System.out.println(entry.getKey() + " - > " + entry.getValue());
}
}
}
答案 1 :(得分:0)
我已经意识到实际上在技术上是不可能的。代码中没有任何内容可以区分应该为barcode.format
和barcode.valueFormat
的值,而这样做的问题是存在重叠的值。例如,Barcode.CONTACT_INFO
和Barcode.CODE_128
都具有1
的值,因此即使我能够使用反射来创建我的Map<Integer, String>
,地图也只能拥有1.的两个值之一。
我已经实现了如何获取地图的信息:
public static Map<Integer, String> getIntFields(Class clz ) {
Field[] fields = clz.getFields();
HashMap<Integer, String> map = new HashMap<Integer, String>();
for( Field field : fields ) {
int modifiers = field.getModifiers();
if (field.getType().equals(int.class) && Modifier.isStatic(field.getModifiers())) {
String name = field.getName();
int value = 0;
try {
value = field.getInt(null);
} catch (IllegalAccessException e) {
continue;
}
if (map.containsKey(value)) {
// do nothing
} else {
map.put(value, name);
}
}
}
return map;
}
然后我意识到了上面的问题。有点烦人的问题,不知道这是因为Barcode类的设计不佳还是不打算以这种方式使用它(可能是后者)。但是我想要的东西在技术上是不可能的,因此我将只使用int值而不是字符串。