0

Java 缺乏为静态方法指定接口的能力。接口中的方法必须是非静态的。这使得无法为类指定要求。相反,仅限于指定对象的要求。这也使得不可能在接口中指定单例功能,因为在 Java 中,单例模式需要作为静态方法来实现。是一篇很好的文章,它解释了它,但它只有德语。

当一个人被迫将某些东西实现为对象的功能而不是类的功能时,必须先创建该对象的实例,然后才能使用该功能。但是这样的对象有一些特殊的特性:它没有状态,因为类功能也没有状态。理论上,没有数据的对象的实例创建可以优化为NOP,因为所有方法都可以链接到类而不是任何对象。Java 可以实现某种隐式单例功能。

但这实际上是如何处理的?

考虑某种没有任何状态的功能。

interface Adder<T> { T add(T ... arguments); }

基本上,将其实现为静态方法就足够了:

class IntegerAdder implements Adder<Integer> {
   public static Integer add (Integer ... arguments) { }
}

但是因为 Java 不允许静态接口方法,所以它必须以非静态方式实现。结果是,当需要时IntegerAdder,必须创建一个实例。

IntegerAdder integer_adder = new IntegerAdder();
Integer a = 1;
Integer b = 2;
Integer c = integer_adder.add (1, 2);

我担心这可能比没有创建实例的版本慢:

Integer a = 1;
Integer b = 2;
Integer c = IntegerAdder.add (1, 2);

但实际上慢了多少?Java 编译器是否有可能以与第二个版本一样快的方式优化第一个版本?这真的完成了吗?

4

1 回答 1

1

您可以一次创建 IntegerAdder 的实例并重用它,它是线程安全的。还要注意Integer ... arguments导致 1) 使用对象而不是原始整数 2) 创建一个数组来传递参数。如果性能受到关注,这两件事都应该避免

于 2013-11-06T10:23:22.103 回答