Joshua Bloch在第4项中的书( Effective Java - 2nd Ed )中提及: -
只包含静态字段和静态方法的类(实用程序 classes)可用于对最终类的方法进行分组,而不是 扩展课程。
有人可以解释这句话吗?
答案 0 :(得分:1)
一个常见的错误是(或者,希望是)创建一个包含常见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语言设计人员正在使用多种方法来使上述内容更具吸引力。一个是静态导入的概念。另一个是使接口可以定义静态方法。在这种情况下,上述将成为:
import static Utility.utilityMethod;
final interface Utility {
static utilityMethod() {
// do something useful
}
}
class Application {
someMethod() {
utilityMethod();
}
}
这要短得多,特别是因为大多数导入都是由IDE自动处理的。可以找到关于上述的更多讨论/指针here。请注意,直到并包括Java 7,您无法在接口中声明静态方法。