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 编译器是否有可能以与第二个版本一样快的方式优化第一个版本?这真的完成了吗?