当我使用COM时,其中一条规则是创建接口后,永远不会修改其签名。我不确定Java接口是否属实。我不认为更改任何方法的签名或删除方法是个好主意,但是添加新方法呢?
答案 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() {
}
}