Использование большого количества миксинов с самостоятельным типом
Я хочу построить несколько классов scala для моделирования RDF. У меня есть классы и свойства. Свойства смешиваются с классами и могут использовать хеш-карту properties
из-за их собственного типа.
Поскольку классы получают больше свойств, мне приходится использовать много миксинов (50+), и я задаюсь вопросом, является ли это все еще хорошим решением с точки зрения производительности?
trait Property
trait Properties {
val properties =
new scala.collection.mutable.HashMap[String, Property]
}
abstract class AbstractClass extends Properties
trait Property1 {
this: AbstractClass =>
def getProperty1 = properties.get("property1")
}
trait Property100 {
this: AbstractClass =>
def getProperty100 = properties.get("property100")
}
class Class1 extends AbstractClass
with Property1 with Property100
1 ответ:
scala> trait PropertyN { self: Dynamic => | def props: Map[String, String] | def applyDynamic(meth: String)(args: Any*) = props get meth | } defined trait PropertyN
Тогда вы можете создать свой класс следующим образом:
scala> class MyClass(val props: Map[String, String]) extends PropertyN with Dynamic defined class MyClass
Ваш класс теперь имеет методы, которые вы хотите, чтобы он:
scala> new MyClass(Map("a" -> "Hello", "b" -> "World")) res0: MyClass = MyClass@367013 scala> res0.a dynatype: $line3.$read.$iw.$iw.res0.applyDynamic("a")() res1: Option[String] = Some(Hello)
Это, конечно, не очень безопасно для печати, но и ваше тоже. Честно говоря, я думаю, что вам лучше просто использовать вашу карту напрямую:
res0.properties get "a"
По крайней мере, вы не страдаете от какой-либо иллюзии безопасности