In Java, what's the benefit of int constant declared by an object way:
public final static Integer SOME_CONSTANT = Integer.valueOf(99);
instead of classic
public final static int SOME_CONSTANT = 99;
I know the basic difference between objects and primitives, also autoboxing. But I have seen this declaration in our company's code and I wonder, is there any particular reason of declaring integer constant as an object?
It depends on how you plan to use the constant. If you have an API which requires an Integer, then using the int form will have a small performance penalty because of auto-boxing.
If you just need the primitive, the unboxing of Integer isn't very expensive but easy to avoid.
Also note that
Integer SOME_CONSTANT = Integer.valueOf(99);
is exactly the same as
Integer SOME_CONSTANT = 99;
The *.valueOf() methods were added the API to give the compiler a common  way to auto-box primitives.
There is actually some difference between the 2. Looking at the byte code will reveal that info.
public final static int SOME_CONSTANT = 99;
Will be a compile time constant. So the value of this thing will be available as part of the byte code itself.
Byte code :
 public static final int SOME_CONSTANT;
   descriptor: I
   flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
   ConstantValue: int 99
public final static Integer SOME_CONSTANT1 = Integer.valueOf(99);
Although instances of Integer class are immutable, they will not turn into compile time constants. They are run as part of the static initializer of the class.
Byte code :
 public static final java.lang.Integer SOME_CONSTANT1;
    descriptor: Ljava/lang/Integer;
    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL
  static {};
    descriptor: ()V
    flags: ACC_STATIC
    Code:
      stack=1, locals=0, args_size=0
         0: bipush        99
         2: invokestatic  #14                 // Method java/lang/Integer.valueO
f:(I)Ljava/lang/Integer;
         5: putstatic     #20                 // Field SOME_CONSTANT1:Ljava/lang
/Integer;
         8: return
      LineNumberTable:
        line 4: 0
        line 5: 8
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With