Scala中能否基于JVM参数条件重写所实现trait的方法?
实现方案
这个需求在Scala中完全可以实现,核心逻辑是在重写的方法中读取JVM系统属性做分支判断即可,以下是修正后的可运行实现:
// 先定义示例依赖的MyBuilder类型 class MyBuilder[Record] trait MyTrait[Record]{ def myBuilder: MyBuilder[Record] } // 注意:第一个继承的特质需要用extends关键字,with用于后续多特质混入 trait MySecondTrait[Record] extends MyTrait[Record] { // 读取JVM命令行传入的系统属性,启动时通过-Dmyflagkey=xxx传入 protected val myFlag: String = Option(System.getProperty("myflagkey")).getOrElse("default") override def myBuilder: MyBuilder[Record] = myFlag match { case "method1" => MySecondTrait.myMethod() case "method2" => MySecondTrait.myMethod2() case _ => MySecondTrait.myMethod() // 缺省走默认逻辑 } } object MySecondTrait { // 注意方法返回值要和myBuilder的定义匹配,原示例的Unit需要调整为返回MyBuilder def myMethod[Record](): MyBuilder[Record] = { // 你的逻辑1实现 new MyBuilder[Record]() } def myMethod2[Record](): MyBuilder[Record] = { // 你的逻辑2实现 new MyBuilder[Record]() } }
注意事项
- 如果你需要标志位仅在启动时读取一次,用
val定义myFlag即可,初始化后值不会变更,性能更好 - 如果你需要运行时动态读取修改后的系统属性,可以把
myFlag改成def,每次调用myBuilder都会重新读取参数 - JVM命令行传入参数的格式为
-D<参数名>=<参数值>,需要放在主类/ Jar包名称之前,示例启动命令:java -Dmyflagkey=method2 -jar your-app.jar
内容的提问来源于stack exchange,提问作者user16367669
相关产品推荐
相关产品推荐

