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 语言设计者正在使用几种方法来使上述内容更具吸引力。一是静态导入的概念。另一个是使接口可以在其上定义静态方法。在这种情况下,上述内容将变为:
import static Utility.utilityMethod;
final interface Utility {
static utilityMethod() {
// do something useful
}
}
class Application {
someMethod() {
utilityMethod();
}
}
这要短得多,尤其是因为大多数导入都是由 IDE 自动处理的。可以在此处找到有关上述内容的更多讨论/指示。请注意,在 Java 7 之前(包括 Java 7),您不能在接口中声明静态方法。