有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java8接口问题

仍然不明白为什么Java允许在接口中使用默认实现,这违反了契约应该作为契约保留的设计原则吗?任何例子。解释一下


共 (3) 个答案

  1. # 1 楼答案

    在Java8之前,接口没有任何默认实现,因此如果任何类A实现了接口,它必须实现接口的所有方法。之后,如果需要更改应用程序设计,并在现有接口中添加更多方法,那么这将非常麻烦,因为所有子类都必须实现这些新方法。随着接口的老化,实现它的类的数量可能会增长到无法扩展接口的程度

    但是在Java8中,接口方法有默认实现。当一个类将实现一个接口时,并不强制为接口的默认方法提供一个实现。因此,现在很容易扩展接口的增长。我们只需给出默认实现,就可以在接口中添加更多方法。并非所有新添加的类都需要实现

    例如:

    public interface InteraceExample {
    
        default void log(String logMessage) {
            System.out.println("I1 logging::"+str);
        }
    }
    
  2. # 2 楼答案

    据我所知,添加此功能是为了使修改接口成为可能,而无需重新构建实现接口的所有其他类。我想这在用图书馆馆藏构建程序时尤其合适,因为所有这些都是独立维护的

    因此,我可以向接口添加一个新方法,只要它有一个默认值,实现该接口的类仍将像以前一样工作。如果使用默认实现,我将不得不修改并重新编译实现接口的每个类

    这个特性并不一定违反接口契约原则,因为实现接口的类仍然满足契约,只要它适用于它们实际实现的方法。您仍然可以阅读接口,并知道实现类必须满足哪些约束

    尽管如此,在我看来,这个特性的存在是出于实用的原因,而不是因为有一个合理的软件工程理由来推荐它。我怀疑带有默认值的接口和抽象类之间的差异相当微妙;我想知道在代码中选择前者而不是后者的原因是什么

  3. # 3 楼答案

    默认方法在接口更新过程中非常重要
    如果一个接口有一组方法,那么所有想要使用该接口的人都必须实现它们
    如果需要通过添加新方法扩展接口,则intarface的使用者也必须实现此新方法,并被迫更改其代码
    使用默认方法,接口管理员可以为方法定义默认实现;想要实现它的消费者可以自由覆盖它或使用已经提供的实现;同时,另一个不需要新方法的消费者可以直接忽略它