接口中的默认方法 - Java
Default Method in Interface - 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
是由许多 classes 扩展的非常旧的接口,我需要其中的新方法。我添加了一个带有另一个参数的新方法。
但是我的默认实现不在其默认方法中使用新参数列表。从技术上讲,没有问题。但它是否正确使用默认方法?或者我应该将这个新方法保留为特定 class 因为我在默认实现中没有使用第二个参数。
注意:此处提供的字符串列表目前仅用于一种实现,但将来可用于其他实现。它不是很具体,也可以被其他实现使用。
这可能是对默认方法的误用。当 interfaces/contracts 随着新方法的发展时,默认方法可以促进向后兼容性,但您的问题是并非所有 IEntityParam
实现都关心 "contract" 的新版本。默认方法在概念上是接口契约的一部分。
解决您当前需求的正常方法是扩展接口:
public interface IEntityParam {
public void validateParam(Object object);
}
public interface IEntityParamExtended extends IEntityParam {
public default void validateParam(Object object,List<String> Str);
}
这样,需要第二种方法的 class 将实现 IEntityParamExtended
并为这两种方法提供实现;而 IEntityParam
的所有其他实现不受影响。
将来,当 IEntityParamExtended
需要提升到 IEntityParam
时(即,当新方法构成 IEntityParam
契约的一部分时),您可以使用 default
方法以避免强制更改和重新编译所有现有实现。
import java.util.List;
public interface IEntityParam {
public void validateParam(Object object);
public default void validateParam(Object object,List<String> Str){
validateParam(object);
}
}
假设 IEntityParam
是由许多 classes 扩展的非常旧的接口,我需要其中的新方法。我添加了一个带有另一个参数的新方法。
但是我的默认实现不在其默认方法中使用新参数列表。从技术上讲,没有问题。但它是否正确使用默认方法?或者我应该将这个新方法保留为特定 class 因为我在默认实现中没有使用第二个参数。
注意:此处提供的字符串列表目前仅用于一种实现,但将来可用于其他实现。它不是很具体,也可以被其他实现使用。
这可能是对默认方法的误用。当 interfaces/contracts 随着新方法的发展时,默认方法可以促进向后兼容性,但您的问题是并非所有 IEntityParam
实现都关心 "contract" 的新版本。默认方法在概念上是接口契约的一部分。
解决您当前需求的正常方法是扩展接口:
public interface IEntityParam {
public void validateParam(Object object);
}
public interface IEntityParamExtended extends IEntityParam {
public default void validateParam(Object object,List<String> Str);
}
这样,需要第二种方法的 class 将实现 IEntityParamExtended
并为这两种方法提供实现;而 IEntityParam
的所有其他实现不受影响。
将来,当 IEntityParamExtended
需要提升到 IEntityParam
时(即,当新方法构成 IEntityParam
契约的一部分时),您可以使用 default
方法以避免强制更改和重新编译所有现有实现。