何时使用静态方法
一个 stackoverflow 上面的问题、一个高赞的回答也是比较认可的答案
调用此方法是否有意义,即使尚未构造任何对象
假设 Car 类中有如下方法
public class Car {
double convertMpgToKpl(double mpg){
........
}
}
那么这个方法将是静态的、因为将 Mpg 转换为 Kpl 我们不需要创建 Car
void setMileage(double mpg)
但是该方法不能是静态的、因为该方法的功能是为 Car 对象某个属性赋值。
但是总有一些特殊情况、既可以是静态也可以是非静态、比如比较两个对象的某项属性哪个更好
Car theMoreEfficientOf(Car c1, Car c2)
这个方法可以转换为非静态方法、但是也会有人说、由于没有特权选择哪个 Car 更加重要、因此不能强迫调用调用者选择一个 Car 作为调用方法的对象。不过这种情况只占用静态方法的一小部分。
我个人是更加这种比较类型的方法是非静态的
public interface Comparable<T> {
public int compareTo(T o);
}
对象去实现 Comparable
接口
看下 LocalDate
https://stackoverflow.com/questions/2671496/when-to-use-static-methods
静态方法的缺点
- 难以扩展(失去继承)
- 难以测试(mock、虽然一些测试框架支持mock静态方法)
https://groups.google.com/g/pongba/c/wmGp49aacoc?pli=1
纯函数
- 如果函数的调用参数相同,则永远返回相同的结果。它不依赖于程序执行期间函数外部任何状态或数据的变化,必须只依赖于其输入参数。
- 该函数不会产生任何可观察的副作用,例如网络请求,输入和输出设备或数据突变(mutation)
这个概念以前没听过、最近是在 JS 中看到的。Java 应该是没有这个概念的吧
最后
最近公共库的建立、讨论到什么时候用到静态方法、静态方法有啥不好等。
如果只有纯函数才能成为静态方法的话、我个人认为是太苛刻了、比如说文件工具类。
但是后续在编写静态方法的时候可能会考虑该方法是否真的适合作为静态方法。