Class scala-创建对象而不使构造函数参数成为对象的成员
我有 我不想让elem成为Address的一员,以便在内存中创建数百万个这样的对象时将内存占用降至最低。scala实现这一目标的方法是什么?Class scala-创建对象而不使构造函数参数成为对象的成员,class,scala,object,Class,Scala,Object,我有 我不想让elem成为Address的一员,以便在内存中创建数百万个这样的对象时将内存占用降至最低。scala实现这一目标的方法是什么? 谢谢。你就是按照你所展示的方式实现的。只需确保您仅将elem作为类初始值设定项的一部分引用,而不是在其他方法中引用,在这些方法中,必须存储该元素才能调用它 以下是您编写的字节码(在编译类上使用javap-p ClassName): 您可以看到Elem已经存储,因此def可以在每次调用时使用它 如果要存储和访问元素,则必须声明类 public Address
谢谢。你就是按照你所展示的方式实现的。只需确保您仅将
elem
作为类初始值设定项的一部分引用,而不是在其他方法中引用,在这些方法中,必须存储该元素才能调用它
以下是您编写的字节码(在编译类上使用javap-p ClassName
):
您可以看到Elem
已经存储,因此def
可以在每次调用时使用它
如果要存储和访问元素
,则必须声明类
public Address(scala.xml.Elem);
Code:
0: aload_0
1: aload_1
2: putfield #12; //Field elem:Lscala/xml/Elem;
5: aload_0
6: invokespecial #31; //Method java/lang/Object."<init>":()V
9: return
(注意val
)
只有在使用case类的情况下,构造函数参数才会始终被存储:case类是为模式匹配而设计的,当然,如果以后要尝试匹配它,则需要存储参数
public Address(scala.xml.Elem);
Code:
0: aload_0
1: invokespecial #18; //Method java/lang/Object."<init>":()V
4: aload_0
5: aload_1
6: ldc #19; //String attr1
8: invokevirtual #25; //Method scala/xml/Elem.$bslash:(Ljava/lang/String;)Lscala/xml/NodeSeq;
11: invokevirtual #30; //Method scala/xml/NodeSeq.text:()Ljava/lang/String;
14: putfield #11; //Field attr1:Ljava/lang/String;
17: return
public Address(scala.xml.Elem);
Code:
0: aload_0
1: aload_1
2: putfield #12; //Field elem:Lscala/xml/Elem;
5: aload_0
6: invokespecial #31; //Method java/lang/Object."<init>":()V
9: return
class Address(val elem: scala.xml.Elem) { ... }