我有一个仅包含静态成员变量和静态方法的类。本质上,它充当通用实用程序类。
只包含静态成员变量和静态方法的类是不好的做法吗?
我有一个仅包含静态成员变量和静态方法的类。本质上,它充当通用实用程序类。
只包含静态成员变量和静态方法的类是不好的做法吗?
Answers:
只要该类没有内部状态,并且本质上就是所谓的叶子类(实用程序类属于此类),也就是说,它独立于其他类。没事。
该Math
班是一个典型的例子。
静态方法不用担心(测试除外)。
通常,静态成员是一个问题。例如,如果您的应用是集群的怎么办?启动时间如何-正在进行哪种初始化?有关这些问题的更多信息,请查看Gilad Bracha的这篇文章。
还要注意,Java特别引入了静态导入:(http://en.wikipedia.org/wiki/Static_import)
静态导入是Java编程语言中引入的一项功能,该功能在类中定义为公共静态的成员(字段和方法)将在Java代码中使用,而无需指定定义字段的类。此功能已在5.0版本的语言中引入。
该功能提供了一种类型安全机制,可将常量包含在代码中,而不必引用最初定义该字段的类。它还有助于弃用创建常量接口的做法:仅定义常量然后编写实现该接口的类的接口,这被认为是对接口的不当使用[1]。
该机制可用于引用类的单个成员:
import static java.lang.Math.PI;
import static java.lang.Math.pow;
或类的所有静态成员:
import static java.lang.Math.*;
Java SDK中的Collections类仅具有静态成员。
因此,只要您有正当的理由,就可以使用它-这不是一个糟糕的设计
通常,这是实用程序类的设计方式,没有错。著名的例子包括o.a.c.l.StringUtils
,o.a.c.d.DbUtils
,o.s.w.b.ServletRequestUtils
,等。
根据对面向对象设计的严格解释,应该避免使用实用程序类。
问题是,如果您遵循严格的解释,那么您将需要将您的类强加到某种排序对象中才能完成许多事情。
甚至Java设计人员也创建实用程序类(想到了java.lang.Math)
您的选择是:
double distance = Math.sqrt(x*x + y*y); //using static utility class
vs:
RootCalculator mySquareRooter = new SquareRootCalculator();
mySquareRooter.setValueToRoot(x*x + y*y);
double distance;
try{
distance = mySquareRooter.getRoot();
}
catch InvalidParameterException ......yadda yadda yadda.
即使我们避免使用冗长的方法,我们仍然可能最终得到:
Mathemetician myMathD00d = new Mathemetician()
double distance = myMathD00d.sqrt(...);
在这种情况下,.sqrt()仍然是静态的,那么首先创建对象的意义是什么?
答案是,当您的其他选择是创建某种对实例变量没有用处或使用很少的人工“ Worker”类时,请创建实用程序类。
此链接http://java.dzone.com/articles/why-static-bad-and-how-avoid似乎与这里的大多数答案背道而驰。即使它不包含任何成员变量(即,没有状态),静态类仍然是一个坏主意,因为它无法被模拟或扩展(子类化),因此它违反了OO的某些原理
java.lang.Math
是带有private
构造函数的100%静态方法(无法实例化)。