Tag: 默认方法

如何从动态代理显式调用默认方法?

由于Java 8接口可以有默认方法。 我知道如何从实现方法中显式调用该方法,即(请参阅在Java中显式调用默认方法 ) 但是,如何在代理上使用reflection显式调用默认方法? 例: interface ExampleMixin { String getText(); default void printInfo(){ System.out.println(getText()); } } class Example { public static void main(String… args) throws Exception { Object target = new Object(); Map<String, BiFunction> behavior = new HashMap(); ExampleMixin dynamic = (ExampleMixin) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),new Class[]{ExampleMixin.class}, (Object proxy, Method method, Object[] arguments) -> { //custom mixin […]

inheritance,组合和默认方法

通常承认通过inheritance扩展接口的实现不是最佳实践,并且该组合(例如,从头开始再次实现接口)更加可维护。 这是有效的,因为接口契约强制用户实现所有所需的function。 但是在java 8中,默认方法提供了一些可以“手动”覆盖的默认行为。 请考虑以下示例:我想设计一个用户数据库,该数据库必须具有List的function。 出于效率目的,我选择通过ArrayList来支持它。 public class UserDatabase extends ArrayList{} 这通常不被认为是一种很好的做法,如果实际上希望列表具有完整的function并遵循通常的“合成而不是inheritance”的座右铭,那么人们更愿意: public class UserDatabase implements List{ //implementation here, using an ArrayList type field, or decorator pattern, etc. } 但是,如果不注意,则不需要覆盖某些方法,例如spliterator(),因为它们是List接口的默认方法。 问题是,List的spliterator()方法执行得比ArrayList的spliterator()方法差得多,后者已针对ArrayList的特定结构进行了优化。 这迫使开发人员 请注意,ArrayList有自己的,更有效的spliterator()实现,并手动覆盖他自己的List实现的spliterator()方法或者 使用默认方法会失去大量性能。 所以问题是:在这种情况下,人们应该更喜欢构成而不是inheritance吗?