在相同 class 的实例方法中使用静态方法
Use static method inside instance method of the same class
假设我有一个 class Point
。
我想给用户一个方便计算2Point
s之间距离的工具,所以我写了方法:
static float distance (Point p1, Point p2)
现在,我还想给用户一个工具,让他可以直接计算他已经实例化的一个 Point
和另一个 Point
:
之间的距离
float distance (Point p)
在实例方法 distance(Point)
中使用静态方法 distance(Point, Point)
是个好主意吗?类似于:
float distance (Point p){
return Point.distance(this, p);
}
这样我就可以重用代码。
如果这是一件糟糕的事情,我为什么要避免这样做?
很多人都在争论静态方法在可测试性方面的一般优缺点,我同意其中的大部分内容。所以我不打算详细说明,只是回答你的问题:
- 避免代码重复是个好主意,那就去做吧。
- 我会反其道而行之,如果你坚持保留静态方法(我会取消它),从静态实用方法调用
p1.distance(p2)
并将计算逻辑放入非静态方法).我会说有充分的理由问 "hey, I have got this point p1, give me its distance to p2"。我看不出使用静态方法如何变得更容易。无论如何你需要提供两个 Point
实例,没有实例你什么都做不了,那么为什么首先要让它成为静态的呢?
假设我有一个 class Point
。
我想给用户一个方便计算2Point
s之间距离的工具,所以我写了方法:
static float distance (Point p1, Point p2)
现在,我还想给用户一个工具,让他可以直接计算他已经实例化的一个 Point
和另一个 Point
:
float distance (Point p)
在实例方法 distance(Point)
中使用静态方法 distance(Point, Point)
是个好主意吗?类似于:
float distance (Point p){
return Point.distance(this, p);
}
这样我就可以重用代码。
如果这是一件糟糕的事情,我为什么要避免这样做?
很多人都在争论静态方法在可测试性方面的一般优缺点,我同意其中的大部分内容。所以我不打算详细说明,只是回答你的问题:
- 避免代码重复是个好主意,那就去做吧。
- 我会反其道而行之,如果你坚持保留静态方法(我会取消它),从静态实用方法调用
p1.distance(p2)
并将计算逻辑放入非静态方法).我会说有充分的理由问 "hey, I have got this point p1, give me its distance to p2"。我看不出使用静态方法如何变得更容易。无论如何你需要提供两个Point
实例,没有实例你什么都做不了,那么为什么首先要让它成为静态的呢?