java - 接口中的默认方法 - Java
问题描述
import java.util.List;
public interface IEntityParam {
public void validateParam(Object object);
public default void validateParam(Object object,List<String> Str){
validateParam(object);
}
}
假设IEntityParam
是由许多类扩展的非常旧的接口,我需要其中的新方法。我在另一个参数中添加了一个新方法。但是我的默认实现没有在其默认方法中使用新参数 List 。从技术上讲,没有问题。但它是否正确使用默认方法?或者我应该将这个新方法保留在特定的类中,因为我在默认实现中没有使用第二个参数。
注意:此处提供的 String 列表目前仅用于一种实现,但将来可用于其他实现。它不是很具体,也可以被其他实现使用。
解决方案
这可能是对默认方法的滥用。当接口/合同随着新方法发展时,默认方法可以促进向后兼容性,但在您的情况下,问题是并非所有IEntityParam
实现都关心“合同”的新版本。默认方法在概念上是接口契约的一部分。
解决您当前需求的正常方法是扩展接口:
public interface IEntityParam {
public void validateParam(Object object);
}
public interface IEntityParamExtended extends IEntityParam {
public default void validateParam(Object object,List<String> Str);
}
这样,需要第二种方法的类将实现IEntityParamExtended
并提供两种方法的实现;而所有其他实现IEntityParam
不受影响。
将来,当IEntityParamExtended
需要提升时IEntityParam
(即,当新方法构成IEntityParam
合同的一部分时),您可以使用default
方法来避免强制更改和重新编译所有现有实现。
推荐阅读
- c# - discord.net.commands.dll 未找到或缺少程序集文件
- visual-studio-code - 我想在终端中运行 yzane.markdown-pdf 的“extension.markdown-pdf.pdf”,而不是通过命令面板
- python - Python end = "\r" 在 Python 中不起作用
- eclipse - 如何将 m2eclipse 安装到 Talend Studio 以获取大数据
- sql - Django:如果数据库中的一个对象被删除,其余对象是否保持相同的 ID/顺序?
- javascript - OBS启动时自动启动电子应用程序
- reactjs - 通过 id 从数据库获取特定数据时出错
- pine-script - 如何不将一系列蜡烛显示为大于某个数字?
- spring-boot - 突出显示 log4j2.properties 中的日志记录级别
- python - 对函数中的 if 检查进行矢量化