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

Scala:得到特质混合的类的名称

发布时间:2020-12-16 18:47:56 所属栏目:安全 来源:网络整理
导读:给定一个类的实例,我们显然可以返回它的名字: trait MixedInClassDiscovery { val className = this.getClass.getName}class AClass extends MixedInClassDiscovery { ... this.className // returns "AClass" ...} 但这种方式使用反射,一次为每个AClass实
给定一个类的实例,我们显然可以返回它的名字:

trait MixedInClassDiscovery {
  val className = this.getClass.getName
}

class AClass extends MixedInClassDiscovery {
  ...
  this.className // returns "AClass"
  ...
}

但这种方式使用反射,一次为每个AClass实例.相反,每个班级都可以做一次吗?

我想到的一个解决方案是将它混合到伴随对象而不是类本身.

解决方法

我无法想到任何方法,没有额外的开销.但是,您可以使用伴侣对象以及一些额外的工作:

object Example {
  trait Discovery {
    def companion: Discovered
    def className: String = companion.className
  }
  trait Discovered extends Discovery {
    override lazy val className = {
      println("Getting class name!")  // To see how many times we're called
      this.getClass.getSuperclass.getName
    }
  }
  class Test extends Discovery {
    def companion = Test
  }
  object Test extends Test with Discovered {}
}

在这里,我们看到这有效:

scala> val a = new Example.Test
a: Example.Test = Example$Test@17e4c97

scala> val b = a.className
Getting class name!
b: String = Example$Test

scala> val c = a.className
c: String = Example$Test

但它需要付出相当代价:你不仅需要使用Discovery装饰类,还需要实现伴随方法并为每个类编写伴随对象(不一定要有相同的名称).

(编辑:李大同)

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

    推荐文章
      热点阅读