我明白静态方法或字段的含义,但不确定何时使用它们。也就是说,在编写代码时,哪种设计适合使用静态方法和字段。
一种常见的模式是将静态方法用作静态工厂,但是这同样可以通过重载构造函数来完成。对吗?例如:
var bmp = System.Drawing.Bitmap.LoadFromFile("Image01.jpg");
对于静态字段而言,创建单例对象是它们最好的用法吗?
静态方法通常用于不需要从类的实例 (this
) 中获取任何数据并且可以仅使用它们的参数执行其预期目的的操作。
一个简单的例子是一个方法 Point::distance(Point a, Point b);
,它计算两个点之间的距离且不需要实例。
静态字段通常用于所有类实例都要使用的不经常更改的常量等情况下非常有用。
我认为,当您拥有与实例状态无关的函数时,即不依赖于任何实例字段时,请使用静态方法。
方法所依赖的非局部状态越少,理解起来就越容易,因此static
是代码读者的有用信号。
当您拥有一个不依赖于该类的特定对象的函数时,应使用静态方法。
添加“static”关键字不会造成任何损害:它不会破坏引用它的任何代码。因此,例如以下代码无论是否有“static”关键字都是有效的:
class Foo
{
public Foo(){}
public static void bar(){} // valid with or without 'static'
public void nonStatic(){ bar(); }
}
...
Foo a = new Foo();
a.bar();
class AbstractClass {
static createObject(int i) {
if (i==1) {
return new ConcreteClass1();
} else if (i==2) {
return new ConcreteClass2();
}
}
}
3) 当您控制或跟踪类的实例化数量时。单例是最常用的示例。
4) 声明常量时。
5) 操作,例如对类的多个对象进行排序或比较,并且不与任何特定实例相关联。
6) 在对象的第一次实例化之前必须进行特殊处理时。
当类的客户端没有实例可用时,您可以使用静态方法。例如,单例设计模式用于确保系统中只存在一个类的实例。它要求将单例的构造函数设置为私有,以便客户端无法创建实例。
那么,如果您无法创建实例,如何访问类的实例方法?通过调用返回类的单例实例的静态方法。
当然,这只是一种情况,还有许多其他情况。