首页 > 解决方案 > 从静态类成员转换为文本值

问题描述

我正在制作一个具有条形码扫描功能的 Android 应用程序,当我得到结果时,它会作为Barcode类的实例返回。对于这个问题,它有两个我感兴趣的值:barcode.formatbarcode.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.format32 和barcode.valueFormat5 的 a。

所以在我的最后,我想要的是让这些数字有一个字符串'EAN_13 : PRODUCT',但乍一看,这些public static final字段并不容易得到匹配的字符串值。

我当然可以Map<int, string>使用此处显示的所有已知类型制作一个,但我不喜欢这个想法,因为如果添加任何未来格式,我的Map将过时。而且我不喜欢复制已经存在的信息的想法。

那么如何在 Java 中以一种干净、面向未来的方式将这些整数转换为它们匹配的字符串值呢?

标签: javaandroid

解决方案


我意识到这实际上在技术上是不可能的。代码中没有任何内容可以区分应该是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 值而不是字符串。


推荐阅读