接口声明变量的一个实际例子

来源:互联网 发布:cms监控软件安卓版 编辑:程序博客网 时间:2024/05/19 13:19
java自学者,如果错误,还请多多指教。实际工作中在重写UDTF子类的process方法的时候,遇到了一个forward方法,在研究源码的过程中对接口的概念更为清晰了。
UDTF接口说明如下:
Java UDTF需要继承com.aliyun.odps.udf.UDTF类。这个类需要实现4个接口。
接口定义
描述
public void setup(ExecutionContext ctx)
throws UDFException
初始化方法,在UDTF处理输入数据前,调用用户 自定义的初始化行为。在每个Worker内setup会 被先调用一次。
public void process(Object[] args)
throws UDFException
这个方法由框架调用,SQL中每一条记录都会对 应调用一次process,process的参数为SQL语句 中指定的UDTF输入参数。输入参数以Object[]的 形式传入,输出结果通过forward函数输出。用 户需要在process函数内自行调用forward,以决 定输出数据。
public void close() throws UDFException
UDTF的结束方法,此方法由框架调用,并且只会 被调用一次,即在处理完最后一条记录之后。
public void forward(Object ...o)
throws UDFException
用户调用forward方法输出数据,每次forward 代表输出一条记录。对应SQL语句UDTF的as子句 指定的列。
其中forward方法如下
protected voidforward(Object... outs)throwsUDFException {
this.collector.collect(outs);
}
collector是接口UDTFCollector声明的变量,
privateUDTFCollector collector;
UDTFCollector声明如下的collect方法,
public interfaceUDTFCollectorextendsDataCollector {
voidcollect(Object[] var1);
}
既然forward方法是用户输出数据的方法,那它究竟如何传递参数呢?这就是接口声明一个变量的用处了。
接口通常被使用在Java编程语言,用来做回调函数使用 。Java并不允许方法作为参数传递使用,因此,其中一个解决办法则是可以定义一个接口,
把这个接口当成方法的参数,以此来使用该项对象的方法签名。问题又来了,那什么是方法签名呢?
所谓方法签名就由方法名+形参列表构成,也就是说,方法名和形参数据类型列表可以唯一的确定一个方法,与方法的返回值一点关系都没有,
而这也是判断重载重要依据。
于是归纳如下,forward方法使用UDFCollector声明的collector里面的collect方法,于是给forward传参时就确定了一个对应的方法签名从而在UDTF函数
解析出输出参数。
原创粉丝点击