gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:18:55 26 4
gpt4 key购买 nike

我有

class Address(elem: scala.xml.Elem){
val attr1 = (elem \ "attr1") text
...
}

我不希望 elem 成为 Address 的成员以将占用空间保持在最低限度,因为我在内存中创建了数百万个此类对象。实现这一目标的 Scala 方法是什么?
谢谢。

最佳答案

你按照你展示的方式实现它。只要确保您只引用 elem作为类初始值设定项的一部分,而不是在其他必须存储它以便可以调用的方法中。

这是您编写的字节码(在已编译的类上使用 javap -p ClassName):

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

注意只有一个 putfield , 即初始化 val attr1 的那个.如 elem保存在类中,它需要自己的 putfield .如果您更改 valdef ,你会得到:
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

在那里你可以看到 Elem已存储所以 def可以在每次调用时使用它。

如果您想要 Elem要存储和访问,您必须声明该类
class Address(val elem: scala.xml.Elem) { ... }

(注意 val )。

仅当您使用 case 类时,构造函数参数才会始终存储:case 类是为模式匹配而设计的,当然,如果您稍后要尝试匹配它,则需要存储该参数。

关于class - scala - 创建对象而不使构造函数参数成为对象的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3844816/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com