2
約書亞布洛赫提到在他的著作(有效的Java - 第2版)在項目4: -實用程序類如何將最終類的方法分組,而不是擴展類?
只包含靜態字段和靜態方法(實用 類)類可用於分組方法上最後一堂課,而不是 擴展班。
任何人都可以解釋這句話嗎?
約書亞布洛赫提到在他的著作(有效的Java - 第2版)在項目4: -實用程序類如何將最終類的方法分組,而不是擴展類?
只包含靜態字段和靜態方法(實用 類)類可用於分組方法上最後一堂課,而不是 擴展班。
任何人都可以解釋這句話嗎?
一個常見的錯誤是(或希望是)創建一個包含常用方法的類,然後使用繼承以便能夠通過需要方法的類輕鬆訪問方法。
所以你會:
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語言設計人員使上述更吸引人的用法。一個是靜態進口的概念。另一個是使接口具有在其上定義的靜態方法的可行性。在這種情況下,上面會變成:
import static Utility.utilityMethod;
final interface Utility {
static utilityMethod() {
// do something useful
}
}
class Application {
someMethod() {
utilityMethod();
}
}
這是一個整體短了很多,尤其是因爲大多數的進口會被自動地由IDE處理。關於上面的更多討論/指針可以在here找到。請注意,直到幷包括Java 7,您都不能在接口中聲明靜態方法。