Для небольшого кода, желающего сэкономить некоторые проблемы с боксом / распаковкой, введенные, потому что мне также нужно использовать константу int в качестве целого числа (требуемый вызовом метода 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, такие как Jdk 8 и Jdk 9, не потратят столько усилий на упаковку / распаковку.
Кстати, как дочерняя компания, вы знаете, как сейчас конкурирует Java в этом вопросе? Нужно ли это минимизировать?
width
было больше, чем48
, операция автобокса выдавала бы вам другойInteger
экземпляр каждый раз, когда вы устанавливаетеwidth*3
- person biziclop   schedule 07.04.201743
. Дело в том, что автобокс гарантированно возвращает интернированный экземпляр только до127
, кроме того, вы (вероятно) будете получать другой экземплярInteger
каждый раз, когда значение помещается в коробку. - person biziclop   schedule 07.04.2017