我想用实用方法创建一个类,例如
public class Util {
public static void f (int i) {...}
public static int g (int i, int j) {...}
}
创建实用程序类的最佳方法是什么?
我应该使用私有构造函数吗?
我应该为抽象类创建实用程序类吗?
我什么都不做?
答案 0 :(得分:91)
对于Java中完全无状态的实用程序类,我建议将类声明为public
和final
,并使用私有构造函数来防止实例化。 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
禁止对实用程序类进行子类化。