我想用实用方法创建一个类,例如
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
and 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;
}
}
也许最重要的是,每种方法的文档都应该是准确和描述性的。很有可能会经常使用此类中的方法,并且有高质量的文档来补充代码是很好的。
根据 Joshua Bloch (Effective Java),你应该使用总是抛出异常的私有构造函数。这最终会阻止用户创建 util 类的实例。
不建议标记类抽象,因为抽象表明类是为继承而设计的。
我会上课final
,每个方法都是static
.
所以类不能被扩展,方法可以被调用Classname.methodName
。如果您添加成员,请确保它们工作线程安全;)
创建类abstract
会向代码的读者发送一条消息,即您希望abstract
类的用户对其进行子类化。但是,这不是您想要做的:实用程序类不应该被子类化。
因此,在这里添加私有构造函数是一个更好的选择。您还应该使该类final
禁止您的实用程序类的子类化。