多くのクラスにわたって共通の機能を作成したいと考えています。 私は2つのアプローチがあります。 1)新しいクラスを作成し、そこに静的メソッドを追加します。 2)新しいインターフェイスを作成し、そこに具体的な静的メソッドを設定します。クラスローディングへのパフォーマンスの影響Javaでロードするインタフェース8
どちらの方法でも、パフォーマンスに関する違いを説明できますか? メモリと処理の両方の影響を考慮してください。
どのアプローチを選択する必要がありますか、その理由は何ですか?
多くのクラスにわたって共通の機能を作成したいと考えています。 私は2つのアプローチがあります。 1)新しいクラスを作成し、そこに静的メソッドを追加します。 2)新しいインターフェイスを作成し、そこに具体的な静的メソッドを設定します。クラスローディングへのパフォーマンスの影響Javaでロードするインタフェース8
どちらの方法でも、パフォーマンスに関する違いを説明できますか? メモリと処理の両方の影響を考慮してください。
どのアプローチを選択する必要がありますか、その理由は何ですか?
パフォーマンスは重要ではありません。つまり、たとえそうであっても非常に小さくなる可能性があります。これはあなたの決定を決して動かすべきではありません。
一方、共通コードにのみ使用される静的メソッドのインターフェイスを定義することは、大きなコードの匂い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
のインターフェイスを実装していれば、そのコードはそこにあります。外部クラスを使う必要はありません。
一方、静的なユーティリティクラスはCollections
、Streams
またはSpliterators
のように、すべて例えばJDKの上に存在し、それは私があなたの靴にあった場合、私が使用するものです。
'新しいメソッドを作成し、それに具体的な静的メソッドを持っていますか? '何? – Eugene
私はあなたが実際に "2)新しい**インターフェース**を作成し、そこに具体的な静的メソッドを持っていると仮定します"この場合、パフォーマンスに著しい違いがある理由はありません。 – Holger
質問を修正しました。ユージンとホルガーに感謝します。 –