idea 自动生成方法注释_使用宏注释自动生成委托方法

idea 自动生成方法注释

宏注释是一种新型的宏,它是即将发布的Scala 2.11版本中包含的候选对象之一(另请参见下面的Eugene评论)。 但是,由于最近发布了Macro Paradise Scala 2.10编译器插件 ,并且在编译器/ SBT设置中具有附加选项,因此您可以立即使用它们,同时仍在运行时使用稳定的Scala版本。

手册中提到的宏注释用例之一是编译时AOP。 我决定尝试实现类似的方法,但是从一开始就简单一些:自动生成委托方法(装饰器模式/代理模式)。 实际上,几年前,使用编译器插件( autoproxy插件 )也做了类似的工作。 另一个动机是, Łukasz最近在我们的技术室中问Scala是否具有此确切功能–我应该说“尚未”,而不是说“否”。

POC的结果可在GitHub的scala-macro-aop存储库中找到: https//github.com/adamw/scala-macro-aop 。 如果您有SBT,则只需从SBT控制台调用run即可进行实施。

它是如何工作的? 假设我们有一个接口Foo其中包含三个方法(具有非常原始的名称: method1method2method3 ),每个方法都有一些参数。 我们有一个默认的实现:

trait Foo {
   def method1(param1: String): Int
   def method2(p1: Int, p2: Long): Float
   def method3(): String
}

class FooImpl extends Foo {
   def method1(param1: String) = param1.length
   def method2(p1: Int, p2: Long) = p1 + p2
   def method3() = "Hello World!"
}

现在,我们想为Foo实例创建一个包装器,它将所有方法调用委托给给定实例,除非该方法在包装器中定义。

传统的解决方案是手动为每种方法创建一个委托,例如:

class FooWrapper(wrapped: Foo) extends Foo {
   def method1(param1: String) = wrapped.method1(param1)
   def method2(p1: Int, p2: Long) = wrapped.method2(p1, p2)
   def method3() = wrapped.method3()
}

但这是很多工作。 使用@delegate宏,委托方法现在将在编译时自动生成! 也就是说,包装器现在变为:

class FooWrapper(@delegate wrapped: Foo) extends Foo {
   // method1, method2 and method3 are generated at compile time
   // and delegate to the annotated parameter
}

如果我们要实现一些方法怎么办? 该宏将仅生成丢失的宏:

class FooWrapper(@delegate wrapped: Foo) extends Foo {
   def method2(p1: Int, p2: Long) = p1 - p1
   // only method1 and method3 are generated
}

由于实现只是一个POC,因此仅在简单情况下(即具有单个参数列表,没有类型参数且方法未重载的方法)才能使用。 再加上宏的代码,例如,“尚未完善”。

如前所述,该代码位于GitHub: https//github.com/adamw/scala-macro-aop ,可通过Apache2许可获得。


翻译自: https://www.javacodegeeks.com/2013/09/automatic-generation-of-delegate-methods-with-macro-annotations.html

idea 自动生成方法注释

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值