发布后可以修改Java接口吗?

时间:2016-01-06 07:27:54

标签: java interface

当我使用COM时,其中一条规则是创建接口后,永远不会修改其签名。我不确定Java接口是否属实。我不认为更改任何方法的签名或删除方法是个好主意,但是添加新方法呢?

4 个答案:

答案 0 :(得分:2)

在Java 7及更低版本中,向接口添加新方法将要求实现它的每个类也实现它。

在Java 8及更高版本中,如果添加default方法,要求您这样做。

需要注意的主要是界面基本上是一个API。如果您向API添加一个新方法,并且有一些具体实现声称要遵守API,那么应该是新方法具体实现的情况。

添加新方法时也会暂停一次;如果你这样做,你必须确保通过所有其他实现者来加入它是值得的。

答案 1 :(得分:2)

向已经由各种库实现的接口添加新方法将遇到一个问题:在旧实现上调用new方法的任何人都将获得异常。请注意,加载类将正常工作,调用旧方法也可以正常工作。

当然,如果开始实现接口的新版本,实现接口的类也将不再编译:他们将被迫实现其他方法。

但这并不意味着这是一个好主意。如果可以,应该避免。从Java 8开始,接口中的默认方法可以帮助为新方法提供默认实现(如果可能)。这允许旧实现保持与新接口兼容。

以上所有内容都是在编写由外部项目实现和使用的API的上下文中编写的,不受您控制或不与新界面同时发布。如果接口仅在您自己的项目中使用,并且其所有实现都在您的控制之下,那么修改接口及其实现根本不是问题。

答案 2 :(得分:1)

如您所料,在发布后修改接口[用于第三方实现]是一种冒险的做法 - 如果更改接口,您将打破所有当前存在的实现,或者至少强制执行实现者相应地修改它们的实现。

添加方法也存在问题 - 因为您将添加实现没有的方法,您仍然会破坏这些实现,因为现在它们将不再实现所述接口。

Java 8以default methods的形式为此提供了部分解决方案,允许您向接口添加具有默认实现的新方法。这样,不实现新方法的实现将继承默认实现而不是破坏编译。例如,考虑这个旧界面:

public interface Person {
    String getFirstName();
    String getLastName();
}

在Java 8之前,添加新的getFullName()方法只会破坏旧的实现。但是,在Java 8中,您现在可以提供默认实现:

public interface Person {
    String getFirstName();
    String getLastName();

    // New method added in version 2:
    default String getFullName() {
        return getFirstName() + " " + getLastName();
    }
}

答案 3 :(得分:0)

如果您希望在界面中添加新方法而不是更改界面的好主意,因为可能有许多类需要添加该方法,但

界面可以扩展另一个界面,在新界面中,您可以添加新方法

检查此代码:

interface oldInterface{
  public void oldInterfaceMethod();
}

interface newInterface extends oldInterface{
  public void newInterfaceMethod();
}


class OldInterfaceImplementor implements oldInterface {

  @Override
  public void oldInterfaceMethod() {
  }
}

class NewInterfaceImplementor implements newInterface{

  @Override
  public void oldInterfaceMethod() {
  }

  @Override
  public void newInterfaceMethod() {
  }

}