接口中的默认方法-Java

时间:2019-07-04 06:40:36

标签: java methods interface 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是一个非常老的接口,由许多类扩展,并且我需要其中的新方法。我在另一个参数中添加了新方法。 但是我的默认实现未在其默认方法中使用新参数List。从技术上讲,没有问题。但是使用默认方法是否正确?还是应该将此新方法保留给特定类,因为我没有在默认实现中使用第二个参数。

注意:此处提供的String列表目前仅在一个实现中使用,但将来可以在其他实现中使用。它不是很具体,也可以由其他实现使用。

1 个答案:

答案 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} }避免强制更改和重新编译所有现有实现的方法。