接口一直不断在加强,可是整体来讲,仍是只放抽象的内容,不放实例化相关的内容。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