【问题标题】:Performance impact on Class Loading VS Interface Loading in Java 8Java 8 中对类加载 VS 接口加载的性能影响
【发布时间】:2017-09-14 06:53:42
【问题描述】:

我想创建一个跨多个类的通用功能。 所以我有两种方法。 1)创建一个新类并在其中包含一个静态方法。 2) 创建一个新接口并在其中包含一个具体的静态方法。

谁能解释这两种方法在性能方面的差异? 请同时考虑内存和处理影响。

我应该选择哪种方法以及为什么?

【问题讨论】:

  • Create a new method and have a concrete static method in it?什么?
  • 我假设您的实际意思是“2)创建一个新的接口并在其中包含一个具体的静态方法。”在这种情况下,没有理由应该有任何显着的性能差异。
  • 更正了问题。谢谢尤金和霍尔格。

标签: class interface java-8 static-methods


【解决方案1】:

在性能方面它应该无关紧要,这意味着即使它是,它也会非常小;所以这永远不会影响你的决定。

另一方面,使用静态方法定义接口仅用于公共代码是 IMO 的一大代码异味。接口中的静态方法通常被定义为返回该接口的一个实例;我倾向于将它们视为通常返回自身实例的静态工厂方法,例如Predicate#isEqual:

static <T> Predicate<T> isEqual(Object targetRef) {
    return (null == targetRef)
            ? Objects::isNull
            : object -> targetRef.equals(object);
}

除了接口的目的还有待扩展,如果你在里面写一个简单的静态方法,你有点违反了这个规则。

另外一个问题是当你在一个接口中定义一个静态方法时,扩展这个接口的类不能使用那个方法。例如,与默认方法不同。所以如果你有一个接口:

interface Test {
    public static String test() {
        return "";
    }

    public default String testAgain() {
        return "";
    }
}

还有一个扩展这个接口的类TestImpl,比:

 TestImpl ti = new TestImpl();
 ti.testAgain();
 ti.test(); // will not compile

因此,您可能可以使用默认方法而不是静态方法。我有时喜欢这样做,因为它使代码更接近我需要的地方:如果某个类实现了一个带有 default method 的接口 - 代码就在那里,我不需要使用外部类。

另一方面,静态实用程序类遍布整个 jdk,例如 CollectionsStreamsSpliterators,如果我在你的鞋子里,我会使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    相关资源
    最近更新 更多