這可能表明我缺乏對Java的理解,但我想知道爲什麼在大多數MapReduce程序中mapper和reducer類被聲明爲靜態?爲什麼聲明Mapper和Reducer類是靜態的?
6
A
回答
14
將映射器和reducer類聲明爲另一個類的內部類時,必須將它們聲明爲靜態,以使它們不依賴於父類。
Hadoop使用反射爲每個映射或減少運行的任務創建類的實例。創建的新實例需要一個零參數構造函數(否則它將如何知道要傳遞什麼)。
通過聲明沒有static關鍵字的內部映射器或reduce類,java編譯實際上會創建一個構造函數,該構造函數需要在構造時傳入父類的實例。
您應該能夠通過對運行javap的命令來查看這個生成的類文件
而且,在父類中聲明使用時(這就是爲什麼你永遠看不到它在頂部的static關鍵字無效但只在子類中)
1
我能想到的原因有兩個:
- 當執行的map-reduce方法沒有狀態需要其在對象被保留。因此所有必要的信息都被傳遞給方法,不需要在對象中存儲額外的數據。如果該對象的生命時間不會超過一個方法調用,爲什麼你應該通過實例化來掙扎呢?
- 它有多個對象是沒有意義的,類似的原因,你會實現。
+0
這是不正確的 - 在map-reduce中,會創建Mapper類的幾個具體實例;他們確實可以保持狀態。我猜「靜態」的含義在Java中與例如C#。 – 2014-02-05 00:47:29
相關問題
- 1. 聲明類的靜態和非靜態
- 2. 聲明靜態變量時的輸出是什麼?爲什麼?
- 3. 爲什麼我們要在普通類中聲明靜態類?
- 4. 爲什麼不能將Java類聲明爲靜態?
- 5. Django - 爲什麼模型類中聲明的變量靜態
- 6. 在非靜態類中聲明一個靜態方法的意義是什麼?
- 7. 爲什麼不能在類中聲明const靜態字符串
- 8. 聲明非靜態類靜態
- 9. 靜態聲明和非靜態聲明之間的區別
- 10. 爲什麼要在C#中聲明靜態類爲密封和抽象?
- 11. 爲什麼回調函數在類中聲明時需要是靜態的
- 12. 聲明在靜態類
- 13. 爲什麼我的登錄方法聲明爲靜態?
- 14. 爲什麼jsp中的EL函數必須聲明爲靜態?
- 15. 函數內部聲明的靜態變量的值是什麼?
- 16. 爲什麼依賴屬性被聲明爲靜態只讀?
- 17. 聲明不能被標記爲「靜態」,爲什麼
- 18. 什麼是聲明靜態可變值的正確方法
- 19. 我的退貨聲明和靜態方法有什麼問題
- 20. 什麼時候應該在基類中聲明靜態方法?
- 21. 是聲明爲靜態的ViewState字典類型嗎?
- 22. 爲什麼不能在非靜態塊中聲明靜態最終變量?
- 23. createOperate方法不能被聲明爲靜態;靜態方法只能在靜態或頂級類型中聲明
- 24. 'DisplayMenu'的靜態聲明遵循非靜態聲明
- 25. 在Swift類或結構中聲明爲靜態的變量會發生什麼?
- 26. 爲什麼我不能轉發聲明靜態函數?
- 27. 爲什麼我們要聲明一個靜態方法
- 28. PHP - 爲什麼我無法聲明靜態常量變量?
- 29. 爲什麼靜態成員函數只能在類定義中聲明爲靜態而不是在其自己的定義中聲明?
- 30. 什麼是聲明
謝謝。其實你對反射的解釋解決了我的一些其他問題。 – kee 2012-07-20 04:56:51
@Chris White你真是太好了。 – 2016-11-16 09:26:13