我想创建一个包含实用方法的类,例如
public class Util {
public static void f (int i) {...}
public static int g (int i, int j) {...}
}
创建一个工具类的最佳方法是什么?
我应该使用私有构造函数吗?
我应该将工具类设置为抽象类吗?
我应该什么都不做吗?
我想创建一个包含实用方法的类,例如
public class Util {
public static void f (int i) {...}
public static int g (int i, int j) {...}
}
创建一个工具类的最佳方法是什么?
我应该使用私有构造函数吗?
我应该将工具类设置为抽象类吗?
我应该什么都不做吗?
对于一个完全无状态的Java实用类,我建议将该类声明为public
和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;
}
}
或许最重要的是,每种方法的文档应该精确而且描述准确。这个类中的方法很可能会被经常使用,因此拥有高质量的文档来补充代码是很好的。
AssertionError
并非严格必要,但它提供了保险,以防构造函数意外地从类内部调用。” - Leponzofinal
,并且所有方法都是static
的。这样这个类就不能被扩展了,而这些方法可以通过Classname.methodName
来调用。如果你添加成员,请确保它们是线程安全的;)abstract
类会向代码读者传递一个信息,即您希望使用该 abstract
类的用户进行子类化。然而,如果您不希望用户这样做,则应该避免这种情况:实用程序类不应该被子类化。final
,以禁止对实用程序类进行子类化。