想象一下完全不可变的任何Java类。我将使用以下示例:
public class Point2D {
public final int x;
public final int y;
public Point2D(final int x, final int y) {
this.x = x;
this.y = y;
}
}
现在考虑在此类上添加一个运算符:一个接受一个或多个
Point2D
实例并返回一个新的Point2D
的方法。这样做有两种可能性-静态方法或实例方法:
public static Point2D add(final Point2D first, final Point2D second) {
return new Point2D(first.x + second.x, first.y + second.y);
}
要么
public Point2D add(final Point2D other) {
return new Point2D(this.x + other.x, this.y + other.y);
}
有什么理由选择另一个吗?两者之间有什么区别吗?据我所知,它们的行为是相同的,因此任何差异都必须在于它们的效率或作为程序员使用它们的容易程度。
最佳答案
使用静态方法可以防止两件事:
视情况而定,这些事情可能还可以,但从长远来看,它们也会带来严重的悲伤。
因此,就我个人而言,仅在确实有充分理由时才使用静态。
尽管如此,给定问题中特定的Point2D类,我倾向于实际使用静态方法。该类闻起来像应该具有“值”语义,以便相同坐标的两个点相等并且具有相同的哈希码。我也看不到您将如何有意义地扩展此类。
假设有一个Matrix2D类。在那里考虑子类可能很有意义,例如,SparseMatrix。然后,很可能您想覆盖计算密集型方法!