如何创建实用程序类?

时间:2014-08-09 22:10:49

标签: java utility utility-method

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

public class Util {

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

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

}

创建实用程序类的最佳方法是什么?

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

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

我什么都不做?

4 个答案:

答案 0 :(得分:91)

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

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

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

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

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

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

该类不应包含任何非final / non-static类字段。

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

示例:

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;
    }
}

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

答案 1 :(得分:11)

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

不推荐标记类摘要,因为 abstract 建议读者将该类设计为继承。

答案 2 :(得分:7)

我会创建课程final,每个方法都是static

因此无法扩展类,Classname.methodName可以调用这些方法。如果您添加成员,请确保它们可以线程安全;)

答案 3 :(得分:4)

使类abstract向您的代码的读者发送一条消息,您希望abstract类的用户将其子类化。但是,这不是您想要做的事情:实用程序类不应该是子类。

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