3,下面了解一下java中的默认和静态方法。
学习语言最有效的方法之一就是学习优秀的代码实例,下面的就是优秀实例的其中之一:
1 public interface DefaulableFactory { 2 // Interfaces now allow static methods 3 static Defaulable create( Supplier< Defaulable > supplier ) { 4 return supplier.get(); 5 } 6 7 private interface Defaulable { 8 // Interfaces now allow default methods, the implementer may or 9 // may not implement (override) them. 10 default String notRequired() { 11 return "Default implementation"; 12 } 13 } 14 15 private static class DefaultableImpl implements Defaulable { 16 } 17 18 private static class OverridableImpl implements Defaulable { 19 @Override 20 public String notRequired() { 21 return "Overridden implementation"; 22 } 23 } 24 25 public static void main( String[] args ) { 26 Defaulable defaulable = DefaulableFactory.create( DefaultableImpl::new ); 27 System.out.println( defaulable.notRequired() ); 28 29 defaulable = DefaulableFactory.create( OverridableImpl::new ); 30 System.out.println( defaulable.notRequired() ); 31 } 32 33 } |
默认方法在函数定义的返回类型前面添加关键字default,同时添加了实现了功能的函数体。接口中的default方法使得实现了该接口的类可以不必实现该方法,当然也可以对其进行重写。
添加了默认方法的接口具有了java 5中抽象类所能够提供的功能,使得所有使用抽象类的地方都可以用拥有了default方法的接口取代,因此,不免让人遐想:抽象类在此之后还有存在的意义吗?!
同时,也要注意一下静态方法的参数及其使用。尤其是Supplier<Defaultable> supplier和DefaultableImp::new,这两种表达方式对java开发人员而言,还是挺新颖的。
4,可重复注解。
在java 8以前,相同类型的注解只能声明一次,例如在java开发的过程中,对某个方法重写,只能声明一次@override;在android构台过程中,对某个方法声明目标api,只有声明一次@targetapi。但是在java 8中,相同类型的注解却可以声明多次,示例代码如下:
1 public class RepeatingAnnotations { 2 @Target( ElementType.TYPE ) 3 @Retention( RetentionPolicy.RUNTIME ) 4 public @interface Filters { 5 Filter[] value(); 6 } 7 8 @Target( ElementType.TYPE ) 9 @Retention( RetentionPolicy.RUNTIME ) 10 @Repeatable( Filters.class ) 11 public @interface Filter { 12 String value(); 13 }; 14 15 @Filter( "filter1" ) 16 @Filter( "filter2" ) 17 public interface Filterable { 18 } 19 20 public static void main(String[] args) { 21 for( Filter filter: Filterable.class.getAnnotationsByType( Filter.class ) ) { 22 System.out.println( filter.value() ); 23 } 24 } 25 } |
在main方法中,Fileterable接口通过反射机制来获取自身定义的注解,然后打印出来。