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 コンパイラが最初のバージョンを最適化して、2 番目のバージョンと同じくらい速く実行することは可能ですか? そして、これは実際に行われていますか?