> 例如我可以把对象的许多方法都写成静态方法当做工具来使用。但是却不知道什么时候才应该这样做。
大约在一年之前,我也存在类似的困惑。当时我把所有的工具方法都写成静态的。
现在我会判断某个方法是否确定不会改变,如果是这样,我才把它写成静态的。
比如我有一个方法getFirstDayOfWeek得到本周的第一天,那么无论用在什么地方它都不会变化,所以它应该是一个静态的方法。
又例如一年以前我写了一个将数据导出为execl的工具类。该类只有一个静态方法,长度超过100行。后来我对其进行重构,将长方法分解为多个小的方法。然后将在多个方法间传递的变量提取出来,变为类的实例变量(instance variable),再将这些小方法改为非静态的。现在,我只需要改写(override)其中的小方法,就可以方便的定制输出为execl时的属性,比如字体、格式等。
也就是说,如果工具方法有可能需要修改时,不要使用静态方法。如果你无法判断一个方法子类是否需要改写它,可以申明为final,这样将来修改时也方便。面向对象的核心就是多态,所以尽量少用静态方法。