加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读