所以我理解静态方法或字段是什么,我只是想知道何时使用它们.也就是说,在编写代码时,设计适合使用静态方法和字段.
一种常见的模式是使用静态方法作为静态工厂,但这可以通过重载构造函数来轻松完成.正确?例如:
var bmp = System.Drawing.Bitmap.LoadFromFile("Image01.jpg");
至于静态场,是否最好使用singelton-objects?
静态方法通常对不需要来自类实例(来自this
)的任何数据的操作有用,并且可以仅使用其参数来执行其预期目的.
一个简单的例子Point::distance(Point a, Point b);
就是计算两点之间距离而不需要实例的方法.
对于不会经常更改并且由类的所有实例使用的常量,静态字段非常有用.
当您使用静态工厂时,它可以更好地了解意图 - 它还允许您拥有采用相同参数类型但具有不同含义的不同工厂.例如,假设Bitmap有LoadFromResource(字符串) - 不可能有两个构造函数都接受字符串.
编辑:来自stevemegson的评论
静态工厂也可以返回null,并且可以更容易地返回从缓存中获取的实例.我的许多类都有一个静态FromId(int)来从主键获取实例,如果有的话,返回一个现有的缓存实例.
我会说,只要你有独立于实例状态的函数,就使用静态方法.不依赖于任何实例字段.
方法所依赖的非本地状态越少,理解起来就越容易,因此static
对于代码的读者来说是一个有用的信号.
我通过记住实例方法在单个对象上/内部工作而保持清晰,而静态方法为类做了一些事情.
在LoadFromFile()的情况下,您需要一个静态方法,因为如果加载失败,您需要空引用 - 该实例尚不存在.如果您将其实现为构造函数,则必须在失败时抛出异常.
静态的其他好用途:比较(obj a,obj b),删除(obj a)数据对象(一个对象不能删除自己,因为它的引用仍然存在),或者静态类用于过程代码,这是真的不能在一个物体中建模.