Scala 3ではPredef.valueOfよりscala.compiletime.constValueを使えるなら使おう

現状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

https://github.com/scala/scala/blob/3e2c7f1ccd86a80c07d8c6fd694874e457761951/src/library/scala/Predef.scala#L137

https://github.com/scala/scala3/blob/64411b6d0d3ce716a9dbdf73d871981544eac95f/library/src/scala/compiletime/package.scala#L125

ちなみに 使えるなら というのは、Intなどのリテラルならどちらでも使えますしboxingが関係しますが、singleton type、つまり object 何か と定義したものに関してはconstValueでは無理で valueOf で取得するしかないし、そもそもその場合はboxingも関係ないですね