我有一些使用名为.clean的函数创建的对象:
HiveCleanerTbl
HiveCleanerDb
这些对象需要根据基于正在进行的API调用的记录动态调用,这将使我的Job知道要调用的对象,例如我现在已对其进行了硬编码:
def matchSchema(schema:Int): Any = schema match {
case 1 => HiveCleanerTbl.clean(rawRecord)
case 32 => HiveCleanerDb.clean(rawRecord)
...
在代码的早期代替硬编码可能的对象有一种方法可以动态地填充对象,如:
val systems = List[(String, String, Int)] = List((hiveTbl,HiveTblCleaner,6), (hiveDb,HiveDbCleaner,7))
我的代码看起来像这样:
systems.foreach(x => if(x._1 == systemName) {
cleanObject = x._2
})
如何将cleanObject定义为我想要使用的可以调用其.clean函数的对象?
答案 0 :(得分:1)
是的,你可以这样做。
X
假设您的val systems = List[(Cleanable, String, Int)] = List((hiveTbl,HiveTblCleaner,6), (hiveDb,HiveDbCleaner,7))
和hiveTbl
是可清除的,并且可以说hiveDb
方法可供他们调用。
clean
如果systems.foreach {
case (db: Cleanable, "cleanSchemeName", _) =>
db.clean
case _ => () //ignore
}
没有db
方法,请检查数据库的类型并尝试模式匹配以解析clean
对象的实际类型。
以下是如何实现这一目标的一般示例。
db
为Cleanable
和clean
提供A
方法。 List包含所有可清除的内容,因此我可以继续在每个对象上调用clean,而无需使用类型转换对象。
根据某些条件,您可以忽略清理某些对象。
B
答案 1 :(得分:1)
所有物品似乎都是"清洁工" - 创建一个名为CanClean
的特征,用于定义方法clean(rawRecord: SomeType)
和属性val schema: Int
。将使用适当的值在每个对象中填充schema
。然后将所有这些清理工具放在Map[Int, CanClean]
中,密钥为:schema
,值为:object:CanClean。然后你可以做cleanerMap(schema).clean(rawRecord)
。如果您不想手动填充cleanerMap
,则可以使用反射来列出实现CanClean
"的所有对象。