現状valueOf
の方が無駄な処理が挟まりますね。
以下実験結果。Scalaは3.5.2
検証用コード
class A { def xxx: Int = compiletime.constValue[2] def yyy: Int = valueOf[3] }
-Xprint:all
してコンパイルした場合の最後
def xxx(): Int = 2 def yyy(): Int = { given val ev: Integer = Int.box(3).asInstanceOf[Integer] 3 }:Int
javapした場合の結果
public int xxx(); descriptor: ()I flags: (0x0001) ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: iconst_2 1: ireturn LineNumberTable: line 2: 0 LocalVariableTable: Start Length Slot Name Signature 0 2 0 this LA; Signature: #13 // ()I public int yyy(); descriptor: ()I flags: (0x0001) ACC_PUBLIC Code: stack=1, locals=2, args_size=1 0: iconst_3 1: invokestatic #20 // Method scala/runtime/BoxesRunTime.boxToInteger:(I)Ljava/lang/Integer; 4: checkcast #22 // class java/lang/Integer 7: astore_1 8: iconst_3 9: ireturn LineNumberTable: line 4: 0 LocalVariableTable: Start Length Slot Name Signature 8 2 1 ev Ljava/lang/Integer; 0 10 0 this LA; Signature: #13 // ()I
ちなみに 使えるなら
というのは、Intなどのリテラルならどちらでも使えますしboxingが関係しますが、singleton type、つまり object 何か
と定義したものに関してはconstValueでは無理で valueOf
で取得するしかないし、そもそもその場合はboxingも関係ないですね