2011-09-30 22 views
1

我是通过一些代码行走,碰到这些行:从int创建Integer对象有什么价值吗?

public final static int CM_VALUE = 0x200; 
public final static Integer CM = new Integer(CM_VALUE); 

不要任何人知道为什么笔者将其传递回Integer之前举行的十六进制值?这样做是否会为代码添加任何好处?

+1

'0x200'和'512'是一样的编译器,表示是为代码的读者。我没有这个代码的上下文,但是如果它用于依赖于使用位和字节的操作,它可能会更容易理解。 – birryree

+0

闻到故意的复杂性;-) –

+0

作者是0x00001337 – Markis

回答

1

这取决于CM的值的用法。如果它被用作位掩码或其他与位相关的操作,它可以增加清晰度。编译器输入与输入硬编码值的基本值没有区别。

然而,奇怪的是,作者然后将其转换为Integer对象,而不是将其用作纯int。

0

十六进制文字与它们的小数对应表示完全相同的位。

所以不,它对电脑来说并不是更好。

但是,根据使用情况,开发人员可能会更好地阅读。

例如这样的:

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; 
0

值可能是位掩码或可能是外部定义常量。在一个位掩码的情况下,最好将它们存储为十六进制值,以使其更加明显。如果它是一个外部常量,那么使用与定义相同的基础使得找到任何拼写错误更容易。

2

我的投票是为了方便。作者可能需要在集合中使用它,并希望在初始阶段初始化这些静态以获得速度。

...这一个猜测吨!

+0

代码可能来自于自动装箱前的日期(<= Javq 1.4),并且作者试图通过仅使用一次Integer对象的实例来节省内存。 –

0

当您想要处理二进制表示时,使用十六进制很有用,因此0x200比二进制表示1000000000简单。

0

也许编写这个程序员的地方有一个规则,在源代码中必须没有硬编码的常量,并且通过为它们定义静态最终变量来使用常量。在我看来,这样的规则可能是好的,但在这个例子中,它可能被采用得太过分了。

请注意,通常最好不要使用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;