我想创建一个具有实用方法的类,例如
public class Util {
public static void f (int i) {...}
public static int g (int i, int j) {...}
}
创建实用程序类的最佳方法是什么?
我应该使用私有构造函数吗?
我应该为抽象类创建实用程序类吗?
我应该什么都不做吗?
对于Java中完全无状态的实用程序类,我建议将该类声明为public
和final
,并具有私有构造函数以防止实例化。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;
}
}
也许最重要的是,每个方法的文档应该是精确的和描述性的。该类中的方法很可能会被经常使用,并且最好有高质量的文档来补充代码。
根据Joshua Bloch (Effective Java)的说法,你应该使用总是抛出异常的私有构造函数。这将最终阻止用户创建util类的实例。
不建议将类标记为抽象,因为is abstract暗示读者类是为继承而设计的。我将使类为final
,每个方法将为static
。
所以类不能被扩展,方法可以被Classname.methodName
调用。如果添加成员,请确保它们线程安全;)
创建abstract
类会向代码的读者发送一条消息,表示您希望abstract
类的用户创建它的子类。然而,这不是你想要的:一个实用程序类不应该被子类化。
final
类禁止子类化您的实用程序类。