定義:
迪米特法則(Law of Demeter,LoD)也稱為最少知識原則(Least Knowledge Principle,LKP)。
一個對象應該對其他對象有最少的了解。通俗地講,一個類應該對自己需要耦合或調用的類知道得最少,你(被耦合或調用的類)的内部是如何複雜都和我沒關系,那是你的事情,我就知道你提供的public方法,我就調用這麼多,其他的一概不關心。
含義:
隻和朋友交流
朋友類的定義是這樣的:出現在成員變量、方法的輸入輸出參數中的類稱為成員朋友類,而出現在方法體内部的類不屬于朋友類。
下面的代碼在方法體内部依賴了其他類,這嚴重違反迪米特法則
public classTeacher {public voidcommond(GroupLeader groupLeader) {
List listGirls = new ArrayList();for (int i = 0; i < 20; i++) {
listGirls.add(newGirl());
}
groupLeader.countGirls(listGirls);
}
}
方法是類的一個行為,類竟然不知道自己的行為與其他類産生了依賴關系,這是不允許的。
正确的做法是:
public classTeacher {public voidcommond(GroupLeader groupLeader) {
groupLeader.countGirls();
}
}
public classGroupLeader {private ListlistGirls;public GroupLeader(List_listGirls) {this.listGirls =_listGirls;
}public voidcountGirls() {
System.out.println("女生數量是:" +listGirls.size());
}
}
注意:一個類隻和朋友交流,不與陌生類交流,不要出現getA().getB().getC().getD()這種情況(在一種極端情況下允許出現這種通路,即每一個點号後面的傳回類型都相同),類與類之間的關系是建立在類間的,而不是方法間,是以一個方法盡量不引入一個類中不存在的對象,當然,JDK API提供的類除外。
朋友間也是有距離的
一個類公開的public屬性或方法越多,修改時涉及的面也就越大,變更引起的風險擴散也就越大。是以,為了保持朋友類間的距離,在設計時需要反複衡量:是否還可以再減少public方法和屬性,是否可以修改為private、package-private(包類型,在類、方法、變量前不加通路權限,則預設為包類型)、protected等通路權限,是否可以加上final關鍵字等。
注意:迪米特法則要求類“羞澀”一點,盡量不要對外公布太多的public方法和非靜态的public變量,盡量内斂,多使用private、package-private、protected等通路權限。
是自己的就是自己的
如果一個方法放在本類中,既不增加類間關系,也對本類不産生負面影響,就放置在本類中。
謹慎使用Serializable
最後,迪米特法則的核心觀念就是類間解耦,弱耦合,隻有弱耦合了以後,類的複用率才可以提高。