Java闭包概念
閉包又稱詞法閉包
閉包最早定義為一種包含<環境成分>和<控制成分>的實體.
解釋一:閉包是引用了自由變量的函數,這個被引用的變量將和這個函數一同存在。
解釋二:閉包是函數和相關引用環境組成的實體。
注:<自由變量>:除了局部變量的其他變量
簡單理解:閉包能夠將一個方法作為一個變量去存儲,這個方法有能力去訪問所在類的自由變量。
Java中閉包實現
關鍵點:
如何用變量去存儲方法?
java中能夠保存方法的變量指的就是普通的對象
如何讓這個普通對象能夠訪問所在類的自由變量?
純天然的解決辦法是:內部類。內部類能夠訪問外部類的所有屬性及方法。
隱藏具體實現是內部類的作用之一,如何保證隱藏具體實現的同時還能將閉包傳遞到外部使用?
讓內部類實現通用接口,然后將內部類對象向上轉型為接口類型。
上述解決辦法就是Java最常用的閉包實現辦法(內部類+接口)
下面提供一個簡單的實現
1 public class Milk {
2
3 public final static String name = "純牛奶";//名稱
4
5 private static int num = 16;//數量
6
7 public Milk()
8 {
9 System.out.println(name+":16/每箱");
10 }
11
12 /**
13 * 閉包
14 * @return 返回一個喝牛奶的動作
15 */
16 public Active HaveMeals()
17 {
18 return new Active()
19 {
20 public void drink()
21 {
22 if(num == 0)
23 {
24 System.out.println("木有了,都被你丫喝完了.");
25 return;
26 }
27 num--;
28 System.out.println("喝掉一瓶牛奶");
29 }
30 };
31 }
32
33 /**
34 * 獲取剩余數量
35 */
36 public void currentNum()
37 {
38 System.out.println(name+"剩余:"+num);
39 }
40 }
41
42 /**
43 * 通用接口
44 */
45 interface Active
46 {
47 void drink();
48 }
使用上述實現
1 public class Person {
2
3 public static void main(String[] args) {
4 //買一箱牛奶
5 Milk m = new Milk();
6
7 Active haveMeals = m.HaveMeals();
8
9 //沒事喝一瓶
10 haveMeals.drink();
11 //有事喝一瓶
12 haveMeals.drink();
13
14 //看看還剩多少?
15 m.currentNum();
16 }
17
18 }
19
運行結果
純牛奶:16/每箱 喝掉一瓶牛奶 喝掉一瓶牛奶 純牛奶剩余:14
上述例子中,通過調用Active的方法實現對Milk私有變量num進行修改。
總結
1.實際項目中沒怎么用過閉包,因此不能對他的好壞進行評論。
2.建議合理的使用閉包,不完全不使用,也不能濫用。
3.特別注意:閉包會導致資源不被回收,如上例,在main方法中將m設為null,使用haveMeals繼續調用drink方法仍然會喝掉一瓶牛奶,說明Milk對象并沒有被釋放掉。
總結
- 上一篇: Spark的三种伪分布式方式
- 下一篇: 怎么创建具有真实纹理的CG场景岩石?