从静态类成员转换为文本值

时间:2019-06-11 09:51:49

标签: java android

我正在制作一个具有条形码扫描功能的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.format为32,barcode.valueFormat为5。

因此,在我的末端,我想让这些数字具有一个字符串'EAN_13 : PRODUCT',但是乍一看,这些public static final字段并不容易获得匹配项字符串值。

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

那么如何在Java中以一种干净的,面向未来的方式将这些int转换为它们匹配的String值?

2 个答案:

答案 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.formatbarcode.valueFormat的值,而这样做的问题是存在重叠的值。例如,Barcode.CONTACT_INFOBarcode.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值而不是字符串。