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装饰类,还需要实现伴随方法并为每个类编写伴随对象(不一定要有相同的名称). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |