import java.util.List;
public interface IEntityParam {
public void validateParam(Object object);
public default void validateParam(Object object,List<String> Str){
validateParam(object);
}
}
仮定IEntityParam
非常に古いインターフェースは、多くのクラスによって拡張し、私はそれで新しい方法を必要としています。私は別のパラメータを使用して、新しいメソッドが追加されました。しかし、私のデフォルトの実装はデフォルトの方法では、新たなパラメータリストを使用していません。技術的には、問題はありません。しかし、それは、デフォルトメソッドの正しい使用ですか?私はデフォルトの実装の2番目のパラメータを使用していないとして、あるいは万一私は特定のクラスに、この新しい方法を保ちます。
注:ここに供給されている文字列のリストは、今単に1つの実装で使用されているが、将来的には他の実装で使用することができます。それは非常に具体的ではなく、同様に他の実装で使用することができます。
これはおそらく、デフォルトメソッドの誤用です。デフォルトの方法は、インタフェース/契約が新しい方法で進化するときの下位互換性を促進することが知られているが、あなたの場合は問題はない、すべてのことですされているIEntityParam
実装は、「契約」の新バージョンを気に。デフォルトの方法は、概念的インターフェースの契約の一部です。
あなたの現在の必要性に対処するための通常の方法では、インターフェイスを拡張することです:
public interface IEntityParam {
public void validateParam(Object object);
}
public interface IEntityParamExtended extends IEntityParam {
public default void validateParam(Object object,List<String> Str);
}
実装する第二の方法を必要とするこの方法で、あなたのクラスIEntityParamExtended
やメソッドの両方の実装を提供します。他のすべてのimplemnetationsはしながら、IEntityParam
影響を受けません。
将来的にIEntityParamExtended
ニーズがに昇格するIEntityParam
(すなわち、時に新しいメソッドフォームの一部IEntityParam
の契約)は、使用することができますdefault
変更して再コンパイルするために、すべての既存の実装を強制することを避けるために方法を。