パラメータを取る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(); }
なるほどねー