1. 程式人生 > >介面宣告變數的一個實際例子

介面宣告變數的一個實際例子

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 void forward(Object... outs) throws UDFException { this.collector.collect(outs);
} collector是介面UDTFCollector宣告的變數, private UDTFCollector collector; UDTFCollector宣告如下的collect方法, public interface UDTFCollector extends DataCollector { void collect(Object[] var1); } 既然forward方法是使用者輸出資料的方法,那它究竟如何傳遞引數呢?這就是介面宣告一個變數的用處了。 介面通常被使用在Java程式語言,用來做回撥函式使用 。Java並不允許方法作為引數傳遞使用,因此,其中一個解決辦法則是可以定義一個介面,
把這個介面當成方法的引數,以此來使用該項物件的方法簽名。問題又來了,那什麼是方法簽名呢? 所謂方法簽名就由方法名+形參列表構成,也就是說,方法名和形引數據型別列表可以唯一的確定一個方法,與方法的返回值一點關係都沒有, 而這也是判斷過載重要依據。 於是歸納如下,forward方法使用UDFCollector宣告的collector裡面的collect方法,於是給forward傳參時就確定了一個對應的方法簽名從而在UDTF函式 解析出輸出引數。