gpt4 book ai didi

Scala:获取混合特征的类的名称

转载 作者:行者123 更新时间:2023-12-03 03:53:03 25 4
gpt4 key购买 nike

给定一个类的实例,我们显然可以返回它的名称:

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

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

但是这种方式使用反射,对于 AClass 的每个实例一次。是否可以为每个类(class)执行一次相同的操作?

我想到的一个解决方案是将其混合到伴生对象中,而不是类本身。

最佳答案

我想不出有什么方法可以在没有额外开销的情况下做到这一点。不过,您可以使用伴随对象以及一些额外的工作来完成此操作:

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 来装饰类,还需要实现伴随方法并为每个类编写伴随对象(顺便说一句,不需要具有相同的名称)。

关于Scala:获取混合特征的类的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2819063/

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