【问题标题】:Is putting static methods in interfaces a good practice?将静态方法放在接口中是一种好习惯吗?
【发布时间】:2019-11-20 09:41:15
【问题描述】:

假设我的班级 Difficulty 中有一个方法 getAverageDifficulty,如下所示:

public static Float getAverageDifficulty (List<Difficulty> difficultyList) {

    ...
    return average;

}

我的方法显然需要是静态的,因为需要Difficulty 的实例是没有意义的。现在假设我正在使用一个接口IDifficulty,所以我可以稍后更改我的实现。显然,我确实希望我的getAverageDifficulty 方法可以从IDifficulty 获得,并且由于我不能声明静态方法抽象,显而易见的选择是将getAverageDifficulty 直接放在我的界面中。我的问题是:我把那个静态方法放在我的界面中是否犯了一个错误,其中包含其他等待实现的Difficulty 方法?我不应该混合静态和“普通”接口抽象方法吗?我应该创建DifficultyHelper 类并将我的方法放在那里吗?

【问题讨论】:

  • 你可以只使用流来获取平均值
  • 我会把它放在一个 utils 或 helper 类中。把它放在你的难度界面是没有意义的,因为它不依赖于难度。本质上,如果您要称其为不难的任何地方,那么将其放在那里是没有意义的
  • 没有好的做法。在特定情况下只有最好的,并且可能有多个答案,都一样好。
  • Matthew 我的意思是,它有点依赖难度,因为它需要一个难度列表作为参数
  • 我会使用辅助类。考虑这一点的一种方法是,该方法提供了想要附加到类型“List”的行为,但该类型不是显式可用的。 (顺便说一句:参数类型可能应该是 'Collection extends Difficulty>'。)请注意,示例方法与接口上的默认方法具有不同的特征。

标签: java methods interface static


【解决方案1】:

归根结底,这是风格问题。但是,如果帮助类的唯一目的是保存这个方法(可能还有一些类似的方法),那么您将通过将它们放在接口中来为自己保存一个类定义:

从 Java 8 开始,接口不能包含静态方法的限制已被消除,因此通常没有理由为接口提供不可实例化的伴随类 [Effective Java,第 3 版]。

【讨论】:

    【解决方案2】:

    接口中的静态方法类似于默认方法,只是我们不能在实现这些接口的类中重写这些方法。所以在我看来,除非你想防止重写,否则没有必要在接口中编写静态方法。

    【讨论】:

    • 是的,但问题是我的 Difficulty.class 在我的下一层中不可见,因为我只使用接口,所以我可以确保层之间的解耦,所以我不会能够使用该方法。所以我需要在 IDifficulty.class 或 utils 类中使用该方法
    • 默认方法是实例方法。差异超出了覆盖的能力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2013-10-14
    • 2022-08-05
    • 2018-09-26
    • 1970-01-01
    相关资源
    最近更新 更多