如何创建实用程序类?

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

public class Util {


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


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


}

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

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

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

我应该袖手旁观吗?

156089 次浏览

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

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

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

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

这个类应该被赋予一个与它所提供的实用程序集相对应的名称(或者“ Util”,如果这个类要提供大量未分类的实用程序的话)。

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

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

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

该类不应该有任何非 final/非静态类字段。

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

例如:

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

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

我将使类 final和每个方法将是 static

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

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

不推荐标记类抽象,因为 摘要建议读者类是为继承而设计的。