如何使用实用程序类对最终类进行分组,而不是扩展类?

时间:2013-05-21 07:31:39

标签: java class-design effective-java

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

  

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

有人可以解释这句话吗?

1 个答案:

答案 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,您无法在接口中声明静态方法。