示例代码:
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是最高有符号值)?
因此,为了让问题简短:如何将字节转换为整数而不使用魔法数字?
好吧,到目前为止提到了以下几种可能性:
- 继续使用
& 0xff
并忽略checkstyle中的魔法数字255。缺点:其他可能在一些其他范围(而非位运算)使用该数字的地方也将不进行检查。优点:简短易读。 - 为其定义自己的常量,然后使用代码
& SomeConsts.MAX_UNSIGNED_BYTE_VALUE
。缺点:如果我需要在不同的类中使用它,则必须定义自己的常量类。优点:这里没有魔法数字。 - 进行一些聪明的数学计算,例如
b& ((1 << Byte.SIZE) - 1)
。编译器输出最可能相同,因为它被优化为一个常量值。缺点:代码很长,难以阅读。优点是:只要1
未被定义为魔法数字(checkstyle默认忽略它),我们就没有魔法数字,也不需要定义自定义常量。而且如果有一天重新定义字节为16位(开玩笑),那么它仍然有效,因为Byte.SIZE将变为16而不是8。
还有更多想法吗?也许会有其他比上述方法更短并且只使用0和1之类的数字的聪明位运算吗?