接口中的默认方法 - 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 方法以避免强制更改和重新编译所有现有实现。