66

我想用实用方法创建一个类,例如

public class Util {

   public static void f (int i) {...}

   public static int g (int i, int j) {...}

}

哪个是创建实用程序类的最佳方法?

我应该使用私有构造函数吗?

我应该为抽象类创建实用程序类吗?

我应该什么都不做吗?

4

4 回答 4

131

对于 Java 中完全无状态的实用程序类,我建议将该类声明为publicand final,并使用私有构造函数来防止实例化。关键字可以防止子类化,final并且可以提高运行时的效率。

该类应该包含所有static方法并且不应该被声明abstract(因为这意味着该类不是具体的并且必须以某种方式实现)。

该类的名称应与其提供的实用程序集相对应(如果该类要提供广泛的未分类实用程序,则为“Util”)。

该类不应包含嵌套类,除非嵌套类也是实用程序类(尽管这种做法可能很复杂并且会损害可读性)。

类中的方法应具有适当的名称。

仅由类本身使用的方法应该是私有的。

该类不应具有任何非最终/非静态类字段。

该类也可以由其他类静态导入以提高代码可读性(但这取决于项目的复杂性)。

例子:

public final class ExampleUtilities {
    // Example Utility method
    public static int foo(int i, int j) {
        int val;

        //Do stuff

        return val;
    }

    // Example Utility method overloaded
    public static float foo(float i, float j) {
        float val;

        //Do stuff

        return val;
    }

    // Example Utility method calling private method
    public static long bar(int p) {
        return hid(p) * hid(p);
    }

    // Example private method
    private static long hid(int i) {
        return i * 2 + 1;
    }
}

也许最重要的是,每种方法的文档都应该是准确和描述性的。很有可能会经常使用此类中的方法,并且有高质量的文档来补充代码是很好的。

于 2014-08-09T22:26:35.890 回答
19

根据 Joshua Bloch (Effective Java),你应该使用总是抛出异常的私有构造函数。这最终会阻止用户创建 util 类的实例。

不建议标记类抽象,因为抽象表明类是为继承而设计的。

于 2014-08-09T22:27:14.387 回答
8

我会上课final,每个方法都是static.

所以类不能被扩展,方法可以被调用Classname.methodName。如果您添加成员,请确保它们工作线程安全;)

于 2014-08-09T22:26:45.820 回答
5

创建类abstract会向代码的读者发送一条消息,即您希望abstract类的用户对其进行子类化。但是,这不是您想要做的:实用程序类不应该被子类化。

因此,在这里添加私有构造函数是一个更好的选择。您还应该使该类final禁止您的实用程序类的子类化。

于 2014-08-09T22:17:46.643 回答