有时候您的回调接口有多个回调方法,每种方法都用于不同类型的事件。一个示例是org.xml.sax.ContentHandler
,其具有startElement()
,characters()
等。>
有时您希望拥有一组可重复使用的处理程序,并以任意顺序链接它们。在Java中,它由委托设计模式解决:您创建一个实现该接口的每个方法的抽象类,请参见:
javax.xml.stream.util.StreamReaderDelegate org.xml.sax.helpers.XMLFilterImpl com.common.util.xml.DelegatingContentHandler
然后扩展该抽象类,使其仅覆盖所需的方法,然后在运行时中创建处理程序链,将下一个委托传递给前一个委托的构造函数。
[我想知道AspectJ的declare parents
是否允许静态创建此类链。我不想手动为接口创建委托类,也不想在运行时创建链。
这是我到目前为止所做的:共有3个类:A,B,C,它们打印其名称,然后调用super
。我想为每个可能的配对创建类:AB,AC,BC,它们具有一对配对的功能。
我的程序的期望输出:
ASupport BSupport =============== BSupport CSupport =============== ASupport CSupport ===============
无法编译的程序:
package org.foo;
public class AnAspect {
public static void main(String[] args) {
new AB().handle(null);
new BC().handle(null);
new AC().handle(null);
}
}
aspect AnAspect1 {
declare parents : AB extends ASupport;
// can only insert a class into hierarchy, but org.foo.BSupport is not a subtype of org.foo.CSupport
declare parents : ASupport extends BSupport;
}
aspect AnAspect2 {
declare parents : BC extends BSupport;
declare parents : BSupport extends CSupport;
}
aspect AnAspect3 {
declare parents : AC extends ASupport;
declare parents : ASupport extends CSupport;
}
class BC extends MyCallback {
}
class AC extends MyCallback {
}
class AB extends MyCallback {
}
class ASupport extends MyCallback {
@Override
public void handle(Object o) {
System.out.println("ASupport");
super.handle(o);
}
}
class BSupport extends MyCallback {
@Override
public void handle(Object o) {
System.out.println("BSupport");
super.handle(o);
}
}
class CSupport extends MyCallback {
@Override
public void handle(Object o) {
System.out.println("CSupport");
super.handle(o);
}
}
abstract class MyCallback {
public void handle(Object o) {
System.out.println("===============");
}
}
有时候您的回调接口有多个回调方法,每种方法都用于不同类型的事件。一个示例是org.xml.sax.ContentHandler,它具有startElement(),characters()等。有时...
当然,您不能通过AspectJ克服JVM的限制,并使ASupport
扩展BSupport
和CSupport
。每个类都必须具有一个超类(或没有一个,在这种情况下,它隐式继承自Object
)。同样,变体declare parents : CSupport extends ASupport;
无效,因为它会导致圆形层次结构,这当然是禁止的,因为它没有逻辑意义。