Пример кода:
int a = 255;
byte b = (byte) a;
int c = b & 0xff; // Here be dragons
System.out.println(a);
System.out.println(b);
System.out.println(c);
Итак, мы начинаем с целочисленного значения 255, преобразуем его в байт (становимся -1), а затем преобразуем его обратно в int с помощью магической формулы. Ожидаемый результат:
255
-1
255
Мне интересно, является ли этот a & 0xff
самым элегантным способом для этого преобразования. checkstyle, например, жалуется на использование магического номера в этом месте, и не рекомендуется игнорировать это значение для этой проверки, потому что в других местах 255 действительно может быть волшебным числом, которого следует избегать. И это довольно раздражает, чтобы определить константу для таких вещей самостоятельно. Поэтому я задаюсь вопросом, есть ли стандартный метод в JRE, который делает это преобразование? Или, возможно, уже определенная константа с наивысшим значением без знака байта (аналогично Byte.MAX_VALUE, которое является наивысшим подписанным значением)
Итак, чтобы задать короткий вопрос: как я могу преобразовать байт в int без использования магического номера?
Хорошо, до сих пор упоминались следующие возможности:
- Продолжайте использовать
& 0xff
и игнорируйте магический номер 255 в checkstyle. Недостаток: другие места, которые могут использовать это число в какой-либо другой области (не бит-операции), также не проверяются. Преимущество: Короткое и легко читаемое. - Определите для меня свою константу, а затем используйте код, например
& SomeConsts.MAX_UNSIGNED_BYTE_VALUE
. Недостаток: если мне это нужно в разных классах, тогда я должен определить свой собственный постоянный класс только для этой константы. Преимущество: здесь нет магических чисел. - Сделайте какую-нибудь умную математику, как
b & ((1 << Byte.SIZE) - 1)
. Вывод компилятора, скорее всего, тот же, поскольку он оптимизируется до постоянного значения. Недостаток: Довольно много кода, трудночитаемого. Преимущество: Пока1
не определяется как магическое число (checkstyle игнорирует его по умолчанию), здесь нет магического числа, и нам не нужно определять пользовательские константы. И когда байты переопределены до 16 бит в один прекрасный день (просто шучу), то он все еще работает, потому что тогда Byte.SIZE будет 16, а не 8.
Есть ли еще идеи? Может быть, какая-то другая умная побитовая операция, которая короче, чем выше, и использует только числа, такие как 0 и 1?