首页 > 解决方案 > 接口中的默认方法 - 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 列表目前仅用于一种实现,但将来可用于其他实现。它不是很具体,也可以被其他实现使用。

标签: javamethodsinterfacedefault

解决方案


这可能是对默认方法的滥用。当接口/合同随着新方法发展时,默认方法可以促进向后兼容性,但在您的情况下,问题是并非所有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方法来避免强制更改和重新编译所有现有实现。


推荐阅读