scala – 构造函数参数是否得到GC?
发布时间:2020-12-16 18:42:27 所属栏目:安全 来源:网络整理
导读:我正在使用一个需要使用事务初始化许多对象的系统,并且出于超出此问题范围的原因,这些事务必须传递给构造函数.像这样: trait Mutableclass Txn(i: Int) { def newID(implicit m: Mutable): Int = i override def finalize(): Unit = println("Finalised " +
我正在使用一个需要使用事务初始化许多对象的系统,并且出于超出此问题范围的原因,这些事务必须传递给构造函数.像这样:
trait Mutable class Txn(i: Int) { def newID(implicit m: Mutable): Int = i override def finalize(): Unit = println("Finalised " + i) } class User(t0: Txn) extends Mutable { val id = t0.newID(this) } 现在我担心垃圾收集交易存在问题: val u = new User(new Txn(1234)) System.gc() // hmmm,nothing seems to happen? 所以我的问题是:t0构造函数参数是否会被垃圾收集,或者我在这里创建内存泄漏?在等效的Java代码中,我想我会有这样的事情: public class User implements Mutable { final int id; public User(Txn t0) { id = t0.newID(this); } } 我确信收集了.但在Scala案件中这是真的吗? 如果没有,我怎样才能确保t0被垃圾收集?请记住,我必须将事务作为构造函数参数传递,因为User类实现了一些必须传递给Txn方法的特性,因此在构造User之前无法调用这些方法(如newID). 我曾经尝试构建在用户对象之外使用事务的所有东西,有大量懒惰的相互依赖的val,但这真的很混乱.例如,这已经半途无法读取,会产生堆栈溢出: trait User extends Mutable { def id: Int } def newUser(implicit tx: Txn): User = { lazy val _id: Int = tx.newID(u) lazy val u = new User { val id: Int = _id } // oops,should be lazy val id! u } val u = newUser(new Txn(1234)) 你可以想象,编译器在这里找不到丢失的延迟val的问题真的很糟糕,所以我肯定更喜欢构造函数arg变种. 解决方法
如果绝对必要,我建议你使用javap来查看类编译成的内容.避免获取构造函数参数的一些规则变为类参数:
>不要在def或lazy val上使用它.>不要在进行模式匹配的赋值中使用它(如val(a,b)= f(x)).>当然,不要将其声明为val或var. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |