我用一些抽象程序(返回Unit的方法)创建了一个特征。然后我创建了一个子特征,它为了方便开发而放入虚拟实现{}。但是我想在虚拟特征上添加编译器警告:“使用虚拟特征可能无法实现所有功能。在生产中使用基本特征。”
我查看了Scala注释和Java注释,但我找不到合适的注释或方法。我可以使用一个已弃用的注释,但这是相当不优雅的:
@deprecated("GraphicMethodsDummy contains procedure stubs. Inherit from GraphicMethods for production", "")
继承弃用似乎没有多大优势,因为生成编译器消息的方法似乎是私有的,无法覆盖。
答案 0 :(得分:1)
class Dummy
object creator {
def apply(): Dummy = macro creatorImpl
def creatorImpl(c: Context)(): c.Expr[Dummy] = {
import c.universe._
c.warning(c.enclosingPosition,
"""Using the dummy trait all functionality may not be implemented.
Use the base trait in production.""")
reify(new Dummy)
}
}
请注意,在各种API(例如Guava)中常用的另一种较少涉及的方法是只为您的类添加自定义注释(例如@NotSafeForProd
)。但是,这当然不会生成编译器警告。
答案 1 :(得分:1)
如果定期弃用不够好,那么滚动你自己的方法:
package scala {
class noProd extends deprecatedInheritance("Provide an impl for production", since="forever")
}
package dummyonly {
trait Abs { def f(i: Int): String }
@noProd
class Dummy extends Abs {
def f(i: Int) = i.toString
}
}
在单独的编译单元中:
//dummyonly2.scala:3: warning: inheritance from class Dummy in package dummyonly is deprecated: Provide an impl for production
package dummyonly {
class Mine extends Dummy
}
编辑:
特权注释对scala
是私有的,但它非常有用,将它隐藏在蒲式耳下是犯罪行为。
我真的不知道,但代码评论上写着:
// for now, this needs to be generalized to communicate other modifier deltas
或者,用短语来表达WTF?我知道什么是“修饰语”,但是“修饰语delta”超出了我的意思。但是,该评论表明,当注释找出如何使其以可维护的方式工作时,注释可能会看到更广泛的访问。
我认为应该使用分号而不是逗号,即“for now; ...”,但Scala程序员编程是为了避免使用分号,即使在语法正确的情况下也能避免使用分号。