我有一个类,它只包含静态成员变量和静态方法。本质上,它充当一个通用工具类。
一个仅包含静态成员变量和静态方法的类是不是不好的实践?
实用方法通常放置在只有静态方法的类中(例如StringUtils
)。全局常量也被放置在它们自己的类中,以便可以被代码的其余部分导入(public final static
属性)。
这两种用法非常普遍,并且具有私有默认构造函数,以防止它们被实例化。声明类为final可以防止尝试覆盖静态方法的错误。
如果您所说的静态成员变量
并不是全局常量,您可能希望将访问这些变量的方法放置在它们自己的类中。在这种情况下,您能否详细说明这些变量在您的代码中的作用?
这通常是实用类的设计方式,没有任何问题。著名的例子包括 o.a.c.l.StringUtils
, o.a.c.d.DbUtils
, o.s.w.b.ServletRequestUtils
等。
来自TSLint文档:
来自Java风格的面向对象语言的用户可能会将其实用函数包装在额外的类中,而不是将它们放在顶层。
最好的方法是使用常量,像这样:
export const Util = {
print (data: string): void {
console.log(data)
}
}
此规则的错误代码示例:
class EmptyClass {}
class ConstructorOnly {
constructor() {
foo();
}
}
// Use an object instead:
class StaticOnly {
static version = 42;
static hello() {
console.log('Hello, world!');
}
}
此规则的正确代码示例:
class EmptyClass extends SuperClass {}
class ParameterProperties {
constructor(public name: string) {}
}
const StaticOnly = {
version: 42,
hello() {
console.log('Hello, world!');
},
};
我不会为实用程序类包含静态方法而担心。
然而,静态成员本质上是全局数据,应该避免使用。如果它们用于缓存静态方法的结果等,可能是可接受的,但如果它们被用作“真正的”数据,可能会导致各种问题,例如隐藏的依赖和设置测试的困难。
java.lang.Math
是一个完全由静态方法组成的类,其构造函数为private
(无法实例化)。 - Asaph