【问题标题】:Default Method in Interface - Java接口中的默认方法 - Java
【发布时间】:2019-11-14 20:15:47
【问题描述】:
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 。从技术上讲,没有问题。但它是否正确使用默认方法?或者我应该将这个新方法保留在特定的类中,因为我没有在默认实现中使用第二个参数。

注意:此处提供的字符串列表目前仅用于一种实现,但将来可用于其他实现。它不是很具体,也可以被其他实现使用。

【问题讨论】:

  • IEntityParam而言,这个默认的方法没有意义。
  • 我宁愿使用新方法validateParam(Object object,List&lt;String&gt; Str) 创建另一个类,并在需要使用其新方法的任何地方扩展该类。而不是像你提到的那样修改已经在很多地方使用的现有接口。
  • 添加到@ernest_k 非常令人困惑和误导
  • 这是一个肮脏的解决方法,因为您不想因为新接口而更改多个类,但是可以发挥作用的解决方法尽可能好。我宁愿将所有类都调整为新的(相关)方法,也不愿这样做,因为重构代码是现代 IDE 的一大优势,但这只是个人意见。
  • 要回答你的问题,我需要看看这个接口在重构之后是如何使用的。即,您如何决定在给定实例上调用两种方法中的哪一种?

标签: java methods interface default


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-13
    • 2018-01-28
    • 2011-04-18
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 2021-06-02
    相关资源
    最近更新 更多