如何创建实用程序类?

use*_*979 50 java utility utility-method

我想创建一个带有实用程序方法的类

public class Util {

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

我什么都不做?

ini*_*mfs 101

对于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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我要强调的是,质量文档意味着完整的JavaDoc注释,而不是代码注释. (3认同)
  • @initramfs这是一个很好的答案,但你可以根据你写的内容调整你的例子,使其一致!? (2认同)

mic*_*ldo 15

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

不推荐标记类抽象,因为抽象表明读者该类是为继承而设计的.

  • @JohnnyFive 应该抛出异常,甚至 AssertionError ,因为通过使用反射,您仍然可以访问私有构造函数。通过抛出异常或错误,您可以保证无法创建该类的任何实例。 (2认同)

duf*_*356 8

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

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


das*_*ght 5

创建一个类会abstract向您的代码阅读器发送一条消息,告知您希望abstract该类的用户将其子类化。但是,这不是您要执行的操作:不应对实用程序类进行子类化。

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