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列表目前仅在一个实现中使用,但将来可以在其他实现中使用。它不是很具体,也可以由其他实现使用。
答案 0 :(得分:3)
这可能是默认方法的滥用。众所周知,当接口/合同随新方法一起发展时,默认方法有助于向后兼容,但是您遇到的问题是,并非所有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
合同的一部分时),您可以使用{{1} }避免强制更改和重新编译所有现有实现的方法。