初めてのライブラリを作成しようとしていますが、まだ設計上の問題がいくつかあります。
私のライブラリは、インターフェイスとデフォルト クラスを作成した多くの構成を想定していますImpl
が、現在、私のライブラリは外部呼び出しとの多くの対話を必要としています。これもインターフェイスを介して行われますが、ユーザーは、デフォルトのフォルトやnull
. これらすべての「できるが、実装する必要はない」部分をよりオプションにするより良い方法はありますか?
初めてのライブラリを作成しようとしていますが、まだ設計上の問題がいくつかあります。
私のライブラリは、インターフェイスとデフォルト クラスを作成した多くの構成を想定していますImpl
が、現在、私のライブラリは外部呼び出しとの多くの対話を必要としています。これもインターフェイスを介して行われますが、ユーザーは、デフォルトのフォルトやnull
. これらすべての「できるが、実装する必要はない」部分をよりオプションにするより良い方法はありますか?
インターフェイスを作成する場合でも、多くの場合、ライブラリのユーザーがインターフェイスを実装するために拡張できる抽象基本クラスを作成することも理にかなっています。
抽象基本クラスはメソッドの既定の実装を提供できるため、ライブラリ ユーザーはこれらを自分で作成する必要はありません。また、具体的なサブクラスを作成する場合にAPI ユーザーが実装する必要がある抽象メソッドを定義することもできます。
public abstract class MyBaseClass implements MyInterface {
// abstract method
// anyone who extends must implement this
public abstract void myMethod1();
// default error implementation
// overriding is optional, but if used it will throw an error
public void myMethod2() {
throw new UnsupportedOperationException();
}
// default implementation that subclasses may find useful:
public void doBothMethods() {
myMethod1();
myMethod2();
}
}
これは確かに、理想的なアプローチがなかった領域です。それはそのように認識されており、公的弁護者の方法を使用して対処されています。リンクをクリックすると、(公式の) 言語強化の提案が表示されます。
したがって、インターフェイスに固執し、静的ライブラリ メソッドを使用して各メソッドのデフォルトの実装を提供することをお勧めします。そうすれば、おいしい防御方法の利点が利用可能になったときに準備が整います。