java - 从静态类成员转换为文本值
问题描述
我正在制作一个具有条形码扫描功能的 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 的 a。
所以在我的最后,我想要的是让这些数字有一个字符串'EAN_13 : PRODUCT'
,但乍一看,这些public static final
字段并不容易得到匹配的字符串值。
我当然可以Map<int, string>
使用此处显示的所有已知类型制作一个,但我不喜欢这个想法,因为如果添加任何未来格式,我的Map
将过时。而且我不喜欢复制已经存在的信息的想法。
那么如何在 Java 中以一种干净、面向未来的方式将这些整数转换为它们匹配的字符串值呢?
解决方案
我意识到这实际上在技术上是不可能的。代码中没有任何内容可以区分应该是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 值而不是字符串。
推荐阅读
- python - 将文本文件中的字母与变量进行比较返回 False
- pandas - TypeError:Pandas iloc 函数返回此错误
- prerender - Prerender IO 在 localhost 测试上工作,但不适用于 prod 端
- php - 如何确定学说查询缓存是否在 symfony 应用程序中工作
- php - 当有人提交表单时 PHP Nette 抛出错误
- python - 如何在单个图形上标记多个图形的 x 和 y 轴
- ios - 动态键值类型
- c++ - 复制具有“memcpy”技术上未定义行为的二维数组?
- python-3.x - 如何在 python 中回收“threading.Thread”对象?
- haskell - 组成两个折叠