2

Joshua Bloch 在他的书(Effective Java - 2nd Ed第 4 项中提到:-

仅包含静态字段和静态方法(实用程序类)的类可用于对最终类上的方法进行分组,而不是扩展类。

谁能解释一下这句话?

4

1 回答 1

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 自动处理的。可以在此处找到有关上述内容的更多讨论/指示。请注意,在 Java 7 之前(包括 Java 7),您不能在接口中声明静态方法。

于 2013-06-22T10:21:32.160 回答