Class scala-创建对象而不使构造函数参数成为对象的成员

Class scala-创建对象而不使构造函数参数成为对象的成员,class,scala,object,Class,Scala,Object,我有 我不想让elem成为Address的一员,以便在内存中创建数百万个这样的对象时将内存占用降至最低。scala实现这一目标的方法是什么? 谢谢。你就是按照你所展示的方式实现的。只需确保您仅将elem作为类初始值设定项的一部分引用,而不是在其他方法中引用,在这些方法中,必须存储该元素才能调用它 以下是您编写的字节码(在编译类上使用javap-p ClassName): 您可以看到Elem已经存储,因此def可以在每次调用时使用它 如果要存储和访问元素,则必须声明类 public Address

我有

我不想让elem成为Address的一员,以便在内存中创建数百万个这样的对象时将内存占用降至最低。scala实现这一目标的方法是什么?
谢谢。

你就是按照你所展示的方式实现的。只需确保您仅将
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) { ... }