接口一直不斷在加強,可是整體來講,仍是隻放抽象的內容,不放實例化相關的內容。java
public interface Powerable { /** * 公有常量 */ String NAME = "me"; /** * 公有方法 */ void print(); /** * 靜態方法 * @param name */ static void cry(String name){ System.out.print(name+"is crying"); } /** * 默認方法 */ default void fly(){ System.out.print(Powerable.NAME+"can fly"); } }
注意事項工具
常常使用到的抽象邏輯封裝成默認方法,減小輔助類類。.net
@Test public void test_default(){ Map<String,String> map = new HashMap(); String defaultIntro = ""; //方案一,須要使用工具類 String utilsIntro = MapUtils.getorDefault(map, "intro", defaultIntro); System.out.println(utilsIntro); //方案二,無需使用工具類 System.out.print(map.getOrDefault("intro", defaultIntro)); }
細節封裝成默認方法,減小關注度和出錯率,提高服務的穩定和優雅性code
public void test_default_encapsulation() { Map<String, String> map = new HashMap<>(); //方案一:經過顯式的循環,感知的細節太多。須要顯示感知類型,還須要關注Entry對象以及getKey和getValue for (Map.Entry entry : map.entrySet()) { System.out.println(entry.getKey() + "," + entry.getValue()); } //方案二:經過顯式的循環,感知的細節太多。須要顯示感知類型,還須要key以及map獲取 for (String key : map.keySet()) { System.out.println(key + "," + map.get(key)); } //方案三:內置方法,不用考慮循環,不須要考取取值細節 map.forEach((key, value) -> { System.out.println(key + "," + value); }); }
好比把原來的工廠放到如今的接口默認方法裏。對象
default Powerable run(int type) { switch (type) { case 1: return new Person(); default: return null; } }
子類重寫父類的default方法blog