Java 在已经';100';什么课程?

Java 在已经';100';什么课程?,java,java-8,Java,Java 8,假设我有一个接口 public interface Animal{ public void operationWalk(); } 这个动物接口是由许多类实现的,现在我如何在这个接口中添加方法,这样它就不会破坏实现它的类的功能。您可以在Java 8中使用默认方法 由于您有一个-tag,因此您可以访问接口方法的关键字,这是自Java8以来新增的 因此,您可以将其修改为以下内容: public interface Animal{ public void operationWalk();

假设我有一个接口

public interface Animal{
  public void operationWalk();
}

这个动物接口是由许多类实现的,现在我如何在这个接口中添加方法,这样它就不会破坏实现它的类的功能。

您可以在Java 8中使用默认方法

由于您有一个-tag,因此您可以访问
接口
方法的关键字,这是自Java8以来新增的

因此,您可以将其修改为以下内容:

public interface Animal{
  public void operationWalk();

  default void doSomething(){
    // Your code here
  }
}
可以将此
默认方法添加到接口中,而无需将实现添加到使用此接口的子类中

请注意,如果选择,子类中的
default
方法仍然可以被覆盖。如果您永远不想覆盖此方法,则可以在界面中使用
static
方法


如果您使用的是Java 8之前的版本,恐怕您只有以下选项:

1)如果在实现此接口的100多个类中的每个类中都需要此新方法,则必须将此新方法添加到接口中,并在每个类中实现此新方法。
2)如果您只需要在100多个类中的少数几个类中使用此新方法,您可以创建一个新接口,并仅在这些类中实现此新接口,包括方法的实现。
3)如果您需要一个对每个子类都相同的标准方法,如您的问题所示,您可以创建一个
抽象类
,通过实现新方法来实现Animal-
接口
,然后更改100多个类中的每一个以扩展该
抽象类。您仍然需要修改这些类中的每一个,但是您确实在Java7中为您的新方法提供了一个默认实现。请注意,所有类只能扩展一个
抽象
类,因此,如果实现
动物
-接口的任何类已经是其他类的扩展,则此选项是不可能的


尽管我个人会检查您是否可以改为更新到Java 8(或更高版本),因为它有
接口的
默认
关键字,这是本例中最佳解决方案所需的。由于Java 11已经发布,因此更新到新的Java版本也不是一个坏主意。

只需在其他人已经提到的内容上添加一些选项:

如果所有的类都需要实际实现新方法,那么除了实现它们之外就没有别的了。实际上,您不必一次实现所有这些功能,这取决于所有功能的重要性,但您可能最终必须实现这些功能

如果不是所有类都需要实现新方法,那么第二种可能性——我更喜欢这种方法——是使用第二个接口来扩展“主”接口。这样,只有需要它的类的子集才能实现它。不过,这对工厂级之类的课程来说可能不太方便

第三种可能性是让某些类具有“空”实现:

public void operationWalk() {
}
好的一面是,至少这只是复制粘贴,所以不会花那么长时间

第四种可能性(我真的,真的不喜欢这样)是让你的方法在操作根本不适用的情况下抛出异常

public void operationWalk() {
   // Throw some exception indicating that this operation doesn't apply here
}

这当然违反了法律。在我看来,这也常常表明对象层次结构有缺陷。我建议不要这样做,除非你必须这样做,因为如果你不小心的话,以后可能会导致严重的维护问题,但这至少是一种可能性。

取决于你需要它做什么。你可以添加一个
default
方法。如果我的程序在低于8的版本上运行,该怎么办?@AjayChauhan在低于Java 8的版本下你不能这样做。您需要创建一个新的接口。@AjayChauhan
default
static
接口中的方法是自Java 8以来的新方法。如果您使用的是Java 8之前的版本,恐怕您必须将这些方法实现到100多个类中的每一个。如果我们已经在使用Java 8,还可以选择使用静态方法。@MuratKaragöz将其编辑为答案,包括接口中
default
static
方法之间的差异链接。