2017-09-14 3 views
2

多くのクラスにわたって共通の機能を作成したいと考えています。 私は2つのアプローチがあります。 1)新しいクラスを作成し、そこに静的メソッドを追加します。 2)新しいインターフェイスを作成し、そこに具体的な静的メソッドを設定します。クラスローディングへのパフォーマンスの影響Javaでロードするインタフェース8

どちらの方法でも、パフォーマンスに関する違いを説明できますか? メモリと処理の両方の影響を考慮してください。

どのアプローチを選択する必要がありますか、その理由は何ですか?

+1

'新しいメソッドを作成し、それに具体的な静的メソッドを持っていますか? '何? – Eugene

+0

私はあなたが実際に "2)新しい**インターフェース**を作成し、そこに具体的な静的メソッドを持っていると仮定します"この場合、パフォーマンスに著しい違いがある理由はありません。 – Holger

+0

質問を修正しました。ユージンとホルガーに感謝します。 –

答えて

1

パフォーマンスは重要ではありません。つまり、たとえそうであっても非常に小さくなる可能性があります。これはあなたの決定を決して動かすべきではありません。

一方、共通コードにのみ使用される静的メソッドのインターフェイスを定義することは、大きなコードの匂いIMOです。インタフェース内の静的メソッドは通常、このインタフェースのインスタンスを返すように定義されています。私はstaticファクトリメソッドとしてそれらを見てする傾向があることPredicate#isEqualのような自分自身の通常戻りインスタンス:

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

インタフェースの目的は、あなたがそれ内部の単純な静的メソッドを記述する場合は、延長することがまだあることに加えて、あなたはそのルールを破るものです。

もう1つの問題は、インターフェイスで静的メソッドを定義すると、このインターフェイスを拡張するクラスはそのメソッドを使用できないということです。たとえば、デフォルトのメソッドとは異なります。

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のインターフェイスを実装していれば、そのコードはそこにあります。外部クラスを使う必要はありません。

一方、静的なユーティリティクラスはCollectionsStreamsまたはSpliteratorsのように、すべて例えばJDKの上に存在し、それは私があなたの靴にあった場合、私が使用するものです。

関連する問題