Joshua Bloch は、彼の著書 ( Effective Java - 2nd Ed ) の項目 4で言及しています。
クラスを拡張する代わりに、静的フィールドと静的メソッドのみを含むクラス (ユーティリティ クラス) を使用して、最終クラスのメソッドをグループ化できます。
この文を説明できる人はいますか?
Joshua Bloch は、彼の著書 ( Effective Java - 2nd Ed ) の項目 4で言及しています。
クラスを拡張する代わりに、静的フィールドと静的メソッドのみを含むクラス (ユーティリティ クラス) を使用して、最終クラスのメソッドをグループ化できます。
この文を説明できる人はいますか?
共通のstatic
メソッドを含むクラスを作成し、継承を使用して、メソッドを必要とするクラスがメソッドに簡単にアクセスできるようにすることは、よくある間違いです (または、できればそうでした)。
したがって、次のようになります。
class Utility {
static utilityMethod() {
// do something usefull
}
}
class Application extends Utility {
someMethod() {
utilityMethod();
}
}
ただし、これはオブジェクト指向の原則を破るものApplicationClass
であり、UtilityClass
. 代わりに、次を使用する必要があります。
final class Utility {
Utility() {
// avoid instantiation
}
static utilityMethod() {
// do something useful
}
}
class Application {
someMethod() {
UtilityClass.utilityMethod();
}
}
現在、Java 言語設計者が上記をより使いやすくするために使用している方法がいくつかあります。1 つは、静的インポートの概念です。もう 1 つは、インターフェイスに静的メソッドを定義できるようにすることです。その場合、上記は次のようになります。
import static Utility.utilityMethod;
final interface Utility {
static utilityMethod() {
// do something useful
}
}
class Application {
someMethod() {
utilityMethod();
}
}
特にほとんどのインポートはIDEによって自動的に処理されるため、これははるかに短くなります。上記に関するその他の議論/指針については、こちらを参照してください。Java 7 までは、インターフェイスで静的メソッドを宣言できないことに注意してください。