Magnolia Tech

いつもコードのことばかり考えている人のために。

Scala3勉強メモ: enumが作るメソッド

パラメータを取るenumを作ると、case classみたいにいい感じで同値を判定してくれるんだなって思ったらcase classと同じようにequalsを生成してくれていた。

$ cat test.scala
package Test

enum Color:
  case Red(coloerName: String)
  case Blue

case class ColorName(name: String)

javapで中身を覗くとこんなメソッドが生成されていた。

$ javap Test.Color\$Red
Compiled from "test.scala"
public final class Test.Color$Red extends Test.Color {
  public static Test.Color$Red apply(java.lang.String);
  public static Test.Color$Red fromProduct(scala.Product);
  public static Test.Color$Red unapply(Test.Color$Red);
  public Test.Color$Red(java.lang.String);
  public int hashCode();
  public boolean equals(java.lang.Object);
  public java.lang.String toString();
  public boolean canEqual(java.lang.Object);
  public int productArity();
  public java.lang.String productPrefix();
  public java.lang.Object productElement(int);
  public java.lang.String productElementName(int);
  public java.lang.String coloerName();
  public Test.Color$Red copy(java.lang.String);
  public java.lang.String copy$default$1();
  public int ordinal();
  public java.lang.String _1();
}
$ javap Test.ColorName
Compiled from "test.scala"
public class Test.ColorName implements scala.Product,java.io.Serializable {
  public static Test.ColorName apply(java.lang.String);
  public static Test.ColorName fromProduct(scala.Product);
  public static Test.ColorName unapply(Test.ColorName);
  public Test.ColorName(java.lang.String);
  public scala.collection.Iterator productIterator();
  public scala.collection.Iterator productElementNames();
  public int hashCode();
  public boolean equals(java.lang.Object);
  public java.lang.String toString();
  public boolean canEqual(java.lang.Object);
  public int productArity();
  public java.lang.String productPrefix();
  public java.lang.Object productElement(int);
  public java.lang.String productElementName(int);
  public java.lang.String name();
  public Test.ColorName copy(java.lang.String);
  public java.lang.String copy$default$1();
  public java.lang.String _1();
}

なるほどねー