对于一个小代码,愿意保存一些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现在如何竞争这一点吗?这是我们应该尽量减少的吗?
答案 0 :(得分:1)
自动取消装箱通过在后台调用适当的方法来工作。在你的情况下Integer.intValue()
。您无法在case语句中调用方法,它必须是要检查的原始值。