我是通过一些代码行走,碰到这些行:从int创建Integer对象有什么价值吗?
public final static int CM_VALUE = 0x200;
public final static Integer CM = new Integer(CM_VALUE);
不要任何人知道为什么笔者将其传递回Integer
之前举行的十六进制值?这样做是否会为代码添加任何好处?
我是通过一些代码行走,碰到这些行:从int创建Integer对象有什么价值吗?
public final static int CM_VALUE = 0x200;
public final static Integer CM = new Integer(CM_VALUE);
不要任何人知道为什么笔者将其传递回Integer
之前举行的十六进制值?这样做是否会为代码添加任何好处?
这取决于CM的值的用法。如果它被用作位掩码或其他与位相关的操作,它可以增加清晰度。编译器输入与输入硬编码值的基本值没有区别。
然而,奇怪的是,作者然后将其转换为Integer对象,而不是将其用作纯int。
十六进制文字与它们的小数对应表示完全相同的位。
所以不,它对电脑来说并不是更好。
但是,根据使用情况,开发人员可能会更好地阅读。
例如这样的:
private final int FLAG_A = 0x01;
private final int FLAG_B = 0x02;
private final int FLAG_C = 0x04;
private final int FLAG_D = 0x08;
private final int FLAG_E = 0x10;
private final int FLAG_F = 0x20;
private final int FLAG_G = 0x40;
private final int FLAG_H = 0x80;
可能是更容易比这个把握(这是等价的,但是!):
private final int FLAG_A = 1;
private final int FLAG_B = 2;
private final int FLAG_C = 4;
private final int FLAG_D = 8;
private final int FLAG_A = 16;
private final int FLAG_B = 32;
private final int FLAG_C = 64;
private final int FLAG_D = 128;
值可能是位掩码或可能是外部定义常量。在一个位掩码的情况下,最好将它们存储为十六进制值,以使其更加明显。如果它是一个外部常量,那么使用与定义相同的基础使得找到任何拼写错误更容易。
我的投票是为了方便。作者可能需要在集合中使用它,并希望在初始阶段初始化这些静态以获得速度。
...这一个猜测吨!
代码可能来自于自动装箱前的日期(<= Javq 1.4),并且作者试图通过仅使用一次Integer对象的实例来节省内存。 –
当您想要处理二进制表示时,使用十六进制很有用,因此0x200
比二进制表示1000000000
简单。
也许编写这个程序员的地方有一个规则,在源代码中必须没有硬编码的常量,并且通过为它们定义静态最终变量来使用常量。在我看来,这样的规则可能是好的,但在这个例子中,它可能被采用得太过分了。
请注意,通常最好不要使用new Integer(...)
,而应使用Integer.valueOf(...)
。如果您使用valueOf
而不是明确创建新的Integer
对象,则类Integer
可以重用对象。
public final static int CM_VALUE = 0x200;
public final static Integer CM = Integer.valueOf(CM_VALUE);
更妙的是,只使用自动装箱,这使得它甚至不太需要有CM_VALUE
:
public final static Integer CM = 0x200;
'0x200'和'512'是一样的编译器,表示是为代码的读者。我没有这个代码的上下文,但是如果它用于依赖于使用位和字节的操作,它可能会更容易理解。 – birryree
闻到故意的复杂性;-) –
作者是0x00001337 – Markis