对于int和Integer

时间:2017-04-07 13:14:37

标签: java autoboxing compile-time-constant

对于一个小代码,愿意保存一些Boxing / Unboxing麻烦,因为我还需要使用int常量作为Integer(由Generics方法调用强制执行),我从这个简化的例子开始

enum SOQ {
    TYPEA,
    TYPEB,
    TYPEC;
    public static final int width = 10;

    public static SOQ of(int i) {
        switch (i) {
            case UIOrdinals.TYPEA_ORD:
                return TYPEA;
            case UIOrdinals.TYPEB_ORD:
                return TYPEB;
            case UIOrdinals.TYPEC_ORD:
                return TYPEC;
        }
        throw new UnsupportedOperationException("Not supported yet."); //TODO : implement
    }

    public static class UIOrdinals {

        public static final int TYPEA_ORD = width * 1;
        public static final int TYPEB_ORD = width * 2;
        public static final int TYPEC_ORD = width * 3;
    }
}

到这个

enum SOQBOX {
    TYPEA,
    TYPEB,
    TYPEC;
    public static final Integer width = 10;

    public static SOQBOX of(int i) {
        switch (i) {
            case UIBoxOrdinals.TYPEA_ORD:
                return TYPEA;
            case UIBoxOrdinals.TYPEB_ORD:
                return TYPEB;
            case UIBoxOrdinals.TYPEC_ORD:
                return TYPEC;
        }
        throw new UnsupportedOperationException("Not supported yet."); //TODO : implement
    }

    public static class UIBoxOrdinals {

        public static final Integer TYPEA_ORD = width * 1;
        public static final Integer TYPEB_ORD = width * 2;
        public static final Integer TYPEC_ORD = width * 3;
    }
}

没什么大不了的。

正如我所说,我这样做是因为辅助方法在'宽度'上传递。  这个方法(将经常调用)需要一些泛型类型参数(不允许原语),因此需要引入Integer。

我的眼睛似乎很明显TYPEnnn_ORD仍然是常量,并且仍然是编译时常量 但这不是java编译器的观点: “需要常量表达”是错误。

只是想知道为什么在这个简单的情况下?它与拳击有关,但是如何以及为什么?

与此同时,我回到原始的int,希望像Jdk 8和Jdk 9这样的现代jdk不会在拳击/拆箱方面浪费太多精力。

顺便说一下,作为一个子公司,你知道java现在如何竞争这一点吗?这是我们应该尽量减少的吗?

1 个答案:

答案 0 :(得分:1)

自动取消装箱通过在后台调用适当的方法来工作。在你的情况下Integer.intValue()。您无法在case语句中调用方法,它必须是要检查的原始值。