Scala 2.10引入了value classes。它们对于编写类型安全代码非常有用。此外,还有一些限制,其中一些将被编译器检测到,而某些则需要在运行时分配。
我想使用case class
语法创建值类,以允许创建-没有新语法和对人类友好的toString
。没有模式匹配,因为它需要分配。
所以问题是:使用case class
语法是否需要分配值类?
最佳答案
您可以具有作为值类的案例类。从下面的示例中可以看到,没有对象创建。当然,除了不可避免的拳击比赛之外,如果您会选择“任意”。
这是一小段scala代码
class ValueClass(val value:Int) extends AnyVal
case class ValueCaseClass(value:Int) extends AnyVal
class ValueClassTest {
var x: ValueClass = new ValueClass(1)
var y: ValueCaseClass = ValueCaseClass(2)
def m1(x:ValueClass) = x.value
def m2(x:ValueCaseClass) = x.value
}
还有字节码,它不包含两个值类的丝毫痕迹。
Compiled from "ValueClassTest.scala"
public class ValueClassTest {
public int x();
Code:
0: aload_0
1: getfield #14 // Field x:I
4: ireturn
public void x_$eq(int);
Code:
0: aload_0
1: iload_1
2: putfield #14 // Field x:I
5: return
public int y();
Code:
0: aload_0
1: getfield #21 // Field y:I
4: ireturn
public void y_$eq(int);
Code:
0: aload_0
1: iload_1
2: putfield #21 // Field y:I
5: return
public int m1(int);
Code:
0: iload_1
1: ireturn
public int m2(int);
Code:
0: iload_1
1: ireturn
public rklaehn.ValueClassTest();
Code:
0: aload_0
1: invokespecial #29 // Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_1
6: putfield #14 // Field x:I
9: aload_0
10: iconst_2
11: putfield #21 // Field y:I
14: return
}
关于scala - 斯卡拉(Scala)。具有一个字段的案例类可以是值类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17658301/